stdoutへの出力の書き込みを継続的に実行するプログラムがあり、そのプログラムから最後の出力セットを継続的に取得して、これをファイルに書き込みたいと思います。新しい出力セットが来るたびに、同じファイルを上書きしたいと思います。
例は次のコマンドです。
iostat -xkd 5
これにより、5秒ごとに出力が出力され、各出力の後に空白行が表示されます。最後の「セット」をファイルに書き込んでもらいたいのですが、これは簡単な方法で実現できるはずだと思います。
これまで、xargsを使用してみましたが、これは、何かで区切られた行のグループではなく、1行でしか実行できませんでした。
awkで可能かもしれないと思いますが、システムを使用してデータを書き出すことができるようにデータをバッファリングする方法、または同じ出力ファイルを閉じて再度開く方法を理解できません。
編集:明確にするために、これは継続的に実行される単一のコマンドです。新しいコマンドを開始してその出力を読みたくありません。
解決
@Bittranceからの回答を適応させて、次のようにしました。
iostat -xkd 5 | (while read r; do
if [ -z "$r" ]; then
mv -f /tmp/foo.out.tmp /tmp/foo.out
else
echo "$r" >> /tmp/foo.out.tmp
fi
done)
これは、「セクション」の終わりを検出して一時ファイルに書き込むことを除けば、基本的に同じであり、外部プロセスが出力ファイルを読み取ろうとするたびに完了します。