Frage In Tail -f: Wie filtere ich Inhalte mit bestimmten Keywords heraus?


Ich möchte tail -f meine Protokolle. Ich möchte jedoch alles herausfiltern, was die Wörter hat:

"ELB", "Pingdom", "Gesundheit"


34
2018-05-18 00:11


Ursprung


Mit vanheusden.com/multitail Sie können wichtige Dinge färben oder Dinge herausfiltern, die Sie nicht sehen möchten, zB config paz.org/software/multitail/multitailconfig.html - oluies


Antworten:


Ich weiß nicht, wie man awk anstatt grep benutzt, aber das funktioniert für mich:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

BEARBEITEN: Wie Dmourati und Kaleb  darauf hingewiesen, könnte man auch verwenden egrep anstatt grep -E zur Bequemlichkeit. Auf einigen Systemen ist dies eine Verknüpfung zu derselben Binärdatei, in anderen eine Kopie davon, die vom Paket grep bereitgestellt wird. Wie auch immer, es lebt als eine Alternative zu den -E Schalter. Laut der GNU grep man-Seite:

[...] zwei Variantenprogramme egrep und fgrep stehen zur Verfügung. egrep ist das gleiche wie grep -E. fgrep ist das gleiche wie grep -F. Direkter Aufruf als entweder egrep oder fgrep ist veraltet, wird jedoch bereitgestellt, damit Verlaufsanwendungen, die auf ihnen basieren, unverändert ausgeführt werden können.

Da es sich auch um Befehle handelt, kommt es auf die Präferenz an, es sei denn, Sie haben überhaupt kein Erep. Für die Vorwärtskompatibilität wird jedoch empfohlen, den grep -E Syntax, da die andere Methode offiziell veraltet ist.


55
2018-05-18 00:19



Macht Gebrauch grep -E anstatt egrep eine doppelte Antwort rechtfertigen? - Caleb
@Caleb Ich verstehe nicht warum nicht. Es gibt mehr als eine Möglichkeit, eine Katze zu häuten, und diese Seite ermöglicht es, alle aufzulisten - DTest
Ja, aber sie sind nur symbolische Verbindungen zueinander, nicht zwei verschiedene Programme mit einer gewissen funktionalen Überlappung. Wäre das nicht eher ein "Addendum" (gelesen: Kommentar), keine vollwertige Antwort? Ich habe Downvotes für kleinere Straftaten ... - Marcin
@DTest: Von Rechten Dmourati tatsächlich schlug mich ein paar Sekunden bis zum Schlag und obwohl er die Argumentation nicht erklärte, verdient er hier einen Kredit. Du warst deutlich zu spät zur Party, da wir beide mindestens zwei Upvotes hatten, bevor du reinkamst. Das Ändern der Syntax von einem symbolischen binären zu einem Argument ist normalerweise etwas, für das du einen Kommentar verwenden würdest, keine separate Antwort. Wenn Sie die Katze anders häuten wollen, verwenden Sie sed, awk, perl, multitail oder ninja_foo. - Caleb
@DTest: Ich habe mir die Freiheit genommen, eine signifikante faktische Bearbeitung Ihrer Antwort vorzunehmen, um einige Originalquellen hinzuzufügen. Es sieht so aus, als ob -E für die zukünftige Verwendung empfohlen wird, also habe ich das markiert, aber die Notiz über Distributionen, die nicht egrep haben, entfernt. Die erwähnten Distributionen haben egrep, es ist nur ein separater Binär anstelle eines Symlinks. - Caleb


Versuchen Sie, es mit einer Pipe zu trennen, um Listen von Wörtern zu filtern, die Sie herausfiltern möchten:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Beachten Sie, dass die Verwendung von Klammern um die Liste der Übereinstimmungen optional ist. Seit der | wird von grep als logischer ODER-Operator behandelt, unabhängig davon, ob er als Teil einer Untergruppe auftritt oder nicht. '(ELB|Pingdom|Health)' würde genau so funktionieren. Für einige kann die Syntax offensichtlicher sein; Ich finde es einfacher, ohne zu tippen, da ich von einer einzelnen Übereinstimmung zu einer Liste möglicher Übereinstimmungen wechseln kann, ohne zurückzugehen, um die Klammer hinzuzufügen.

Für zusätzlichen Kredit ist es erwähnenswert multitail macht ninja foo, wenn es darum geht, die Ausgabe zu filtern. Zum Beispiel könnten Sie für Ihre Wörter wie folgt filtern:

multitail -e ELB -e Pingdom -e Health -f log_file

Sie können es auch verwenden, um die Ausgabe zu färben oder anderweitig hervorzuheben, anstatt sie nur zu filtern.

Bearbeiten: Sehen DTests antworten und die Kommentare für die vollständige Erklärung, wie egrep nur eine veraltete alternative Möglichkeit zum Abfeuern ist grep -E.


20
2018-05-18 00:19



sollte der Ausdruck nicht mit ('), nicht mit (') enden? - bbaja42
Ja danke das war ein Tippfehler. Für zukünftige Referenzen, da Stack Exchange Sites wie Wikis funktionieren, können Sie das einfach reparieren. - Caleb
Ich dachte der Schnitt müsste mehr als 6 Zeichen haben? - Sirex
Wenn Sie keine hohe Repräsentation haben, ja, es gibt mindestens 6 Zeichen, aber in diesem Fall ist das 1 Zeichen sehr wichtig. Sie können die Änderung erzwingen, indem Sie dem Text einen HTML-Kommentar hinzufügen. Die Charaktere zählen bis zum Limit und Sie können feststellen, warum Sie die Änderung vornehmen. - Caleb
@Caleb dankt so sehr für den Multitail-Vorschlag genial!! Ich kann nicht glauben, dass ich so lange in meinem Leben ohne es gegangen bin. - sidewinderguy


tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'

5
2018-05-18 00:18





Warum möchten Sie diese Informationen protokollieren?

  • Ist es ausschließlich für die Archivierung?
  • Möchten Sie verschiedene Skripts abhängig von verschiedenen Schlüsselwörtern oder Mustern in den Protokolldateien bedingt ausführen?

Wenn Sie abhängig vom Inhalt der Protokolldateien Skriptverhalten haben möchten, sollten Sie Ihre Filterung mit Expect durchführen. ( http://en.wikipedia.org/wiki/Expect ) Expect ist eine Tcl-Erweiterung, aber es gibt auch eine Python-Version von Expect.

Expect bietet Ihnen diese leistungsstarke flexible switch-ähnliche Anweisung, mit der Sie abhängig von den Zuständen oder Mustern, die in Ihrem Eingabestream vorhanden sind, unterschiedliche Verhaltensweisen festlegen können. Zum Beispiel:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Sie geben also Muster in der expect-Anweisung an, und Sie geben unterschiedliche Verhaltensweisen an, und Sie können das Ganze in eine Schleife einfügen. Sie können sehr leistungsfähige Filter schreiben, die Teile Ihrer Eingabe in verschiedene Dateien schreiben oder ganz löschen. oder ergreifen Sie Aktionen und führen Sie andere Skripte aus, je nachdem, was in Ihrer Eingabe enthalten ist.

Es kommt also darauf an, warum Sie versuchen, Ihre Protokolldateien zu filtern, Maßnahmen zur Protokolleingabe zu ergreifen oder nur aus Archivierungsgründen?


3
2018-05-18 03:22



Plus eins für die Referenz zu Expect, die ich schon lange benutzt habe und komplett vergessen habe. - MPi