it-swarm.com.de

Wie greife ich nach einem kontinuierlichen Stream?

Ist es möglich, grep in einem kontinuierlichen Stream zu verwenden?

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

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

658
Matthieu Napoli

Aktivieren Sie den Zeilenpuffermodus von grep, wenn Sie BSD grep verwenden (FreeBSD, Mac OS X usw.).

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

Sie müssen dies nicht für GNU grep tun (wird auf so ziemlich jedem Linux verwendet), da es standardmäßig gelöscht wird (YMMV für andere Unix-Likes wie SmartOS, AIX oder QNX).

1228
tad

Ich benutze die ganze Zeit den tail -f <file> | grep <pattern>.

Es wird warten bis grep flutet, nicht bis es fertig ist (ich benutze Ubuntu).

113
Irit Katriel

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

tail -f file | stdbuf -o0 grep my_pattern

es setzt den Ausgabepuffermodus von grep auf ungepuffert.

59
XzKto

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

Wenn Sie für eine laufende Protokolldatei mehrere greps verwenden müssen und keine Ausgabe erhalten, müssen Sie möglicherweise den Schalter --line-buffered in Ihre mittlere grep (s) stecken :

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

Wenn Sie Übereinstimmungen in der gesamten -Datei finden möchten (nicht nur den Schwanz), und Sie möchten, dass diese sitzt und auf neue Übereinstimmungen wartet, funktioniert dies gut:

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

Das -c +0 -Flag gibt an, dass die Ausgabe 0 Bytes (-c) am Anfang (+) der Datei beginnen soll.

10
Ken Williams

Ich habe nicht gesehen, dass jemand mein übliches Angebot dazu gemacht hat:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

Ich bevorzuge dies, weil Sie ctrl + c verwenden können, um die Datei zu stoppen und zu navigieren, wann immer Sie möchten, und dann einfach shift + f drücken, um zur Live-Streaming-Suche zurückzukehren.

5
Hans.Loven.work

sed wäre eine bessere Wahl ( stream editor)

tail -n0 -f <file> | sed -n '/search string/p'

und wenn Sie möchten, dass der Befehl tail beendet wird, sobald Sie eine bestimmte Zeichenfolge gefunden haben:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

Offensichtlich ein Bashismus: $ BASHPID ist die Prozess-ID des Befehls tail. Der sed-Befehl steht nach dem Ende der Pipe, daher lautet die sed-Prozess-ID $ BASHPID + 1.

3
Christian Herr

sie können diese Antwort als Verbesserung betrachten .. in der Regel verwende ich

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-F ist besser, wenn die Datei gedreht wird (-f funktioniert nicht richtig, wenn die Datei gedreht wird)

-A und -B sind nützlich, um Linien kurz vor und nach dem Auftreten des Musters abzurufen. Diese Blöcke werden zwischen Trennzeichen mit gestrichelten Linien angezeigt

Aber für mich mache ich lieber Folgendes

tail -F <file> | less

dies ist sehr nützlich, wenn Sie in gestreamten Protokollen suchen möchten

3
mebada

Dieser eine Befehl funktioniert für mich (Suse):

mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN  >> logins_to_mail

sammeln von Anmeldungen an den Mail-Dienst

1
user10584393

Ja, das wird tatsächlich gut funktionieren. Grep und die meisten Unix-Befehle werden zeilenweise für Streams ausgeführt. Jede Zeile, die aus dem Schwanz kommt, wird analysiert und weitergeleitet, wenn sie übereinstimmt.

0
Caleb