Ich brauche folgende Daten aus dem Logfile:
Start- Endzeit
Request typ (z.B.: GET)
IP (unique, doppelte Einträge sollen gezählt werden, die Liste der Ip sollte jedoch ohne doppelte Einträge aufsteigend sortiert ausgegeben werden; da muss ich mir noch was einfallen lassen)
User Agents
Ich habe nun die Fehlerstelle gefunden. Ich ging davon aus, dass in allen Log Eintragungen die selbe Anzahl von "e Eintragungen vorhanden sind.
Bei Mozilla reguests ist das auch so, jedoch wenn ein anderer Browser verwendet wird, dann gibt es weniger "e Teile und meine Aufteilung des Strings funktioniert nicht mehr -leider.
Sollte ich nun versuchen für diese letzte Information (user agent) eine eigene Schleife schreiben oder kann ich das in einem Durchgang abarbeiten?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!c:/perl/bin/perl.exe -w
#Beschreibung Programm
use strict;
my $counter = 0;
my $ip = ();
my $date = ();
my $time = ();
my $req = ();
my $client = ();
my @timeresult = ();
my $timereport = ();
my $zeile = ();
my $starttime = ();
my $endtime = ();
open FH, "log.txt" or die $!;
my @logentries = <FH>;
foreach (@logentries) {
#soll die Zeichenfolge <pre><p> am Anfang ersetzen
$_ =~ s/^\<pre><p>//g;
#soll verhindern, dass leere Zeilen oder Zeilen mit Zeichenfolge </p></pre> mitgezählt werden
next if ($_ =~ m/^\<\/p\>\<\/pre\>/);
#reexp um IP, Datum, Zeit, Anforderung und Browser herauszufiltern
#mein Ansatz war die Zeichenfolge ", da die in jeder Zeile vorkommen (jedoch nicht immer in der selben Anzahl), diese Expres funktioniert
#$_ =~ m/(^\d{0,}.\d{0,}.\d{0,}.\d{0,}).+\[(\d{2})\/(\w{3})\/(\d{4}):(\d{2}:\d{2}:\d{2}).\+0000\]."\;(\w+).\/.+"\;.+"\;.+".+".+/, #"\;(\w+).+/;
#Diese RegExpr sollte den Browser auch ausgeben, jedoch hier liegt der Fehler. Wenn ich den letzten Ausdruck mitnehme, dann werden nicht alle Zeilen ausgewertet
$_ =~ m/(^\d{0,}.\d{0,}.\d{0,}.\d{0,}).+\[(\d{2})\/(\w{3})\/(\d{4}):(\d{2}:\d{2}:\d{2}).\+0000\]."\;(\w+).\/.+"\;.+"\;.+".+".+"\;(\w+).+/;
$ip = $1;
#Datum im Format Jahr/Monat/Tag ausgeben
$date = "$4 $3 $2";
#Zeit herausfiltern
$time = $5;
#Zeit weiterverarbeiten, da nur die Startzeit und die Endzeit benötigt werden
push (@timeresult, $time);
#Erstes Element des Zeit Arrays und letztes Element des Zeit Arrays verwenden wegen Start- und Endzeit
$starttime = $timeresult[0];
$endtime = $timeresult[$#timeresult];
#Anforderungselement, wird später mit einer if Funktion versehen
$req = $6;
#Brwoserelement wird später auch mit einer if Funktion versehen
$client = $7;
#Kontrolle der einzelnen Zeilen
#print "$counter-$1-$date-$time-$6\n";
print "$counter-$1-$date-$time-$6-$7\n";
$counter++;
}
print "$starttime\n";
print "$endtime\n";
print "$counter\n";
modedit Editiert von GwenDragon: code-Tag repariert
Anhänge
Last edited: 2012-04-16 08:35:43 +0200 (CEST)