/ / Muster in mehreren Protokolldateien suchen? - Regex, Linux, Bash, Shell, Unix

Suchen Sie nach Mustern in mehreren Protokolldateien? - Regex, Linux, Bash, Shell, Unix

Ich habe acht Protokolldateien im folgenden Format:

log01:

[Tue Feb 24 07:39:37 2015] *** MARK ***
[Tue Feb 24 07:40:38 2015] *** MARK ***
[Wed Feb 25 17:13:33 2015] *** MARK ***
[Wed Feb 25 17:14:09 2015] *** MARK ***
[Wed Feb 25 17:16:46 2015] *** MARK ***
[Wed Feb 25 17:17:48 2015] *** MARK ***
[Wed Feb 25 17:22:31 2015] *** MARK ***
[Wed Feb 25 19:10:36 2015] *** MARK ***
[Wed Feb 25 19:10:52 2015] *** MARK ***
[Wed Feb 25 19:11:08 2015] *** MARK ***
[Wed Feb 25 19:11:34 2015] *** MARK ***
[Wed Feb 25 19:12:00 2015] *** MARK ***
[Wed Feb 25 19:12:26 2015] *** MARK ***
[Wed Feb 25 19:13:17 2015] *** MARK ***
[Wed Feb 25 19:13:33 2015] *** MARK ***
[Wed Feb 25 19:15:05 2015] *** MARK ***
[Wed Feb 25 19:37:53 2015] *** MARK ***
[Wed Feb 25 19:38:19 2015] *** MARK ***
[Wed Feb 25 19:38:35 2015] *** MARK ***
[Wed Feb 25 23:08:47 2015] *** MARK ***
[Wed Feb 25 23:09:28 2015] *** MARK ***
[Wed Feb 25 23:11:55 2015] *** MARK ***
[Wed Feb 25 23:12:21 2015] *** MARK ***
[Wed Feb 25 23:12:52 2015] *** MARK ***
[Wed Feb 25 23:13:08 2015] *** MARK ***
...

log02:

[Wed Feb 25 07:01:39 2015] *** MARK ***
[Wed Feb 25 17:13:49 2015] *** MARK ***
[Wed Feb 25 17:15:20 2015] *** MARK ***
[Wed Feb 25 17:16:47 2015] *** MARK ***
[Wed Feb 25 17:17:38 2015] *** MARK ***
[Wed Feb 25 17:19:56 2015] *** MARK ***
[Wed Feb 25 17:22:53 2015] *** MARK ***
[Wed Feb 25 19:10:47 2015] *** MARK ***
[Wed Feb 25 19:11:13 2015] *** MARK ***
[Wed Feb 25 19:11:34 2015] *** MARK ***
[Wed Feb 25 19:11:50 2015] *** MARK ***
[Wed Feb 25 19:12:11 2015] *** MARK ***
[Wed Feb 25 19:12:37 2015] *** MARK ***
[Wed Feb 25 19:12:53 2015] *** MARK ***
[Wed Feb 25 19:13:14 2015] *** MARK ***
[Wed Feb 25 19:13:40 2015] *** MARK ***
[Wed Feb 25 19:14:06 2015] *** MARK ***
[Wed Feb 25 19:14:22 2015] *** MARK ***
[Wed Feb 25 19:14:38 2015] *** MARK ***
[Wed Feb 25 19:38:30 2015] *** MARK ***
[Wed Feb 25 21:17:08 2015] *** MARK ***
[Wed Feb 25 23:08:56 2015] *** MARK ***
[Wed Feb 25 23:10:37 2015] *** MARK ***
[Wed Feb 25 23:11:08 2015] *** MARK ***
[Wed Feb 25 23:11:24 2015] *** MARK ***
[Wed Feb 25 23:12:20 2015] *** MARK ***
[Wed Feb 25 23:12:46 2015] *** MARK ***
...

Jede Protokolldatei wird von einer Instanz der generiertdasselbe Programm liest verschiedene Sensoren. Ein Protokolleintrag wird erstellt, wenn ein Sensor ein Problem erkennt. Wenn jeder Sensor innerhalb von etwa einer Minute ein Problem erkennt, weist dies auf ein globales Problem hin. Zum Beispiel:

Die Protokolleinträge [Tue Feb 24 07:39:37 2015] *** MARK *** und [Tue Feb 24 07:40:38 2015] *** MARK *** from log01 entspricht nichts in log02, daher ist dies kein globales Problem und kann ignoriert werden. Die Protokolleinträge [Wed Feb 25 07:01:39 2015] *** MARK *** und [Wed Feb 25 21:17:08 2015] *** MARK *** in log02 kann auch ignoriert werden.

Eintrag jedoch [Wed Feb 25 19:10:36 2015] *** MARK *** in log01 und [Wed Feb 25 19:10:47 2015] *** MARK *** in log02 ist innerhalb einer Minute, was auf ein globales Problem hinweist, das bis zur Eingabe anhält [Wed Feb 25 19:15:05 2015] *** MARK *** in log01 und [Wed Feb 25 19:14:38 2015] *** MARK *** in log02. Daraus kann ich schließen, dass zwischen 19:10 und 19:15 Uhr am 25. Februar etwas nicht stimmte.

Ich bin auf der Suche nach Vorschlägen und Tipps zur Lösung dieses Problems, vorzugsweise mithilfe von UNIX-Dienstprogrammen.

Antworten:

0 für die Antwort № 1

Ich denke, der elegante Weg wäre, Perl zu verwenden, um alle Dateien einzulesen und eine Reihe von Listen zu erstellen. Das erste Array wird durch die auf die nächste Minute gerundete Zeit indiziert, und Sie drücken a 1 auf die Liste zu einem bestimmten Zeitpunkt, wenn Sie aus lesen file01 und ein 2 wenn du liest aus file02. Am Ende würden Sie dann das erste Array durchlaufen und nach Listen suchen, deren Länge größer als eins ist. EIN Perl tag könnte da weiterhelfen.

Wenn Sie Perl nicht mögen, können Sie etwas Unbeholfeneres zusammenstellen.

Schritt 1: Wählen Sie eine Startzeit vor dem frühesten gewünschten Zeitpunkt.

Schritt 2: Analysieren Sie jede Datei und geben Sie eine Zeile pro Minute der Eingabedaten aus. Diese Zeile ist entweder 0 oder 1, je nachdem, ob ein Problem vorliegt oder nicht. Eine Zeile pro Minute stellt sicher, dass alle Dateien vorhanden sind ausrichten Übereinstimmung der Minute über alle 8.

Schritt 3: Verwenden Sie paste So fügen Sie alle 8 Ausgabedateien zusammen:

paste -d, file{1..8}

1,0,1,1,1,0,1,1
1,1,1,1,1,1,1,1
0,0,1,1,0,0,0,1
0,1,1,1,0,1,0,1
0,0,1,1,0,0,0,1
0,1,1,1,0,1,0,1
1,0,1,1,1,0,1,1
1,1,1,1,1,1,1,1

Schritt 4: Verwenden Sie awk um nach Zeilen zu suchen, die mehr als 1 ergeben.


0 für die Antwort № 2

Sie können so etwas ausprobieren:

#!/bin/bash

for n in $(awk -F" " "{print $4;}" log01 | cut -c1-5)
do
if (grep -q $n log02)
then
echo "Error on $n"
fi
done
  • Der Befehl awk -F" " "{print $4;}" log01 | cut -c1-5 extrahiert die Stunde (hh:mm) von deiner log01 Datei.
  • grep -q $n log02 Suchen Sie nach dieser Stunde und melden Sie und Fehler, wenn es gefunden wird.