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?
grep
kann mehr als ein Dateiargument annehmen.Antworten:
quelle
grep
Verzeichnisse ü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)find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Sie könnten so etwas verwenden:
Dies findet jede Datei mit
.log
der Erweiterung und wendet dengrep
Befehl an.quelle
xargs
und der Möglichkeit schwerwiegender Unterbrechungen von Leerzeichen in Dateinamen befassen, wenn man sie nur verwenden kannfind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?Wenn es einfacher ist, können Sie einfach jede Datei nacheinander angeben.
quelle
Wenn Sie nach einer beliebigen Gruppe von Dateinamen suchen müssen, die nicht mit einem regulären Ausdruck abgerufen werden können:
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.
quelle
Wenn Sie auch in Unterverzeichnissen rekursiv suchen möchten, können Sie den folgenden Befehl verwenden
Es wird auch rekursiv in Unterverzeichnissen gesucht
quelle
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
Szenario 2: Überwachen Sie MEHRERE Zeichenfolgen in nur EINER Protokolldatei
Szenario 3: Überwachen Sie einzelne / mehrere Zeichenfolgen in mehreren Protokolldateien
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:
Wenn Sie '-ndfoundmul' verwenden, erhalten Sie eine Ausgabe ähnlich der folgenden:
Lösung für das Problem mit dem Originalposter: In mehreren Protokolldateien nach mehreren Zeichenfolgen suchen
Betriebssysteme: Dies wurde unter Ubuntu und Red Hat getestet
quelle
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.
quelle
grep
Fähigkeiten beantworten können , also viel Glück für Ihre USE-Karriere!-E
und-F
können nicht gleichzeitig verwendet werden, sie sind widersprüchlich (Tippfehler?).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 erstelltproduct.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 dasgrep '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
cp
z. B. in.quelle
Sie können auch geschweifte Klammern verwenden, wenn sich alle Dateien im selben Ordner befinden.
Siehe ein Beispiel
Wenn Sie dem grep ein s hinzufügen, werden Fehler wegen fehlender Dateien unterdrückt
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
Archivierte E-Mail-Protokolle mit 2> / dev / null, um zgrep fehlende .gz-Warnungen zu unterdrücken
Referenz: Gibt es eine Möglichkeit, auf mehrere Dateien in einem Verzeichnis zu verweisen, ohne den gesamten Pfad erneut eingeben zu müssen?
quelle