Lösung 1:
Mit Unix können Sie die Ausgabe eines Programms in ein anderes leiten.
Um den Schwanz zu filtern, können Sie also grep:
verwendentail -f path | grep your-search-filter
Lösung 2:
Kurze Antwort:tail -f somefile | grep somepattern
Dies greift jedoch tendenziell zu kurz. Angenommen, Sie verfolgen eine Datei, die häufig rotiert wird (wenn es sich um ein Debug-Protokoll handelt, wird es möglicherweise mehrmals rotiert). In diesem Fall tail -F
ist dein Freund. Ich lasse Sie den Unterschied nachschlagen.
Aber tail -f
und tail -F
Drucken Sie zuerst ein paar Zeilen aus, was in diesem Anwendungsfall oft unerwünscht ist, also fügen Sie in diesem Fall -n0
hinzu
tail -F -n0 somefile | grep somepattern
Das ist in Ordnung, bis Sie eine andere Filterung durchführen möchten, und dann müssen Sie sich vor dem Puffern hüten. stdout wird standardmäßig beim Schreiben an ein Terminal zeilengepuffert aber wenn es beim Schreiben in eine Pipe vollständig gepuffert ist. Das Folgende wird also Zeilen ausgeben, sobald sie gefunden werden, weil tail
explizit zeilengepuffert ist (oder seine Ausgabe am Ende jeder Zeile leert) und grep
ist auch zeilengepuffert, weil seine Ausgabe an Ihr Terminal geht:
tail -F -n0 somefile | grep somepattern
Aber dann entscheiden Sie sich für etwas wie awk
oder cut
um die Ausgabe weiterzuverarbeiten.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
Und jetzt wundern Sie sich, wo Ihre Ausgabe geblieben ist... abhängig von der Menge der Protokolle werden Sie vielleicht feststellen, dass Sie eine Ausgabe erhalten, aber es wird eine Seite nach der anderen sein, weil jetzt die Standardausgabe von grep
ist arbeitet vollständig gepuffert, also awk
empfängt es Eingabe 4kB auf einmal (standardmäßig).
In diesem Fall können Sie grep
mitteilen um die stdout-Zeile immer gepuffert zu machen, indem Sie --line-buffered
verwenden Option.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Die meisten Befehle haben jedoch kein Analogon zu --line-buffered
. Bei mehr skriptfähigen Tools können Sie eine Funktion verwenden, um die Ausgabe zu löschen (z. B. in awk
, die Funktion ist fflush()
, das den gleichen Namen wie sein Gegenstück in C hat, haben Tools wie Perl und Python etwas Ähnliches).
Mit Leuten wie cut
Sie haben wahrscheinlich Pech; ... aber Sie könnten versuchen, nach unbuffer
zu suchen , was meiner Meinung nach etwas ist, das von expect
bereitgestellt wird Toolchain (habe ich noch nie benutzt).
Ich hoffe, Sie fanden das hilfreich.
Prost, Cameron
Lösung 3:
und Sie können mehrere Pipes und greps verwenden und Dinge mit grep -v ausschließen, mit grep -i Groß- und Kleinschreibung ignorieren usw.
d.h.:tail -100f /var/log/messages | grep -V ACPI | grep -i ata
Beginnen Sie 100 Zeilen vom Ende mit dem Tailing und fahren Sie mit dem Tailing fort, schließen Sie zuerst alle Zeilen mit ACPI aus und zeigen Sie dann Zeilen mit ATA, ATA oder einer beliebigen Mischung davon.
Eine weitere praktische Option sind die ABC-Optionen für die Zeilen After, Before und Context (Zeilen davor und danach).