web-dev-qa-db-ja.com

awkコマンドで見る

どのようにコマンドを見るのですか?

awk 'NR%2==0 {printf "%s %8.0f", $1, $5}' filename.txt

これの前に「watch」を付けると、次のエラーが発生します。

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

答え: 引用符を含む引数を指定してwatchコマンドを使用する は、$記号を\ $に置き換えることでエスケープすることでした。しかし、それは私にエラーを与えます:

sh: -c: line 0: syntax error near unexpected token `('
                                                      sh: -c: line 0: 

その質問へのコメントでこれを聞きたかったのですが、コメントするのに十分なポイントがありませんでした。

この場合、彼らのために働いた答えがうまくいかなかった同様の質問:

1) https://askubuntu.com/questions/500217/how-to-properly-quote-piped-command-for-watch (答えは再び$記号をエスケープすることでした)。
2)、3)、および4)は、10ポ​​イントの評判なしに2つ以上のリンクを投稿できないため、コメントにリストされています。

3
user1271772

4つのアプローチがあります。

1.コマンドを二重引用符で囲みます

二重引用符とドル記号の両方をエスケープする必要があります。

watch "awk 'NR%2==0 {printf \"%s %8.0f\", \$1, \$5}'" filename.txt

2.コマンドを一重引用符で囲みます

一重引用符の中には、"$もエスケープする必要はありません。ただし、一重引用符で囲まれた文字列内に一重引用符を含めることはできません。一重引用符を表示する必要がある場合の回避策は、一重引用符で囲まれた文字列を終了し、エスケープされた一重引用符\'を追加することです。次のようになります。

watch 'awk '\''NR%2==0 {printf "%s %8.0f", $1, $5}'\' filename.txt

3.ハイブリッドアプローチ

上記の両方を組み合わせて、文字列の最初の部分を二重引用符で囲み、2番目の部分を一重引用符で囲みます。

watch "awk 'NR%2==0 {printf "'"%s %8.0f", $1, $5}'\' filename.txt

4.引用されていないが、完全にエスケープされている

コマンドを引用符で囲まない場合は、必要なすべてのシェルアクティブ文字をエスケープする必要があります。これには、スペース、引用符、中括弧、ドル記号が含まれます。

watch awk\ \'NR%2==0 \{printf\ \"%s\ %8.0f\",\ \$1,\ \$5\}\' filename.txt
6
John1024