Linux 出力リダイレクトが awk で動作しない

Linux 出力リダイレクトが awk で動作しない

私は top からの出力に基づいて、きれいな csv ファイルを作成しようとしています。次のように awk を使用して出力を再フォーマットします。

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'

> output.logそれは完璧に動作します。次に、出力をファイルに保存します。次のようにすると動作すると思います:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log

しかし、トッププロセスから Ctrl + C で抜けると、単に空のファイルが生成されます。何が間違っているのでしょうか?

答え1

Unix の標準 I/O (“stdio”) ライブラリは、書き込み先 (データ シンク) の種類を検出します。端末 (つまり、ウィンドウ) を検出すると、プログラムが要求するとすぐにデータを書き込みます。ただし、ファイルに書き込む場合、I/O ライブラリはデータをバッファリングし、一度に 512 バイト (またはそれ以上) のブロックで書き込みます。もちろん、呼び出しプログラムが終了すると、バッファをフラッシュします (部分的なブロックを書き出します)。ただし、正常に終了した場合は例外です。異常終了 ( Ctrl+によるC) では、出力ファイルが不完全になる可能性があります。

修正するには、次の操作を試してください。

top -b | ( trap "" 2; nawk '(あなたのnawk命令)' > output.log)`

コマンドは、コマンドを+の影響を受けないようtrapにします。(もちろん、+ はプロセスを強制終了し、パイプ上でファイルの終わり (EOF) を取得すると (正常に!) 終了します。)nawkCtrlCCtrlCtopnawk

PS これは、bashまたはbash互換シェルを実行していることを前提としています (必要とします)。

答え2

Top は実行し続けます。これを限られた回数だけ実行したい場合、-n オプションを使用します。次のようにします。

top -b -n 1 | awk '{ ... }'

あるいは、C-\ を使用して top を終了することもできます。Cc を使用すると、top は中止され、パイプが途中で切断されます (awk が何かを取得する前)。

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo

関連情報