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


15

topリダイレクトでコマンドを使用するとうまくいきます:

top > top.log

次に、grepを使用して特定の行をフィルター処理します。

top | grep "my_program" > top.log

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

top | grep "my_program"

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

なぜ私のアプローチが機能しないのですか?そして、どうすれば修正できますか?

bash  grep 

2
私はちょうどそれを試した、そしてそれは私のために働く。ただし、代わりに使用-bするtopか、使用psするオプションを検討する必要があります。
レフレヴィツキー

-b私の問題は解決しませんでしたが、エンコードの問題は解決しました。ありがとうございました。

回答:


22

あなたが説明したのと同じ振る舞いをします。Ubuntu 11.10で

top | grep "my_program" > top.log

出力を生成しません。

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

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

他の潜在的なソリューションについては、このSOの質問も参照してください。


3
+1 --line-bufferedは問題を解決します。

ありがとう、これは私にとっても問題を解決します。この-bオプションも、Lev Levitskyからの良いアドバイスです。これにより、ログファイルに関するエンコードの問題が解決されました。

2

あなたが使用する必要があります:

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

「-n 1」は1回の反復でtopを実行し、数秒ごとに継続的に更新する代わりに終了します

psはより良いツールですが、1行だけを探しているためです。


1

この問題に対する私の回避策は:

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

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



0

どちらも私には有効ですが、レフ・レヴィツキーのアドバイスは正しいものだと思います。-b引数を使用します。

出力のリダイレクトが問題であり、stdoutで何も得られない可能性が高いので、代わりにこれを試してください。

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

出力バッファリングにも問題がある可能性があることに注意してください。シェルは常にファイルに書き込みを行うわけではないので、top.log

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.