2013-01-16 15 views
13

私はいくつかのログファイルを監視するシェルスクリプトを構築しようとしています。 私は、このようなコマンドを使用しています:tail -f grep into cutが正しく動作しない

tail -f /var/somelog | grep --line-buffered " some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " " 

ログファイルは次のようである:

some test and p l a c e h o l d e r 3 
some test and p l a c e h o l d e r 4 
some test and p l a c e h o l d e r 5 
some test and p l a c e h o l d e r 6 

など.. 私の問題は、コマンドの出力が最後に表示されないということですラインまでのライン

some test and p l a c e h o l d e r 6 

some test and p l a c e h o l d e r 7 

がログに追加されます。

私は私の問題を明確にしたいと思います。誰も私がこれを解決するのを助けることができますか? ありがとうございました:)

+4

ログ行は改行で終わらず、代わりに1行で開始していますか?この場合、7行目が開始され、その行送りが提供されるまで、6行目は完全ではありません。すべての文字を表示しているログファイルを見ると、最後の行の最後に改行が表示されますか? –

+0

'od -c/var/somelog'を使って改行(" \ n ")を探します。 – cdarke

+0

'tail -f'と同じ出力が見えますか?そうであれば@Davidはそれを正しく指摘しています。 – mtk

答えて

19

この問題は、grepとcutバッファの出力とほとんど関係があります。私はそれを行うにはきれいな方法があると確信しているものの、ここで、問題を回避あなたを取得する必要がありますハックです:代わり

tail -f /var/somelog | while read line; do echo "$line" | grep "some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " "; done 

(コマンドの終わりに; doneを忘れないでください)

gawkが、それは出力のバッファされませんので、あなたは、whileループ面倒を避けるためにcutの代わりにそれを使用することができます:バッファリングの問題に関する詳細はアウトhttp://www.pixelbeat.org/programming/stdio_buffering/

tail -f log | grep --line-buffered "some test and p l a c e h o l d e r" | gawk '{print $3,$4,$14}' 

チェック。

+1

'/ var/somelog'に書き込んでいるものはバッファリングされている可能性もあるので、' tail'はバッファオーバーフローや何か他の方法で出力をフラッシュするまで変更を見ることさえできません... – twalberg

+0

私は最初の解決策働いています。ご協力ありがとうございました! –

+0

喜んで助けてください。ここで感謝の言葉を言う最良の方法は、有益な答えを受け入れることです。 :) – nullrevolution