grep und schwanz -f?

28

Ist es möglich, eine tail -f(oder ähnliche) Datei grepgleichzeitig zu bearbeiten? Es würde mir nichts ausmachen, wenn andere Befehle nur nach dieser Art von Verhalten Ausschau halten.

Xenoterracid
quelle

Antworten:

46

Unter Verwendung von GNU tailund GNU grepkann ich tail -fmit der einfachen Syntax eine finden:

tail -f /var/log/file.log | grep search_term
Steven D
quelle
Dies ist eine Lösung, die mit anderen Implementierungen dieser beiden Dienstprogramme funktioniert, nicht nur mit der GNU-Implementierung.
Kusalananda
7

Es wird gut funktionieren; Wartet im Allgemeinen, grepwenn ein Programm nicht ausgegeben wird, und liest weiter, wenn die Ausgabe eingeht.

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

5 Sekunden lang passiert nichts, dann gibt grep den passenden "Test" aus, und fünf Sekunden später wird er beendet, wenn der Pipe-Prozess beendet ist

Michael Mrozek
quelle
7

In --line-bufferedzu grep, und das kann die Verzögerung für Sie reduziert. In manchen Fällen sehr nützlich.

tail -f foo | grep --line-buffered bar
Ziffer
quelle
2
Dies ist nützlich, wenn die Ausgabe von grepnicht an ein Terminal gesendet wird (umgeleitet zu einem anderen Dateityp). Die Zeilenpufferung ist die Standardeinstellung, wenn die Ausgabe an ein Terminal gesendet wird, sodass es dort keinen Unterschied macht. Beachten Sie, dass diese Option GNU-spezifisch ist.
Stéphane Chazelas
2

Ich sehe all diese Leute sagen zu verwenden tail -f, aber ich mag die Einschränkungen davon nicht! Meine Lieblingsmethode beim Durchsuchen einer Datei und beim Suchen nach neuen Zeilen (z. B. arbeite ich normalerweise mit Protokolldateien, an die die umgeleitete Ausgabe von Prozessen angehängt wird, die regelmäßig über Cron-Jobs ausgeführt werden):

 tail -Fn+0 /path/to/file|grep searchterm

Dies setzt GNU-Tail und grep voraus. Unterstützende Details aus der Tail-Manpage (GNU coreutils, meins ist v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Der hintere Teil meines Befehls entspricht also der Anweisung tail --follow --retry --lines=+0, am Anfang zu beginnen, wobei Nullzeilen übersprungen werden.

wajiii
quelle
1
tail -f access | awk '/ADD/{print $0}'

Benutze das Obige, ich benutze es normalerweise.


quelle
0

Sie können netcat verwenden, um die Ergebnisse von tail -f zu erfassen, da neue Ergebnisse recht einfach eingehen.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Dadurch wird grep so eingestellt, dass es die Ergebnisse auf Eingaben von Port 1337 überwacht.
Der zweite Befehl leitet die Ausgabe von tail -f an netcat weiter und sendet sie an localhost 1337. Um dies lokal zu tun, müssen Sie ttys für jeden der beiden Befehlssätze umschalten , oder verwenden Sie so etwas wie Bildschirm.

Justin S
quelle
0

Es klappt. Achten Sie jedoch darauf, dass die Ausgabe nicht mehr sofort erfolgt: Sie wird durch die Pipe gepuffert.

mouviciel
quelle
Einverstanden. Öffnen Sie dazu zwei Fenster. Führen Sie tail -fin einem Fenster und tail -f logfile | grep patternin dem anderen Fenster aus. Zeilen, die enthalten pattern, werden nicht immer gleichzeitig in beiden Fenstern angezeigt. Ich habe in seltenen Fällen gesehen, dass Linien im Abstand von 30 Sekunden erscheinen, was ärgerlich war.
Stefan Lasiewski
Dies hat möglicherweise mehr damit zu tun, dass das System zwischen dem Ausführen der einen oder anderen Instanz von tail wechselt. Ein besserer Test wäre uns teeoder so.
Kevin Cantu