Zeilen der letzten 10 Minuten mit spezifischem Muster in Protokollen anzeigen

Zeilen der letzten 10 Minuten mit spezifischem Muster in Protokollen anzeigen

Ich muss Zeilen mit „In den letzten 10 Minuten ist ein Fehler aufgetreten“ einer Protokolldatei anzeigen.

Aug 26 10:50:42 Normal line.
Aug 26 10:51:23 Normal line.
Aug 26 10:55:33 Error line.
Aug 26 10:56:45 Normal line.
Aug 26 10:58:12 Error line.
Aug 26 11:02:31 Normal line.
Aug 26 11:03:32 Normal line.
Aug 26 11:04:11 Normal line.

Nehmen wir das obige Beispiel einer Protokolldatei an. Ich möchte nur die folgenden zwei Zeilen anzeigen

Aug 26 10:55:33 Error line.
Aug 26 10:58:12 Error line.

Ich verwende AIX.

Antwort1

Mit einem Hut-Tipp an Stéphane Chazelas für seine beiden Antworten hier:

Ich schlage eine Brute-Force-Lösung vor, die alle möglichen Zeitstempeleinträge der letzten 10 Minuten durchläuft:

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%(%b %d %H:%M:%S)T\n' "$i seconds ago")
  grep "^${d} Error" logfile
done

Es ist Brute-Force, weil es grep601 Mal aufruft (und printf, ein integriertes Programm). Es erfordert ein ksh93, das die printf- %TOption zum Drucken (und Formatieren) beliebiger Zeitstempel unterstützt. Es ist jedoch einfacher, als die Datumsberechnung selbst durchzuführen, da es Randfälle gibt wie:

  • Tagesgrenzen
  • Monatsgrenzen
  • mögliche Sommerzeitänderungen

Antwort2

Eine Möglichkeit hier, die Lösung von @Jeff Schaller schamlos zu kopieren. Einzelner Aufruf von grep, also vielleicht etwas schneller.

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%s|%(%b %d %H:%M:%S)T' "${d}" "${i} seconds ago")
done
grep -E "^(${d:1}) Error" logfile

Antwort3

Vielen Dank für alle Antworten. Ich habe die erforderliche Arbeit mit dem folgenden Befehl erledigt.

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' logfile

wobei d1 und d2 oben initialisiert wurden. Hat bei mir funktioniert.

Prost.

Antwort4

Wenn Sie alle 10 Minuten die letzten 10 Minuten abrufen möchten, können Sie dieschnittmusterTool, mit dem Sie einen nicht sichtbaren Teil einer Protokolldatei drucken können. Zuerst speichern Sie die Dateiposition mit dem Befehl

$ cutthelog logfile > /dev/null

dann das Log per Cronjob verarbeiten zB

*/10 * * * * root cutthelog logfile | grep 'Error line' | ..."

Als zusätzlichen Vorteil müssen Sie bei jeder Prüfung nicht das gesamte Protokoll lesen.

verwandte Informationen