Log filtern summieren mit AWK

N

nico-e

Grünschnabel
Hallo,

ich versuche mit Hilfe von Shell-Commands ein Logfile zu filtern, welches wie folgt aussieht..

Code:
07/05/2008 12:31:40 {ID123} {ID123} SignOff <IP-addresse> 1 0 "terminated due to comm error"
07/05/2008 12:31:40 {ID123} {ID123} Stats 94
07/05/2008 12:32:14 {GID222} {Z123} SignOff <IP-addresse> 1 2747 "logged off"
07/05/2008 12:32:14 {GID333} {Z32} Stats 93
07/05/2008 12:32:27 {GID213} {Z32} NameChg ".bdaââri."->"bûdsâkiô."
07/05/2008 12:33:09 {ID123} {ID123} requirePUID Non-Java login
07/05/2008 12:33:09 {} {ZN123P} SignOn <IP-addresse> "400666" "32Bit Windows" ".bla blubb I bla."
07/05/2008 12:33:13 {ID123} {ID123} requirePUID Non-Java login
07/05/2008 12:33:13 {} {ZH123H} SignOn <IP-addresse> "903  2" "32Bit Windows" "b l a b."

das Ergebnis soll die den namen (Letzte spalte) die Summe der Zeit (spalte 8 bei zeilen mit SignOff) und spalte 7 bei Zeilen mit SignOn

meine aktueller versuch sieht so aus giebt aber nur die zeit in Stunden und die ClientID (spalte 3)aus
Code:
h$grep -r "SignOff" pserver*.log | grep "\{Z" |cut -d " " -f 3,8 | grep -v "{}" | awk '{zeit[$1]+=$2} END{for (name in zeit) print zeit[name]/60/60, name  }' | sort -n

Gibt es eine Möglichkeit innerhalb AWK die ID(name) durch die Ausgabe von "grep * name(also die Client ID die AWK kennt)| grep SignOn | tail -1 | zerschneiden nach Spalte 7 und spalte name(alles was am ende der spalte in "Anführungstrichen" steht incl. Leerzeichen)" zu ersetzen
 
Hi,

ich kenne mich mit awk nicht aus, aber ich verstehe auch nicht wirklich was du genau filtern willst. In deinem zweiten Satz fehlt das Praedikat, was das Verstaendnis von deinem Post erschwert, auch wenn ich raten wuerde dass das fehlende Verb "enthalten" ist.

Vielleicht koenntest du mal ein Beispiel geben was du hinterher gerne rausbekommen moechtest.

mfg,
bytepool
 
Entschuldige bitte das fehlende Wort
das Ergebnis soll den Namen (letzte spalte), die Summe der Zeit (aus Spalte 8 bei zeilen mit SignOff) und Spalte 7 bei Zeilen mit SignOn enthalten

Beispiel für die Ausgabe:

<summe des wertes in logspalte 8> <ID>

Beispiel wie die Ausgabe aussehen soll:

<summe des wertes in logspalte 8> <Name aus der letzen logspalte> <Text aus der 7.logspalte>

mein Problem ist das die Werte anhand der ID in dem Logfile gesucht werden müssen, denn sie stehen nicht in der selbe Zeile und auch nicht unbedingt in der vorherigen.

Code:
grep -r "SignOff" pserver*.log     # Filtert Logfile nach SignOff
grep "\{Z"     # Filtert nach zeilen die {Z enthalten
cut -d " " -f 3,8     # blendet alle Spalten aus ausser 3 (Die ID) und 8 (die Anmeldedauer der Session)
grep -v "{}" | awk '{zeit[$1]+=$2} END{for (name in zeit) print zeit[name]/60/60, name  }'     # Summiert die werte zur jeweiligen ID und giebt die Summe und die ID aus
sort -n    # Sortiert das ganze von niedrigster summierter Zeit nach höchste Summierte zeit

hier nochmal ein Beispiel der Zeilen des Logs welche für die Auswertung benötigt werden:
Code:
07/05/2008 12:33:09 [COLOR="Red"]{GID222}[/COLOR] {ZN123P} SignOn <IP-addresse> [COLOR="Lime"]"400666"[/COLOR] "32Bit Windows" [COLOR="Blue"]".bla blubb I bla."[/COLOR]
07/05/2008 12:31:40 {ID123} {ID123} SignOff <IP-addresse> 1 0 "terminated due to comm error"
07/05/2008 12:32:14 [COLOR="Red"]{GID222}[/COLOR] {Z123} SignOff <IP-addresse> 1 [COLOR="Orange"]2747 [/COLOR]"logged off"
07/05/2008 12:33:09 {} {ZN123P} SignOn <IP-addresse> "400666" "32Bit Windows" [COLOR="Blue"]".bla blubb I bla."[/COLOR]
07/05/2008 12:33:13 {} {ZH123H} SignOn <IP-addresse> "903  2" "32Bit Windows" "b l a b."

daraus würde sich folgende zeile ergeben für die ID {GID222}
2747 ".bla blubb I bla." "400666"
 

Ähnliche Themen

Mit AWK verschiedene Felder verschiedener Zeilen vergleichen

Adressvergabe in anderen Subnets

Debian Routing Problem

Mein Server versendet SPAM in Massen

zwei Sambaserver binden

Zurück
Oben