使用 awk 命令观看

use*_*772 4 linux bash awk command-line watch

你如何看待一个命令?

awk 'NR%2==0 {printf "%s %8.0f", $1, $5}' filename.txt
Run Code Online (Sandbox Code Playgroud)

在此之前加上“watch”给出了这个错误:

awk: cmd. line:1: fatal: cannot open file `{printf' for reading (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

答案是:使用带有引号的参数的 watch 命令是通过将 $ 符号替换为 \$ 来对 $ 符号进行转义。但这给了我错误:

sh: -c: line 0: syntax error near unexpected token `('
                                                      sh: -c: line 0: 
Run Code Online (Sandbox Code Playgroud)

我想在对该问题的评论中提出这个问题,但没有足够的分数来发表评论。

在这种情况下,对他们有用的答案不起作用的类似问题:

1)https://askubuntu.com/questions/500217/how-to-properly-quote-piped-command-for-watch(答案再次转义$符号)。
2)、3) 和 4) 列在评论中,因为我不能在没有 10 点声誉的情况下发布超过 2 个链接。

Joh*_*024 8

有四种方法。

1. 将命令放在双引号中

双引号和美元符号都需要转义:

watch "awk 'NR%2==0 {printf \"%s %8.0f\", \$1, \$5}'" filename.txt
Run Code Online (Sandbox Code Playgroud)

2. 将命令放在单引号中

在单引号内,既不需要"也不$需要转义。但是,不能在单引号字符串中包含单引号。如果我们需要出现单引号,解决方法是结束单引号字符串并添加一个转义的单引号\'. 它看起来像这样:

watch 'awk '\''NR%2==0 {printf "%s %8.0f", $1, $5}'\' filename.txt
Run Code Online (Sandbox Code Playgroud)

3. 混合方法

结合以上两者,我们将字符串的第一部分放在双引号中,将第二部分放在单引号中:

watch "awk 'NR%2==0 {printf "'"%s %8.0f", $1, $5}'\' filename.txt
Run Code Online (Sandbox Code Playgroud)

4. 未加引号但完全转义

如果我们不将命令括在引号中,我们将需要转义所有需要的 shell 活动字符。这包括空格、引号、花括号和美元符号:

watch awk\ \'NR%2==0 \{printf\ \"%s\ %8.0f\",\ \$1,\ \$5\}\' filename.txt
Run Code Online (Sandbox Code Playgroud)

  • 我没有单击“接受”的原因是因为这些都不起作用,但我找到了一个解决方案,即将 awk 命令放入脚本中,然后观看脚本。我可以写一个关于这个的答案。 (2认同)