Wie grep für die gleiche Zeichenfolge, aber mehrere Dateien zur gleichen Zeit?

57

Ich habe eine Reihe von Protokolldateien, die ich überprüfen muss, und ich möchte auf einmal nach bestimmten Zeichenfolgen für dieselben Dateien suchen. 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?

user53029
quelle
2
grepkann mehr als ein Dateiargument annehmen.
Jw013

Antworten:

61
grep -E 'fatal|error|critical|failure|warning|' *.log
JigarGandhi
quelle
Wie kann ich grepVerzeichnisse überspringen und trotzdem alle Dateien rekursiv überprüfen? grep -E 'text' **/*funktioniert, gibt aber eine Fehlermeldung für jedes Unterverzeichnis aus (und überprüft dann alle darin enthaltenen Dateien korrekt)
Jorn
4
@Jorn, wirklich solltest du eine neue Frage stellen, aber verwendefind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard
20

Sie könnten so etwas verwenden:

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

Dies findet jede Datei mit .logder Erweiterung und wendet den grepBefehl an.

jherran
quelle
Das war zu einfach :) Eigentlich sind alle meine Dateien .log, so dass "grep -E 'fatal | error | critical | failure | warning' * .log auch funktioniert. Danke!
user53029
1
Was für ein großer Aufwand an Verständnis / Anpassung user53029!
Gilles Quenot
1
Warum sollte man sich mit xargsund der Möglichkeit schwerwiegender Unterbrechungen von Leerzeichen in Dateinamen befassen, wenn man sie nur verwenden kann find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Wildcard
16

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

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
Flackerfliege
quelle
2
So einfach, aber suchte zu lange danach: 0
Adam Hughes
3

Wenn Sie nach einer beliebigen Gruppe von Dateinamen suchen müssen, die nicht mit einem regulären Ausdruck 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 diese dann einfügen.

Diego Pino
quelle
1

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

Es wird auch rekursiv in Unterverzeichnissen gesucht

egrep -r "string1|string2" pathname
Praveen Kumar BS
quelle
1
in Bezug auf egrep
Jeff Schaller
0

Dies war eine sehr zeitaufwendige 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 unter folgendem Link heruntergeladen werden:

Protokollsuchskript herunterladen

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

Szenario 1: Überwachen Sie EINE Zeichenfolge 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 ODER - Es ersetzt die Pipe "|" Symbol, da es weniger wahrscheinlich ist, dass Sie nach einer Zeichenfolge suchen müssen, die "_P_" enthält. Wenn Sie "_P_" nicht eingeben möchten, können Sie _P_ einfach durch "|" ersetzen.

Bei Verwendung dieses Skripts werden folgende Parameter häufig geändert:

  1. Die zu überwachende Protokolldatei oder das zu überwachende Protokollverzeichnis
  2. Das Alter einer Protokolldatei muss angegeben sein, damit sie überwacht werden kann. Sie darf keine Protokolldatei mit einem Zeitstempel von mehr als 60 Minuten überwachen oder erkennen
  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 über die Protokolldatei (en) 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:

[root@dgphxtest001]# ./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 mit dem Originalposter: In mehreren Protokolldateien nach mehreren Zeichenfolgen 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

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

Dadurch wird in den Dateien, deren Name mit "log_file?" Beginnt, nach "schwerwiegend oder fehlerhaft oder kritisch oder fehlerhaft oder Warnung oder Suchzeichenfolge" gesucht. und die Erweiterung 'lo ' * im Pfad / path / to / the / file / und geben Sie der Suchzeichenfolge eine zufällige Farbe und Druckzeilennummer, unter der sie gefunden wurde.

Obaid
quelle
Sicher, dies ist eine funktionierende Antwort, aber der Benutzer, der nach einem Muster gesucht hat, hat mit einer festen Suchzeichenfolge geantwortet. Tut mir leid, aber das Hinzufügen von Dingen, die nicht gewünscht wurden, wie die Zeilennummerierung und die Färbung der Ergebnisse, wird eine Antwort wahrscheinlich nicht vorteilhafter machen. Es wird aber noch andere Fragen geben, die wahrscheinlich Ihre grepFähigkeiten beantworten können , also viel Glück für Ihre USE-Karriere!
Zagrimsan
@zagrimsan Punkt genommen, habe ich das -E 'fatal | error | critical | failure | warning |' hinzugefügt param darauf.
Obaid
Und hey, er hat speziell nach mehreren Dateien gefragt, nicht nach einem Suchmuster. Bitte lesen Sie die Frage noch einmal.
Obaid
Zitat aus dem F: "suchspezifische Zeichenfolgen", und die Frage zeigt das von ihm verwendete Suchmuster (das mehrere übereinstimmende Zeichenfolgen enthält). Sie haben Recht, dass der Titel der Frage leicht von dem abweicht, was er wirklich verlangt. Übrigens, -Eund -Fkönnen nicht gleichzeitig verwendet werden, sie sind widersprüchlich (Tippfehler?).
Zagrimsan
0

Die Antwort von JigarGandhi zeigt die Verwendung des Sternchen-Platzhalters. Es gibt mehr von ihnen und Sie können sie hier oder durch Laufen sehen man 7 glob.

Einer von ihnen, den ich nützlich fand, ist der Bereich, der mit zusammenpasst []. Da das System, an dem ich arbeite, z. B. fortlaufend nummerierte Protokolldateien erstellt product.log.1 product.log.2 ... product.log.200, ist es praktisch, mit einem einzigen Befehl auf 3 oder 4 fortlaufende Dateien zuzugreifen, jedoch nicht 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 stehen, damit die Antwort von flickerfly vereinfacht wird

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, wie cpz. B. in.

Stelios Adamantidis
quelle
0

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 wegen fehlender Dateien unterdrückt

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

Ich habe gerade selbst damit experimentiert, um Befehle auszuführen, die in mehreren Distributionen funktionieren, wobei sie sich aufgrund von Unterschieden im Betriebssystem in einer Datei gegenüber der anderen befinden.

E-Mail-Protokolle

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

Archivierte E-Mail-Protokolle mit 2> / dev / null, um zgrep fehlende .gz-Warnungen 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 eingeben zu müssen?

Mike
quelle