
次のようなコマンドをどのように監視しますか?
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 つ以上のリンクを投稿できないため、コメントに記載されています。
答え1
アプローチは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
答え2
これは古いスレッドですが、この問題は今後もなくなることはありません。awk 文字 '、$、% をエスケープします。
$ watch -d -n 10 'ls -ltr | grep exec_setsid_ | grep out | tail -1 | awk '\'{ print \$9 }\'' | xargs tail -25'
このコマンドは、現在のフォルダーに作成された新しい「exec_sedsid_*.out」ファイルの最後の 25 行を表示します。
プロント!