grepがリダイレクトで機能しないのはなぜですか?

grepがリダイレクトで機能しないのはなぜですか?

topリダイレクトでコマンドを使用するとうまく機能します。

top > top.log

grepを使って特定の行をフィルタリングしたいと思います。

top | grep "my_program" > top.log

ただし、ログファイルは空のままです。ただし、grepを使用すると出力が提供されます。

top | grep "my_program"

my_program一部の出力を表示するには、実行中のプログラムに置き換える必要があります。

私の方法がうまくいかないのはなぜですか?どうすれば解決できますか?

答え1

私はあなたが説明するのと同じ動作をします。 Ubuntu 11.10から

top | grep "my_program" > top.log

出力を生成しません。

その理由は、grepが出力をバッファリングするためだと思います。 GNU grepに出力を1行ずつ印刷するように指示するには、次の--line-bufferedオプションを使用します。

top | grep --line-buffered "my_program" > top.log

これも見てくださいだから質問は他の潜在的な解決策。

答え2

以下を使用する必要があります。

top -n 1 | grep "blah" > top.log

「-n 1」は、1回の反復で最上位に実行され、数秒ごとに継続的に更新されるのではなく終了します。

行だけを探しているので、psを使用する方が良いツールです。

答え3

私がこの問題を解決した方法は次のとおりです。

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

これにより、バックグラウンドでmy_programの実行モニターを提供し、すべての結果をtop.logファイルに保存できます。

答え4

どちらも私には役に立ちましたが、Lev Levitskyのアドバイスは正しいと思います。引数を使用してください-b

出力リダイレクトが問題である可能性が高く、stdoutを介して何も取得できないため、次のことを試してください。

top -b 2>&1 | grep "my_program" > top.log

出力バッファリングの問題も発生する可能性があります。シェルはこのファイルに継続的に記録しないため、入力にtop.log時間がかかることがあります。

関連情報