Wie kann ich in tail -f Dinge herausfiltern, die bestimmte Schlüsselwörter enthalten?


Antworten:


58

Ich weiß nicht, wie man awk anstelle von grep benutzt, aber das funktioniert bei mir:

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

BEARBEITEN : Wie Dmourati und Caleb betonten , könnten Sie auch egrepanstelle von grep -Efür die Bequemlichkeit verwenden. Auf einigen Systemen ist dies ein Link zu derselben Binärdatei, auf anderen eine Kopie davon, die vom grep-Paket bereitgestellt wird. In jedem Fall ist es eine Alternative zum -ESwitch. Laut der GNU grep-Manpage:

[…] Zwei Variantenprogramme egrepund fgrepstehen zur Verfügung. egrepist das gleiche wie grep -E. fgrepist das gleiche wie grep -F. Direkter Aufruf als entweder egrepoder fgrepveraltet, wird jedoch bereitgestellt, damit historische Anwendungen, die darauf angewiesen sind, 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 egrep. Aus Gründen der Aufwärtskompatibilität wird jedoch empfohlen, die grep -ESyntax zu verwenden, da die andere Methode offiziell veraltet ist.


Erlaubt die Verwendung grep -Estatt egrepeine doppelte Antwort?
Caleb

@Caleb Ich verstehe nicht, warum nicht. Es gibt mehr als eine Möglichkeit, eine Katze zu häuten, und auf dieser Website können alle
aufgelistet werden

1
Ja, aber es handelt sich lediglich um symbolische Verknüpfungen, nicht um zwei verschiedene Programme mit funktionaler Überschneidung. Wäre das nicht eher ein 'Nachtrag' (lesen: Kommentar), keine vollständige Antwort? Ich hatte Abstimmungen für kleinere Straftaten ...
Marcin

@DTest: Von Rechts wegen schlug mich Dmourati tatsächlich um ein paar Sekunden und obwohl er die Argumentation nicht erklärte, verdient er hier etwas Anerkennung. Du warst deutlich zu spät zur Party, da wir beide mindestens zwei positive Stimmen hatten, bevor du reinkamst. Das Ändern der Syntax von einer symbolisch verknüpften Binärdatei in ein Argument ist normalerweise etwas, für das du einen Kommentar verwenden würdest, keine separate Antwort. Wenn Sie die Katze anders Haut wollen verwenden sed, awk, perl, multitailoder ninja_foo.
Caleb

1
@DTest: Ich habe mir die Freiheit genommen, Ihre Antwort in wesentlichen Fakten zu bearbeiten, um einige Originalquellen hinzuzufügen. Es sieht so aus, als würde -E für die zukünftige Verwendung empfohlen. Ich habe das markiert, aber Ihren Hinweis zu Distributionen, die kein egrep haben, entfernt. Die erwähnten Distributionen haben egrep, es ist nur eine separate Binärdatei anstelle eines Symlinks.
Caleb

21

Versuchen Sie, es mit einer durch Pfeifen getrennten Liste von Wörtern zu versehen, die Sie herausfiltern möchten:

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

Beachten Sie, dass die Verwendung von Klammern in der Liste der Übereinstimmungen optional ist. Da das |von grep als logischer ODER-Operator behandelt wird, ob es als Teil einer Untergruppe auftritt oder nicht. '(ELB|Pingdom|Health)'würde genauso funktionieren. Für einige ist die Syntax möglicherweise offensichtlicher. Ich finde es einfacher, ohne zu tippen, da ich von einer einzelnen Übereinstimmung zu einer Liste möglicher Übereinstimmungen wechseln kann, ohne die Klammern hinzuzufügen.

Für zusätzliches Guthaben ist zu erwähnen, dass multitailNinja Foo beim Filtern der Ausgabe keine Rolle spielt. Zum Beispiel könnten Sie so nach Ihren Wörtern filtern:

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

Sie können sie auch verwenden, um die Ausgabe einzufärben oder auf andere Weise hervorzuheben, anstatt sie nur zu filtern.

BEARBEITEN: Siehe DTests Antwort und die Kommentare für die vollständige Erklärung, wie egrep nur eine veraltete Alternative zum Abfeuern ist grep -E.


2
sollte der Ausdruck nicht mit (') enden, nicht mit (")?
bbaja42

Ja danke das war ein Tippfehler. Zum späteren Nachschlagen, da Stapelaustausch-Sites wie Wikis funktionieren, können Sie dies einfach beheben.
Caleb

Ich dachte der Schnitt müsste mehr als 6 Zeichen sein?
Sirex

Wenn Sie keine hohen Wiederholungen haben, gibt es ein Minimum von 6 Zeichen, aber in diesem Fall ist das Zeichen 1 überaus wichtig. Sie können die Änderung erzwingen, indem Sie dem Text einen HTML-Kommentar hinzufügen. Die Zeichen zählen bis zum Limit, und Sie können feststellen, warum Sie die Änderung vornehmen.
Caleb

@Caleb vielen Dank für den Multitail-Vorschlag, es ist fantastisch ! Ich kann nicht glauben, dass ich so lange in meinem Leben ohne ging.
Sidewinderguy


3

Warum möchten Sie diese Informationen protokollieren?

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

Wenn Sie abhängig vom Inhalt der Protokolldateien ein Skriptverhalten wünschen, können Sie Ihre Filterung mit Expect durchführen. ( http://en.wikipedia.org/wiki/Expect ) Expect ist eine Tcl-Erweiterung, es gibt jedoch auch eine Python-Version von Expect.

Mit Expect erhalten Sie diese leistungsstarke, flexible switch-ähnliche Anweisung, mit der Sie abhängig von den in Ihrem Eingabestream vorhandenen Status oder Mustern unterschiedliche Verhalten unter bestimmten Bedingungen angeben können. Beispielsweise:

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. Sie können das Ganze in eine Schleife einschließen und auf einfache Weise sehr leistungsstarke Filter schreiben, die auch Teile Ihrer Eingaben in verschiedene Dateien schreiben oder sie ganz löschen. oder ergreifen Sie Maßnahmen 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 bei der Protokolleingabe zu ergreifen oder nur aus Archivierungsgründen.


Plus eins für den Verweis auf Expect, den ich vor ziemlich langer Zeit benutzt und komplett vergessen hatte.
MPi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.