Frage Wie man einen Filter auf die Echtzeitausgabe von `tail -f` anwendet?


tail -f path

Das oben genannte gibt Änderungen an der Datei sofort aus, aber ich möchte einen Filter auf die Ausgabe anwenden, der nur angezeigt wird, wenn es ein Schlüsselwort gibt xxx drin.

Wie geht man damit um?


48
2017-07-05 09:13


Ursprung


Wenn Sie die Antworten als akzeptiert markieren, können andere, die Ihre Fragen und Antworten lesen, wissen, welche Antwort ihnen bei einer ähnlichen Frage oder einem ähnlichen Problem eher helfen könnte. Sie können Ihre früheren Fragen erneut aufrufen, indem Sie auf Ihren Benutzernamen klicken. - Dennis Williamson


Antworten:


Mit Unix können Sie die Ausgabe eines Programms in eine andere leiten.

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

tail -f path | grep your-search-filter

67
2017-07-05 09:17



Nehmen wir an, Sie haben 100 Zeilen im Ende (Ende der Datei), und diese Zeilen sind diejenigen, die Sie filtern möchten. Deine Lösung - TraderJoeChicago
Wenn Sie nur die letzten 100 Zeilen einer Datei durchsuchen wollen, versuchen Sie es mit tail -100 path | Grep xxx - AddersUK


Kurze Antwort: tail -f somefile | grep somepattern

Dies neigt jedoch dazu, zu kurz zu greifen. Nehmen wir an, Sie schneiden eine Datei ab, die oft gedreht wird (wenn sie ein Debug-Protokoll ist, könnte sie mehrfach gedreht werden). In diesem Fall tail -F ist dein Freund. Ich werde dich den Unterschied nachsehen lassen.

Aber tail -f und tail -F Drucken Sie zuerst eine Reihe von 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 wird in Ordnung sein, bis Sie eine andere Filterung durchführen wollen, und dann müssen Sie sich vor dem Puffern in Acht nehmen. stdout wird standardmäßig in der Zeile gepuffert beim Schreiben in ein Terminal aber wenn beim Schreiben in eine Pipe voll gepuffert wird. Das Folgende wird also Linien ausgeben, sobald sie gefunden werden, denn tail ist explizit liniengepuffert (oder es leert seine Ausgabe am Ende jeder Zeile), und grep ist auch liniengepuffert, weil seine Ausgabe zu Ihrem Terminal geht:

tail -F -n0 somefile | grep somepattern

Aber dann entscheidest du dich für etwas wie awk oder cut um die Ausgabe weiter zu verarbeiten.

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

Und jetzt wundern Sie sich, wo Ihre Ausgabe gelaufen ist ... abhängig von der Menge der Logs, werden Sie vielleicht feststellen, dass Sie die Ausgabe erhalten, aber es wird immer eine Seite nach der anderen sein, weil jetzt der Standardwert von grep arbeitet auf vollständig gepufferte Weise und so awk empfängt es 4kB gleichzeitig (standardmäßig).

In diesem Fall können Sie sagen grep stdout line gepuffert zu machen, indem man die --line-buffered Möglichkeit.

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

Die meisten Befehle haben jedoch kein Analogon von --line-buffered. Im Falle von mehr skriptfähigen Werkzeugen können Sie eine Funktion verwenden, um die Ausgabe zu leeren (z. B. in awk, ist die Funktion fflush(), das den gleichen Namen wie sein C-Gegenstück hat, Werkzeuge wie Perl und Python haben etwas ähnliches).

Mit Leuten wie cut Sie haben wahrscheinlich kein Glück; ... aber du könntest versuchen nach etwas zu suchen unbuffer, was ich denke, etwas von der zur Verfügung gestellt expect Toolchain (ich habe es noch nie benutzt).

Ich hoffe, du hast das nützlich gefunden.

Prost, Cameron


12
2017-08-02 10:46



Ich schätze die Erklärung sehr Warum Dies funktioniert im Zeilenpuffermodus. Das ist ein ausgezeichneter Einblick, danke. - Green
@Green danke für das Feedback - Cameron Kerr


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

das heißt: Tail -100f / var / Protokoll / Nachrichten | grep -V ACPI | grep -i ata

Beginnen Sie 100 Zeilen vom Ende zu tailen, und behalten Sie Tailing bei, schließen Sie zuerst alle Zeilen mit ACPI aus und zeigen Sie dann Zeilen mit ATA, ATA oder einer beliebigen Mischung davon an.

Eine weitere praktische Möglichkeit sind die ABC-Optionen für die Zeilen After, Before und Context (Zeilen davor und danach).


2
2017-07-05 20:12