it-swarm.com.de

Wie greife ich nach derselben Zeichenfolge, aber mehreren Dateien gleichzeitig?

Ich habe eine Reihe von Protokolldateien, die ich überprüfen muss, und ich möchte bestimmte Zeichenfolgen für dieselben Dateien gleichzeitig durchsuchen. Ist dies möglich? Zur Zeit benutze ich

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

Wie verwende ich dies und suche nach den Zeichenfolgen mehrerer Dateien gleichzeitig? Wenn dies ein Skript sein muss, kann jemand ein einfaches Skript bereitstellen, um dies zu tun?

66
user53029
grep -E 'fatal|error|critical|failure|warning|' *.log
68
JigarGandhi

Sie könnten so etwas verwenden:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

Dies findet jede Datei mit .log als Erweiterung und wenden Sie den Befehl grep an.

23
jherran

Wenn es einfacher ist, können Sie einfach jede Datei nacheinander angeben.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
20
flickerfly

Wenn Sie nach einem beliebigen Satz von Dateinamen suchen müssen, die von einem regulären Ausdruck nicht abgerufen werden können:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

Was ist der Vorteil gegenüber dem Einfügen der Dateinamen nacheinander? Sie können die Dateinamenliste in eine Textdatei kompilieren und dann einfügen.

3
Diego Pino

Wenn Sie auch rekursiv in Unterverzeichnisdateien suchen möchten, können Sie den folgenden Befehl verwenden

Es wird auch rekursiv in Unterverzeichnisdateien gesucht

egrep -r "string1|string2" pathname
1

JigarGandhis Antwort demonstriert die Verwendung des Sternchen-Platzhalters. Es gibt mehr von ihnen und Sie können sie sehen hier oder indem Sie man 7 glob.

Eine davon, die ich nützlich fand, ist die Bereichsübereinstimmung mit []. Da das System, an dem ich arbeite, fortlaufend nummerierte Protokolldateien erzeugt, z. B. product.log.1product.log.2...product.log.200, es ist praktisch, mit einem einzigen Befehl nach 3 oder 4 aufeinanderfolgenden Dateien zu greifen, aber nicht nach mehr. Also das

grep 'whatever' product.log.[5-7]

wird nach allen Dateien suchen, die mit product.log enden. 5, 6 oder 7. Der Platzhalter muss nicht am Ende sein, damit Antwort von flickerfly vereinfacht werden kann

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

Beachten Sie auch, dass diese Platzhalter auch in anderen Befehlen verwendet werden können, beispielsweise in cp.

0

Dies war eine sehr zeitaufwändige Aufgabe. Und ja, es musste unbedingt ein Skript erstellt werden, wenn Sie nach mehreren Zeichenfolgen in mehreren verschiedenen Protokollen gleichzeitig suchen möchten. Aber ich musste das kürzlich tun und es war ziemlich schmerzhaft. Trotzdem ist es fertig und kann über den folgenden Link heruntergeladen werden:

Download des Protokollsuch-Skripts

Die Art und Weise, wie das funktioniert, ist ziemlich einfach.

Szenario 1: Überwachen Sie EINEN String in nur EINER Protokolldatei

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

Szenario 2: Überwachen Sie MEHRERE Zeichenfolgen in nur EINER Protokolldatei

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

Szenario 3: Überwachen Sie einzelne/mehrere Zeichenfolgen in mehreren Protokolldateien

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

Anmerkungen:

Das _P_ bedeutet OR - Es ersetzt das Pipe-Symbol "|", da es weniger wahrscheinlich ist, dass Sie nach einer Zeichenfolge suchen müssen, die "_P_" enthält. Wenn Sie nicht "_P_" eingeben möchten können Sie einfach das _P_ durch "|" ersetzen.

Wenn Sie dieses Skript verwenden, ändern Sie häufig folgende Parameter:

  1. Die zu überwachende Protokolldatei oder das Protokollverzeichnis
  2. Das Alter einer Protokolldatei muss sein, damit sie überwacht werden kann. Überwachen oder entdecken Sie keine Protokolldateien mit einem Zeitstempel von mehr als 60 Minuten
  3. Die Zeichenfolgen/Muster, auf die Sie achten möchten
  4. Das Tag - Dies ist das vorletzte Argument, das Sie angeben müssen. Es zeichnet Statistiken zu den Protokolldateien auf, die Sie unter/var/tmp/logXray überwachen
  5. Die Protokolloption -ndshow - Dies ist der Parameter, den Sie verwenden möchten, wenn Sie die Einträge aus den gefundenen Protokollen ausgeben möchten, die mit den von Ihnen angegebenen Mustern übereinstimmen. Wenn Sie nur die Gesamtzahl der gefundenen Muster anzeigen möchten, ersetzen Sie einfach '-ndshow' durch '-ndfoundmul'.

Wenn Sie '-ndfoundmul' verwenden, erhalten Sie eine Ausgabe ähnlich der folgenden:

[[email protected]]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

Lösung für das Problem des Originalplakats: Nach mehreren Zeichenfolgen in mehreren Protokolldateien suchen

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

Betriebssysteme: Dies wurde unter Ubuntu und Red Hat getestet

0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

Dies sucht nach 'schwerwiegend oder fehlerhaft oder kritisch oder fehlgeschlagen oder Warnung oder Suchzeichenfolge' in den Dateien mit dem Namen beginnend mit 'log_file?' und der Erweiterung 'lo' * im Pfad / path/to/the/file / und geben Sie der Suchzeichenfolge eine zufällige Farbe und drucken Sie die Zeilennummer, unter der sie gefunden wurde.

0
Obaid

Sie können auch geschweifte Klammern verwenden, wenn sich alle Dateien im selben Ordner befinden.

Siehe ein Beispiel

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Wenn Sie dem grep ein s hinzufügen, werden Fehler bei fehlenden Dateien unterdrückt

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Ich habe selbst damit experimentiert, um Befehle auszuführen, die über mehrere Distributionen hinweg funktionieren, wobei sie sich aufgrund von Betriebssystemunterschieden in einer Datei gegenüber der anderen befinden.

Mail-Protokolle

Sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Archivierte Mail-Protokolle mit 2>/dev/null, um fehlende .gz-Warnungen von zgrep zu unterdrücken

Sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

Referenz: Gibt es eine Möglichkeit, auf mehrere Dateien in einem Verzeichnis zu verweisen, ohne den gesamten Pfad erneut einzugeben?

0
mike