2011-02-03 6 views
2

私はtest.logファイルを持っています。非常に大きなログファイル。ロギングのレベルは異なります。例えば、tracedebuginfowarningerrorください。明らかには別のgrepコマンドの出力にgrepの助けが必要です

traceレベルのメッセージは、単に高速でスパムされています。私はtraceレベルのログなしですべてのメッセージを見たいと思っていました。

だから私はこれをしなかった:

cat test.log | grep -v "trace" 
良い作品

今私は、特定のキーワードkeyword1に基づいて残りのメッセージをフィルタリングします。

だから私はこれをしなかった:

cat test.log | grep -v "trace" | grep "keyword1" 
良い作品

ここでは、同じ出力を継続的に取得したいと考えています。cattail -fに置き換えることを考えました。

tail -f test.log | grep -v "trace" | grep "keyword1" 

しかし、これは機能しません。私は全く出力を得ません。

私は間違っていますか?そして、私が望むフィルタリングされた「tail & follow」出力をどうすれば得ることができますか?

ありがとうございました。

答えて

3

あなたは、バッファリングの問題が発生している:パフォーマンス上の理由からgrep一度にそのバッファと意志の出力で、全体のチャンクを出力のかなりを維持します。つまり、ある行が入力から読み込まれたときに、grepは、一度読み込んだ(そして通過させる)と、それをstdoutに送信します。これは、読み込み中のログファイルを扱うときにかなり時間がかかることがありますtail -fを使用してください。いくつかのパフォーマンスの損失を伴う -

多くgrep変異体がターンオンするラインバッファモード、独自にその意志出力各行をスイッチを持っています。たとえば、GNU grepには、この効果を達成するためのオプションがあります(--line-buffered)。

grepのすべての呼び出しに、そのオプション(またはご使用のバージョンのgrepに該当するもの)を追加するだけで、一致するようなものがログファイルに追加されるとすぐに出力が表示されます。

+1

'-line-buffered'がトリックを行いました。ありがとう。 – bits

0

あなたのコードが正常に動作している(つまり、どのような方法で重要ならばところで、私は... cygwinの使用しています)、あなただけのバッファリング遅延に遭遇しています。だから、長い間何も見えなくて、続いて短いテキストバーストが続き、別の待っています。何が起こっているのかについては、http://perl.plover.com/FAQs/Buffering.htmlを参照してください。

0

tail -fは、ファイルの「新しい着信行」の説明します。定期的な出力は、パイプgrepのコマンドに達しません(少なくともtailが終了するまで)。

は、定期的にこれらのログファイルの変更は、あなたの代わりにwatchを使用する場合があります「追跡」するには:これは、ログファイルの毎秒(-n 1)最後の20行を更新します

watch -n 1 -- 'tail -n 20 test.log | grep -v trace | grep keyword1' 

+0

あなたの説明によると 'tail -n 20 test.log | grep -v trace'もうまく動くべきではありませんが、テールは1 grepのパイプでパイプされます。 2つの連続したパイプが動作していません。 – bits

+0

@bits必須の変更は 'tail -f'から' tail -n'までです。私の例は2つの連鎖した挨拶だけではなく、1つでうまくいきます... –

関連する問題