Frage zu automatischer Logfile-Auswertung

Hallo,

ich experimentiere an einer automatischen Logfile-Auswertung.

jeden Tag läuft alle 2 Stunden ein Programm, dass in ein Logfile standardisierte Rückmeldungen schreibt

Day HH:MI:SS PID: --------------------------------------------
Day HH:MI:SS IDNr: Scriptpfad/Scriptname
Day HH:MI:SS IDNr: LoginUser:
Day HH:MI:SS IDNr:
Day HH:MI:SS IDNr: Scriptlauf erfolgreich/ mit Fehlern beendet
Day HH:MI:SS PID: --------------------------------------------
Day HH:MI:SS IDNr: Scriptpfad/Scriptname
Day HH:MI:SS IDNr: LoginUser:
Day HH:MI:SS IDNr:
Day HH:MI:SS IDNr: Scriptlauf erfolgreich/ mit Fehlern beendet

Jetzt möchte ich mir jeden Tag diese Logfiles durchscannen, ob ein Programm mit Fehlern beendet wurde.

also habe ich so angefangen:

cat Programm_201004.log | grep „^01“ | grep Fehler | cut -d":" -f1

Am 01.04. sind 2 Fehler aufgetreten, ich bekomme also zurück

01 04
01 06

Also habe ich den ganzen Befehl in eine Variable geschrieben und versucht das ganze dann über eine Schleife so auszuwerten, dass ich die vollständige Meldung von 04 Uhr und 06 Uhr bekomme.

Leider steht in der Variable aber alles hintereinander und wird dann durch die Schleife zerhackt, so das ich alle Meldungen vom 01., 04., und 06. April bekomme.
Wahrscheinlich kann man das mit awk oder so total einfach lösen, aber ich habe bislang noch keinen Zugang zu diesen kryptischen Befehlen gefunden.

Ich bitte um Denkanstöße !

Grüße

Chris

Hi Chris,

Also habe ich den ganzen Befehl in eine Variable geschrieben
und versucht das ganze dann über eine Schleife so auszuwerten,
dass ich die vollständige Meldung von 04 Uhr und 06 Uhr
bekomme.

Leider steht in der Variable aber alles hintereinander und
wird dann durch die Schleife zerhackt, so das ich alle
Meldungen vom 01., 04., und 06. April bekomme.

Einfachste Möglichkeit wäre hier die „read LINE“ Geschichte zu verwenden.

egrep "^01" mein\_logile | grep Fehler | cut -d":" -f1 | while read LINE
do
 egrep "^$LINE" mylogfile
done

Sobald allerdings mehrere Scripte pro Stunde ausgeführt werden funktioniert das nicht mehr, da die Schleife die fünf Zeilen pro Scriptdurchlauf nicht miteinander „verbindet“. Es wird nur jede Zeile für sich betrachtet und alles was zutrifft ausgegeben.
Hier wäre dann wirklich eine Lösung mit awk/perl angenehmer.

Wahrscheinlich kann man das mit awk oder so total einfach
lösen, aber ich habe bislang noch keinen Zugang zu diesen
kryptischen Befehlen gefunden.

Mit awk ist das ein wenig mühsam, da die Sprache nicht wirklich gut mit mehrdimensionalen Arrays arbeiten kann…anders gesagt, es gibt eigentlich keine. Aber da bei mir awk ein wenig besser sitzt als Perl und ich etwas in der Art auf Halde liegen hatte, hier mal ein Beispiel wie mans machen könnte…nicht schön aber dafür selten :wink:

BEGIN{}
/-------$/ {
 bla=1;
 if ( blub \>= 1 ){
 blub++
 }else{
 blub=1
 }
}
!/-------$/ {
 if ( bla == 1 ){
 log\_arr[blub,"DATE"] = $1 " " $2
 log\_arr[blub,"IDNR"] = $3
 }
 if ( $4 ~ /LoginUser/ ){
 log\_arr[blub,"USER"] = $5
 }else{
 for ( i=4; i
Das ganze Konstrukt in eine Datei packen z.B. logparser.awk und folgenmaßen aufrufen


    egrep "^01" mein\_logile | awk -f logparser.awk


Gruß
Martin

Hallo Martin,

vielen Dank für deine Antwort, das erste Beispiel ist schonmal prima, das verstehe sogar ich auf Anhieb :wink:

Für den awk-Teil werde ich wohl ein bißchen brauchen, bis ich mich da durch-verstanden habe.

Gruß und Stern

Chris