879 Stimmen

Wie kann man einen kontinuierlichen Datenstrom "greppen"?

Ist das möglich, wenn man grep in einem kontinuierlichen Strom?

Was ich meine, ist eine Art tail -f <file> Befehl, sondern mit grep auf die Ausgabe, um nur die Zeilen zu behalten, die mich interessieren.

Ich habe versucht tail -f <file> | grep pattern aber es scheint, dass grep kann nur einmal ausgeführt werden tail beendet, das heißt, niemals.

1539voto

tad Punkte 15114

Einschalten grep bei der Verwendung von BSD grep (FreeBSD, Mac OS X usw.) den Zeilenpufferungsmodus.

tail -f file | grep --line-buffered my_pattern

Es scheint eine Weile her zu sein --line-buffered war für GNU grep (das unter so gut wie jedem Linux verwendet wird) nicht von Bedeutung, da es standardmäßig gespült wurde (bei anderen Unix-ähnlichen Systemen wie SmartOS, AIX oder QNX ist das anders). Wie auch immer, ab November 2020, --line-buffered benötigt (zumindest mit GNU grep 3.5 in openSUSE, aber basierend auf den Kommentaren unten scheint es generell notwendig zu sein).

135voto

Irit Katriel Punkte 3329

Ich benutze die tail -f <file> | grep <pattern> Die ganze Zeit über.

Er wartet, bis grep geleert wird, nicht bis es beendet ist (ich verwende Ubuntu).

86voto

XzKto Punkte 2412

Ich denke, dass Ihr Problem ist, dass grep einige Ausgabepufferung verwendet. Versuchen Sie

tail -f file | stdbuf -o0 grep my_pattern

wird der Ausgabepufferungsmodus von grep auf ungepuffert gesetzt.

24voto

Ken Williams Punkte 21163

Wenn Sie nach Übereinstimmungen in der gesamte Datei (nicht nur den Schwanz), und Sie wollen, dass sie auf neue Übereinstimmungen wartet, dann funktioniert das ganz gut:

tail -c +0 -f <file> | grep --line-buffered <pattern>

Le site -c +0 Flagge sagt, dass die Ausgabe beginnen soll 0 Bytes ( -c ) von Anfang an ( + ) der Datei.

17voto

Dale Anderson Punkte 1799

In den meisten Fällen können Sie tail -f /var/log/some.log |grep foo und es wird gut funktionieren.

Wenn Sie mehrere greps auf eine laufende Protokolldatei anwenden müssen und Sie feststellen, dass Sie keine Ausgabe erhalten, müssen Sie möglicherweise die Option --line-buffered Schalter in Ihr Mitte grep(s), etwa so:

tail -f /var/log/some.log | grep --line-buffered foo | grep bar

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X