![Linux 出力リダイレクトが awk で動作しない](https://rvso.com/image/1337795/Linux%20%E5%87%BA%E5%8A%9B%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%8C%20awk%20%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84.png)
私は 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) を取得すると (正常に!) 終了します。)nawk
CtrlCCtrlCtop
nawk
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