2016-05-22 6 views
0

Derzeit versuche ich tail ein Protokoll, aber nur die Zeilen, die einige Schlüsselwörter hat. Derzeit bin ich mitMehrere Grep-Rohrleitungen (include + exclude) führt dazu, dass nichts angezeigt

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

und ich bin die erwarteten Ergebnisse zu erzielen: (zB)

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

Ich möchte auch Zeilen ausschließen, die eine <DATATAG> enthalten, auch wenn die Schlüsselwörter hinein gerutscht , weil es viele binäre Daten enthält, die mein Protokoll überladen. Ich versuche dann eine andere grep auf das Rohr zu addieren, die den Tag ausschließt:

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

jedoch diesmal keine Linien erscheinen, nicht einmal die vorherigen, die ‚Fehler‘/‚Ausnahme‘, aber nicht <DATATAG> hat. Wenn ich das ausschließende grep allein ausprobierte:

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

alle Zeilen erscheinen, einschließlich jene, die "Fehler"/"Ausnahme" haben.

Mache ich etwas falsch?

+0

Es ist Pufferung wie @ jzer7 sagt aber anstelle von mehreren greps und Rohre, man denke nur ein awk: 'tail -F DATEI.log | awk '!//&& tolower ($ 0) ~/Fehler | fatal | exception | shutdown | started /' '. –

Antwort

1

Ihr Problem ist eine Pufferung. grep ist ein kniffliges Werkzeug, wenn es darum geht. Aus der Manpage:

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

In Ihrem Beispiel ist die erste grep Pufferung auf Blockebene, so wird es nicht eine Ausgabe an die zweiten grep für eine Weile drehen. Die Lösung ist die --line-buffered Option zu verwenden, um wie folgt aussehen:

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