Ich habe eine Reihe von Protokolldateien, die ich überprüfen muss, und möchte bestimmte Zeichenfolgen für dieselben Dateien gleichzeitig durchsuchen. Ist dies möglich? Derzeit verwende 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?
Antwort
grep -E "fatal|error|critical|failure|warning|" *.log
Kommentare
- Wie kann ich
grep
dazu bringen, Verzeichnisse zu überspringen, aber trotzdem alle rekursiv zu überprüfen Dateien?grep -E 'text' **/*
funktioniert, gibt jedoch eine Fehlermeldung für jedes Unterverzeichnis aus (und überprüft dann alle darin enthaltenen Dateien korrekt) - @Jorn. Sie sollten wirklich eine neue Frage stellen. aber benutze
find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
- Ich bekomme
grep: invalid max count
, also habe ich jherrans answer
Antwort
Sie könnten Folgendes verwenden:
find . -name "*.log" | xargs grep -E "fatal|error|critical|failure|warning|"
Dies wird Suchen Sie jede Datei mit der Erweiterung .log
und wenden Sie den Befehl grep
an.
Kommentare
- Warum sich mit
xargs
und der Möglichkeit eines schweren Leerzeichenbruchs in Dateinamen beschäftigen, wenn Sie können einfachfind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
verwenden?
Antwort
Wenn ja ist einfacher, Sie können einfach jede Datei nacheinander angeben.
grep -E "fatal|error|critical|failure|warning" file1.log file2.log
Antwort
Wenn Sie brauchen So suchen Sie nach einem beliebigen Satz von Dateinamen, 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 dann einfügen.
Antwort
Sie können auch geschweifte Klammern verwenden, wenn Die Dateien befinden sich alle im selben Ordner.
Siehe Beispiel
grep -E "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Wenn Sie dem grep ein s hinzufügen, werden Fehler beim Fehlen unterdrückt files
grep -sE "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Ich habe gerade 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.
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
Antwort
Wenn Sie auch rekursiv in Unterverzeichnisdateien suchen möchten, können Sie den folgenden Befehl
verwenden Es wird rekursiv in Unterverzeichnisdateien gesucht s auch
egrep -r "string1|string2" pathname
Kommentare
Antwort
Dies war eine sehr zeitaufwändige Aufgabe. Und ja, es musste unbedingt ein Skript erstellt werden, wenn Sie gleichzeitig nach mehreren Zeichenfolgen in mehreren verschiedenen Protokollen suchen möchten. Aber ich musste dies kürzlich tun und es war ziemlich schmerzhaft. Trotzdem ist es fertig und bereit und kann kann über den folgenden Link heruntergeladen werden:
Protokollsuch-Skript herunterladen
Die Funktionsweise 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: Überwacht 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 einzelner / mehrerer 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
Hinweise:
Das _P_ bedeutet ODER – Es ersetzt die Pipe „|“ ymbol, weil 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 das _P_ einfach durch „|“ ersetzen.
Bei Verwendung dieses Skripts werden folgende Parameter häufig geändert:
- Die zu überwachende Protokolldatei oder das zu überwachende Protokollverzeichnis
- Das Alter Eine Protokolldatei muss vorhanden sein, damit sie überwacht werden kann. Sie dürfen keine Protokolldatei überwachen oder erkennen, deren Zeitstempel länger als 60 Minuten ist.
- Die Zeichenfolgen / Muster, auf die Sie achten möchten
- 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 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 wie:
[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 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.
Antwort
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto
Hiermit wird nach „schwerwiegend oder fehlerhaft oder kritisch oder fehlgeschlagen oder Warnung oder Suchzeichenfolge“ in den Dateien gesucht, deren Name mit „log_file?“ beginnt und die 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.
Kommentare
- Sicher, dies ist eine funktionierende Antwort, aber der Benutzer hat nach einer Suche mit a gefragt Muster haben Sie mit einer festen Suchzeichenfolge geantwortet. Tut mir leid, aber das Hinzufügen von Dingen, nach denen nicht gefragt wurde, wie z. B. die Zeilennummerierung und Färbung der Ergebnisse, macht eine Antwort wahrscheinlich nicht vorteilhafter. Aber es wird noch andere Fragen geben, die wahrscheinlich beantwortet werden können. Ihre
grep
Fähigkeiten, also viel Glück für Ihre USE-Karriere! - @zagrimsan Punkt genommen, ich ' habe das -E ' schwerwiegender | Fehler | kritischer | Fehler | Warnung | ' param dazu.
- Und hey, er hat speziell nach mehreren Dateien gefragt, nicht nach einem Suchmuster. Bitte lesen Sie die Frage noch einmal.
- Zitat aus dem F: " Suche nach bestimmten Zeichenfolgen ", und die Frage zeigt das Suchmuster (das mehrere übereinstimmende Zeichenfolgen enthält), das er verwendet. Sie haben Recht, dass der Titel der Frage etwas von dem abweicht, was er wirklich verlangt. Übrigens können
-E
und-F
' nicht gleichzeitig verwendet werden widersprüchlich (Tippfehler?).
Antwort
JigarGandhi „s Antwort demonstriert die Verwendung des Sternchen-Platzhalters. Es gibt mehr davon und Sie können sie hier oder durch Ausführen von .
Eine davon, die ich nützlich fand, ist der Bereich, der mit []
übereinstimmt. Da das System, an dem ich arbeite, ein fortlaufend nummeriertes Protokoll erstellt Dateien, z. B. product.log.1
product.log.2
...
product.log.200
Es ist praktisch, mit einem einzigen Befehl nach 3 oder 4 aufeinanderfolgenden Dateien zu greifen, aber nicht nach mehr. Dieses
grep "whatever" product.log.[5-7]
sucht nach allen Dateien, die mit product.log enden. 5, 6 oder 7. Der Platzhalter muss nicht am Ende stehen, damit die Antwort von flickerfly auf
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
.