Ich möchte tail -f
meine Protokolle. Ich möchte jedoch alles herausfiltern, was die folgenden Wörter enthält:
"ELB", "Pingdom", "Gesundheit"
Ich möchte tail -f
meine Protokolle. Ich möchte jedoch alles herausfiltern, was die folgenden Wörter enthält:
"ELB", "Pingdom", "Gesundheit"
Antworten:
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 egrep
anstelle von grep -E
fü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 -E
Switch. Laut der GNU grep-Manpage:
[…] Zwei Variantenprogramme
egrep
undfgrep
stehen zur Verfügung.egrep
ist das gleiche wiegrep -E
.fgrep
ist das gleiche wiegrep -F
. Direkter Aufruf als entwederegrep
oderfgrep
veraltet, 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 -E
Syntax zu verwenden, da die andere Methode offiziell veraltet ist.
grep -E
statt egrep
eine doppelte Antwort?
sed
, awk
, perl
, multitail
oder ninja_foo
.
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 multitail
Ninja 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
.
Warum möchten Sie diese Informationen protokollieren?
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.