So prüfen Sie eine Protokolldatei innerhalb eines bestimmten Zeitraums

22

Ich habe eine Protokolldatei, jeder Zeile im Protokoll wird ein Datum vorangestellt, wie folgt:

2012-03-06 11:34:48,657 blah blah blah...

Wie kann ich grepdiese Datei und nur die Zeilen von 8 bis 23 Uhr bekommen?

Ich möchte die Anzahl der Fehler zählen, die zwischen 8 und 23 Uhr auftreten.

Rosdi
quelle

Antworten:

24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

Ausführliche Erläuterungen finden Sie in verschiedenen gefunden werden regex (regular expression) Tutorials; egrepverwendet die Syntax "POSIX extended" ( man 7 regex).

  • Das erste ^bedeutet "Beginn der Linie".

  • [^ ]+ Stimmt einfach mit dem Datumsfeld überein, unabhängig vom tatsächlichen Datum.

    • [...]bedeutet "ein beliebiges Zeichen zwischen den Klammern", entspricht also [89]entweder 8oder 9; [0-9]ist eine beliebige Zahl und [^ ]nichts anderes als ein Leerzeichen (wegen der ^inneren Klammern).

    • +Mittel „ein oder mehrere der vorherigen“ (beispielsweise a+würde übereinstimmen a, aaaund aaaaaaaa).

    • Beginnt also ^[^ ]+mit dem Zeilenanfang und passt auf so viele Nicht-Leerzeichen wie möglich.

  • (...|...|...)bedeutet "eines der angegebenen Muster", (0[89]|1[0-9]|2[012])bedeutet also "entweder 0[89]oder 1[0-9]oder 2[012]". Es werden alle Zahlen von 08 bis 22 abgeglichen.


Eine etwas bessere Option ist:

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

Die -FOption unterteilt jede Zeile in separate Felder, je nach [: ]Regex (entspricht entweder :einem Leerzeichen oder einem Leerzeichen), und das awk- Skript überprüft die 2. Spalte (die Stunde).

Grawity
quelle
Hallo, es funktioniert ... aber kannst du eine kleine Erklärung hinzufügen, wie es funktioniert? Ich verstehe das ^[^ ]+Teil nicht ..
Rosdi
20

Warum grep benutzen? Sie können einfach sed verwenden.

Beispiel:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

Dadurch werden alle Protokolle zwischen June 17 13:39:54und gedrucktJune 18 10:50:28

Nima G
quelle
1
Ich denke, das OP möchte alle Protokolle zwischen 8 und 23 Uhr, aber nur die eines bestimmten Tages.
Dennis
1
Das kann er auch. Beispiel: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G
1
Böser Tippfehler. Ich meinte: nicht die von einem bestimmten Tag.
Dennis
2
Das Problem bei diesem Ansatz ist, dass die Protokolldatei eine Zeile mit diesem Zeitstempel enthalten muss. Wenn im obigen Beispiel keine Zeile mit dem Zeitstempel 2012-03-06 11:34:48 vorhanden ist, wird nichts gedruckt. Der obige awk-Ansatz würde in solchen Fällen funktionieren (dh Sie möchten alle Protokolle mit einer Stunde zwischen 8 und 11, wissen jedoch nicht, ob es zum Zeitpunkt 2012-03-06 08:00:00 einen Protokolleintrag gibt, oder irgendetwas dafür Stunde überhaupt).
user650654
0

Es gibt tatsächlich einen viel einfacheren Weg, dies zu tun.

Download / Dokumentation: autodrgrep.kl.sh

Befehl:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

Erläuterung:

  • autodrgrep.kl.sh ist der Werkzeugname.

  • notchef ist eine Option, die an das Tool übergeben wird, um ihm mitzuteilen, was zu tun ist. In diesem speziellen Fall teilt es dem Tool mit, um welchen Typ von Protokolldatei /tmp/client.log es sich handelt.

  • /tmp/client.log ist natürlich die Protokolldatei.

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 ist der Datumsbereich innerhalb des Protokolls, das Sie scannen möchten

  • "INFO" ist eine der Zeichenfolgen in den Protokollzeilen, an denen Sie interessiert sind.

  • "a2ensite" ist eine weitere Zeichenfolge in derselben Zeile, in der Sie die Zeichenfolge "INFO" erwarten. Wenn Sie diese beiden Zeichenfolgen (INFO und a2ensite) angeben, werden die gewünschten Zeilen viel schneller isoliert und verarbeitet, insbesondere, wenn Sie mit einer großen Protokolldatei arbeiten.

  • 5 gibt Warnung an. Wenn Sie 5 angeben, weisen Sie das Programm an, als WARNUNG zu benachrichtigen, wenn die von Ihnen angegebenen Suchzeichenfolgen mindestens 5 Mal vorkommen

  • 10 gibt Kritisch an. Wenn Sie 10 angeben, weisen Sie das Programm an, als KRITISCH zu warnen, wenn die von Ihnen angegebenen Suchzeichenfolgen mindestens 10 Mal vorkommen.

  • -show gibt an, welche Art von Antwort Sie erhalten. Wenn Sie -show angeben, sagen Sie, wenn etwas gefunden wird, das mit den angegebenen Mustern übereinstimmt, wird es auf dem Bildschirm ausgegeben.

Probelauf:

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

Was ist, wenn der vom Benutzer angegebene Zeitraum oder Zeitraum nicht im Protokoll enthalten ist?

Jeder Lauf des obigen Befehls hat immer eine Zeile (letzte Zeile der Ausgabe), in der entweder "ATWFILF" oder "ETWNFILF" steht.

  • ATWFILF bedeutet, dass der von Ihnen angeforderte tatsächliche Zeitraum oder Zeitraum im Protokoll gefunden wurde. Das ist also sehr gut.

  • ETWNFILF bedeutet, dass der tatsächliche Zeitraum oder Zeitraum, den Sie gesucht haben, NICHT im Protokoll gefunden wurde. In diesem Fall wird die Zeit ermittelt, die der von Ihnen angegebenen Zeit am nächsten kommt, und stattdessen verwendet.

SimplifiedWork
quelle