Wie wende ich einen Filter auf die Echtzeitausgabe von "tail -f" an?

60
tail -f path

Mit den oben genannten Optionen werden Änderungen sofort an der Datei ausgegeben. Ich möchte jedoch einen Filter auf die Ausgabe anwenden, der nur angezeigt wird, wenn ein Schlüsselwort xxxdarin enthalten ist.

Wie soll man das angehen?

wamp
quelle
1
Das Markieren von Antworten als akzeptiert hilft anderen, die Ihre Fragen und deren Antworten lesen, herauszufinden, welche Antwort ihnen möglicherweise eher hilft, wenn sie eine ähnliche Frage oder ein ähnliches Problem haben. Sie können Ihre früheren Fragen erneut beantworten, indem Sie auf Ihren Benutzernamen klicken.
Dennis Williamson

Antworten:

84

Mit Unix können Sie die Ausgabe eines Programms in ein anderes leiten.

Um den Schwanz zu filtern, können Sie grep verwenden:

tail -f path | grep your-search-filter
AddersUK
quelle
Nehmen wir jedoch an, Sie haben 100 Zeilen am Ende der Datei, und diese Zeilen möchten Sie filtern. Ihre Lösung
TraderJoeChicago
1
Wenn Sie nur die letzten 100 Zeilen einer Datei durchsuchen möchten, versuchen Sie tail -100 path | grep xxx
AddersUK
15

Kurze Antwort: tail -f somefile | grep somepattern

Dies neigt jedoch dazu, zu kurz zu kommen. Angenommen, Sie verfolgen eine Datei, die häufig gedreht wird (wenn es sich um ein Debug-Protokoll handelt, wird sie möglicherweise mehrmals gedreht). In diesem Fall tail -Fist dein Freund. Ich lasse dich den Unterschied nachschlagen.

Aber tail -fund tail -Fdrucken Sie zuerst ein paar Zeilen aus, was in diesem Anwendungsfall oft unerwünscht ist, also fügen Sie in diesem Fall hinzu-n0

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. Standardmäßig wird stdout beim Schreiben in ein Terminal zeilenweise gepuffert, beim Schreiben in eine Pipe jedoch vollständig gepuffert. Die folgenden Befehle geben Zeilen aus, sobald sie gefunden werden, da sie tailexplizit zeilenweise gepuffert sind (oder ihre Ausgabe am Ende jeder Zeile leeren) und grepauch zeilenweise gepuffert sind, weil ihre Ausgabe an Ihr Terminal gesendet wird:

tail -F -n0 somefile | grep somepattern

Aber dann entscheiden Sie sich dafür, etwas wie awkoder cutdie Ausgabe weiter zu verarbeiten.

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

Und jetzt fragen Sie sich, wohin Ihre Ausgabe gegangen ist ... Je nach Protokollvolumen wird möglicherweise eine Ausgabe ausgegeben, aber es wird jeweils eine Seite angezeigt, da die Standardausgabe von jetzt grepvollständig gepuffert ausgeführt wird. und awkempfängt so 4kB auf einmal (standardmäßig).

In diesem Fall können Sie grepmit der --line-bufferedOption festlegen, dass die Standardausgabe immer gepuffert werden soll .

tail -F -n0 somefile | grep --line-buffered somepattern | ...

Die meisten Befehle haben jedoch kein Analogon von --line-buffered. Bei mehr skriptfähigen Werkzeugen können Sie eine Funktion zum Leeren der Ausgabe verwenden (z. B. awkist die Funktion fflush(), die denselben Namen wie das C-Gegenstück hat, Werkzeuge wie Perl und Python haben etwas Ähnliches).

Mit so etwas haben cutSie wahrscheinlich kein Glück. ... aber Sie könnten versuchen, nach unbufferetwas zu suchen , das meiner Meinung nach von der expectToolchain bereitgestellt wird (ich habe es nie benutzt).

Ich hoffe, Sie fanden das nützlich.

Prost, Cameron

Cameron Kerr
quelle
Ich freue mich sehr über die Erklärung, warum dies im zeilengepufferten Modus funktioniert. Das ist eine hervorragende Einsicht, danke.
Grün
2

und Sie können mehrere Pipes und Greps verwenden und Dinge mit grep -v ausschließen, mit grep -i die Groß- und Kleinschreibung ignorieren usw.

dh: tail -100f / var / log / messages | grep -V ACPI | grep -i ata

Beginnen Sie mit dem Tailing von 100 Zeilen ab dem Ende und bleiben Sie dabei. Schließen Sie zuerst alle Zeilen mit ACPI aus und zeigen Sie dann Zeilen mit ata, ATA oder einer Mischung dieser Zeilen an.

Ein weiteres praktisches sind die ABC-Optionen für die Zeilen After, Before und Context (Zeilen vor und nach).

Ronald Pottol
quelle