grep und sed mit Pipe von tail -f scheint zwischenzuspeichern

grep und sed mit Pipe von tail -f scheint zwischenzuspeichern

Ich versuche, ein funktionierendes System zum Überwachen spezieller Protokolle zu erhalten. Normalerweise möchte ich nur ein sehr spezifisches Muster, das ich mit grepund einer Pipe extrahiere tail -f. Mir ist aufgefallen, dass grep nicht alles ausgibt, sondern einige Zeilen zwischenspeichert. Ich denke, das macht Sinn, wenn Sie eine Pipe haben, die alles ausgibt und dann beendet und den Stream schließt.
Aber damit tail -fklappt es bei mir nicht.

Dasselbe Problem tritt bei auf sed.

Hier ist ein Beispielbefehl, den ich verwenden möchte:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'

Ein Beispiel:

Die letzte Zeile des obigen Befehls lautet:

2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x

Und mit diesem Befehl:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g

Die letzte Zeile ist diese:

2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y

Durch das Entfernen weiterer Pipes gelange ich zu den aktuellsten Einträgen.

Wie kann ich dieses Caching in den Pipes möglicherweise vermeiden?

Antwort1

Fügen Sie grepdie Option von --line-bufferedund seddie Option von hinzu --unbuffered.

Antwort2

Verwenden Sie grepdie --line-bufferedOption .

Standardmäßig verwenden Dienstprogramme Zeilenpufferung, wenn ihre Standardausgabe ein Terminal ist, verwenden aber größere Puffer (wahrscheinlich 4 oder 8 KB), wenn ihre Ausgabe mit einem Dateideskriptor oder einer Pipe verbunden ist.

Sie haben Glück, dass tail -Fstandardmäßig Zeilenpufferung verwendet wird und grepes eine Befehlszeilenoption gibt, um dies zu aktivieren. Mir ist keine allgemeine Methode bekannt, um Zeilenpufferung für einen beliebigen Befehl zu aktivieren.

verwandte Informationen