2016-05-22 3 views
0

現在、私はtailログにいくつかのキーワードを含む行しか表示しようとしていません。現在、私は 複数のgrep piping(include + exclude)の結果が表示されない

tail -F file.log | grep -ie 'error\|fatal\|exception\|shutdown\|started' 

を使用していると私は期待通りの結果を得ている:私も、キーワードがそれに滑った場合でも、 <DATATAG>を含む行を除外したい

10:22 This is an error 
10:23 RuntimeException: uncaught problem 

(たとえば)私のログを乱雑にする多くのバイナリデータが含まれているからです。しかし

tail -F file.log | grep -ie 'error\|fatal\|exception\|shutdown\|started' | grep -vF '<DATATAG>' 

、何行が表示されていないこの時、「エラー」/「例外」はない<DATATAG>を持っていなくても以前のもの:私は、パイプにタグを除く他のgrepを追加しようとしています。ときに私は一人を除いたgrepのを試してみました:

tail -F file.log | grep -vF '<DATATAG>' 

すべての行が表示され、「エラー」/「例外」を有するものを含みます。

何か間違っていますか?

+0

それは@ jzer7が言うように、バッファリングだが、代わりに、複数のgrepするとパイプで、ただ一つのawkを検討してください。解決策は次のように見て--line-bufferedオプションを使用することですawk '!/ /&tolower($ 0)〜/ error |致命的|例外|シャットダウン|開始/'。 –

答えて

1

問題はバッファリングの問題です。 grepはその点では難しいツールです。 manページから:あなたの例では

By default, output is line buffered when standard output is a terminal and block buffered otherwise. 

、最初grepは、ブロックレベルでのバッファリングなので、しばらくの間、第二grepへの出力をオンにしません。 | `テール-Fのfile.log:

tail -F file.log | grep --line-buffered -ie 'error\|fatal\|exception\|shutdown\|started' | grep -vF '<DATATAG>' 
関連する問題