Thread Daten aus Server-Logfile erheben (Common Log Format) mit Suchmuster (9 answers)
Opened by mojo at 2008-10-30 00:01

mojo
 2008-11-07 20:14
#116072 #116072
User since
2008-10-29
4 Artikel
BenutzerIn
[default_avatar]
so ...

das Perl-Skript steht jetzt.

Es funktioniert auch alles, so wie ich das wollte. Bis auf eine Sache ...

Es grast zunächst die Logdatei (Common Log Format wie gesagt) ab und fischt aus jeder Zeile die Datumsangabe heraus.
Im folgenden Format: z.B.

29/Sep/2008
04/Okt/2008
06/Nov/2008 etc. pp.

und legt diese in einem Hash (%tage) mit diesen Datumsangaben als Keys ab. Die Fächer werden mittels Schleife und Zählvariable mit Nummern (beginnend mit 1 gefüllt.

sieht dann etwa so aus:
Code (perl): (dl )
1
2
3
4
5
 %days = (
        26/Sep/2008 => '1',
        27/Okt/2008 => '2',
        28/Nov/2008 => '3',
);

Die Nr.-Angaben werden für eine spätere Benutzerauswahl des Datums genutzt (dafür wird parallel eine Array mit allen Datumsangeben gefüllt, ins erst Fach kommt eine 0, sodass die Datumseinträge mit den gleichen Nummern (Fachnummern 1,2,3 und soweiter entsprechend den Inhalten der Hashfächer)angewählt werden können)

Die sortierte Ausgabe erfolgt dann so:
Code (perl): (dl )
1
2
3
4
for my $datum (sort keys %days){        #Reihenfolge der Keys des Hash's '%tage' nach Datumseinrägen sortieren
                print "$datum\t($tage{$datum})\n";      #sortierte Ausgabe des Hash's %tage
}
print "\nWelches Datum auswerten? (Nr. eingeben): ";    #Eingabeaufforderung f. Auswahl 


Dies klappt wunderbar, solange es Datumseinträge eines Monats sind - dann sieht die Ausgabe z.B. so aus:

Code: (dl )
1
2
3
05/Oct/2008       (1)
06/Oct/2008 (3)
07/Oct/2008 (4)


Blöd wirds, wenn Einträge mehrerer Monate auftauchen, dann sieht die ausgegebene Liste z.B. so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
05/May/2008       (5)
05/Jul/2008 (7)
05/Sep/2008 (9)
05/Oct/2008 (10)
06/Feb/2008 (3)
06/Mar/2008 (4)
06/Jul/2008 (8)
06/Oct/2008 (11)
07/Mar/2008 (12)
07/Apr/2008 (2)
07/Sep/2008 (16)
07/Oct/2008 (12)
08/Dec/2008 (25)
09/Dec/2008 (26)
10/Dec/2008 (27)


Kauderwelsch.
Sprich: es wird zwar sortiert, aber falsch: nur nach den Tageszahlen (erste beide Ziffern)
Ich möchte jedoch, dass sowohl die Reihenfolge der Tage, Monate und eventuell auch der Jahre stimmt.

Ich würde die Datums-Strings zunächst erst einmal mittels Suchmuster (Reg. Ausdruck) in Tag, Monat und Jahr zerhacken. z.B. so:

Code (perl): (dl )
1
2
3
4
5
if ($ueb=~m/^(\d+)\/(\w+)\/(\d+)$/){    #Aufsplitten des Datums-Strings in Tag, Monat, Jahr
                        $d=$1;                          #Zuweisen in entsprechende Skalare
                        $m=$2;
                        $y=$3;
}


Aber wie weiter? man müsste ja erstmal eine gültige Monatsreihenfolge Festlegen, oder gibt es da vielleicht schon eine Funktion/ Modul im Perl?

Dann könnte man ja eventuell mit einer solchen Schleife weitersortieren:

Code (perl): (dl )
1
2
3
4
for my $m (sort keys %days){    #Reihenfolge der Keys des Hash's '%tage' nach Monatseinträgen sortiern
                print "$datum\t($tage{$m})\n";  #sortierte Ausgabe des Hash's %tage
}
print "\nWelches Datum auswerten? (Nr. eingeben): ";    #Eingabeaufforderung f. Auswahl 


Aber man müsste doch auf jeden Fall mehrere neue Hashes anlegen. Es wird doch auf jeden Fall eine recht komplizierte Datensstruktur, oder?

z.B.

1. alle Tage geordnet den entsprechenden Monaten zuweisen
2. die "gefüllten" Monate sortieren
3. die sortierten Monate den entsprechenden Jahren zuweisen

4. Das ganze ordentlich sortiert und durch den Benutzer anwählbar ausgeben.

Wie würdet Ihr dies am sinnvollsten bewerkstelligen?

Möglich, dass es eine vorgefertigte Perl-Funktion gibt und ich Eulen nach Athen trage.

Interessiert mich sehr!

View full thread Daten aus Server-Logfile erheben (Common Log Format) mit Suchmuster