Thread Verständisfrage Array! Logfile! (14 answers)
Opened by Alexander at 2012-04-14 16:01

Alexander
 2012-04-15 10:49
#157498 #157498
User since
2012-02-21
25 Artikel
BenutzerIn
[default_avatar]
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 &quote Eintragungen vorhanden sind.

Bei Mozilla reguests ist das auch so, jedoch wenn ein anderer Browser verwendet wird, dann gibt es weniger &quote 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?

Code: (dl )
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 &quot, 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\].&quot\;(\w+).\/.+&quot\;.+&quot\;.+&quot.+&quot.+/, #&quot\;(\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\].&quot\;(\w+).\/.+&quot\;.+&quot\;.+&quot.+&quot.+&quot\;(\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
text/plain
1001 lines
log.txt

Last edited: 2012-04-16 08:35:43 +0200 (CEST)

View full thread Verständisfrage Array! Logfile!