Ist es möglich, eine tail -f
(oder ähnliche) Datei grep
gleichzeitig zu bearbeiten? Es würde mir nichts ausmachen, wenn andere Befehle nur nach dieser Art von Verhalten Ausschau halten.
Ist es möglich, eine tail -f
(oder ähnliche) Datei grep
gleichzeitig zu bearbeiten? Es würde mir nichts ausmachen, wenn andere Befehle nur nach dieser Art von Verhalten Ausschau halten.
Antworten:
Unter Verwendung von GNU tail
und GNU grep
kann ich tail -f
mit der einfachen Syntax eine finden:
tail -f /var/log/file.log | grep search_term
Es wird gut funktionieren; Wartet im Allgemeinen, grep
wenn 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
In --line-buffered
zu 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
grep
nicht 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.
Sie können einfach die Ausgabe von grep
in umleitentail -f
. Es gibt auch Programme, die tail -f
Funktionalität mit Filtern und Färben kombinieren , insbesondere Multitail ( Beispiele ).
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.
tail -f access | awk '/ADD/{print $0}'
Benutze das Obige, ich benutze es normalerweise.
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.
Es klappt. Achten Sie jedoch darauf, dass die Ausgabe nicht mehr sofort erfolgt: Sie wird durch die Pipe gepuffert.
tail -f
in einem Fenster und tail -f logfile | grep pattern
in 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.
tee
oder so.