GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie wendet man einen Filter auf die Echtzeitausgabe von `tail -f ` an?

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:

verwenden
tail -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).


Linux
  1. Wie grep ich rekursiv?

  2. Wie kann die Ausgabe des Zeitbefehls in eine Datei unter Linux umgeleitet werden?

  3. Wie verkettet man mehrere Ausgabezeilen zu einer Zeile?

  4. Wie grep \n in Datei

  5. Wie verwendet Linux eine Echtzeituhr?

So verwenden Sie den Befehl tail, um Protokolle in Echtzeit anzuzeigen

Wie starte ich Multithread-Grep im Terminal?

3 Möglichkeiten zum Ansehen von Protokollen in Echtzeit unter Linux

So übergeben Sie die Befehlsausgabe als mehrere Argumente an einen anderen Befehl

Wie kann ich eindeutige Ergebnisse aus der grep-Ausgabe herausfiltern?

Wie sortiere ich die ps-Ausgabe nach der Startzeit des Prozesses?