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";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#!/usr/bin/perl use strict; use warnings; use Date::Parse; my $file='log.txt'; open(my $fh, '<', $file) or die("Error open $file ($!)\n"); while(my $line=<$fh>) { chomp($line); $line=~s/^<pre><p>//; $line=~s!</p></pre>$!!; if($line=~s!<a href=".+?" target="_blank">(.+?)</a>!$1!g) { $line=~s/;;/;/g; } $line=~s!"!"!g; $line=~s!&!&!g; # bereinigte Zeile print "$line\n"; } close($fh);
1 2 3 4 5 6
if($line=~/(\d+\.\d+\.\d+\.\d+) - - \[(.+?)\] "(.+?)" (\d+) (\d+|-) "(.+?)" "(.+?)"$/) { my ($ip,$date,$request,$status,$size,$referer,$useragent)=($1,$2,$3,$4,$5,$6,$7); # mach was mit den Werten. }
2012-04-14T14:01:11 AlexanderIch dachte mir, dass ich einem Array diesen Fielhandle zuweise, ...
1 2 3 4 5 6 7 8 9
use Tie::File; my @array; my $filename = "/var/log/apache2/error_log"; tie @array, 'Tie::File', $filename or die "Cant bind to $filename"; # weiter das Array einfach auslesen # oder gearbeiten
2012-04-14T14:01:11 AlexanderIch dachte mir, dass ich einem Array diesen Fielhandle zuweise, weil
-jeder Eintrag automatisch in einer Zeile ist?
-mit Foreach kann ich dann Zeile für Zeile abarbeiten
1
2
3
4
5
open my $fh, "<", $log or die "unable to open file '$log' - $!";
while (my $line = <$fh>) {
# Zeile verarbeiten...
}
close $fh;
1
2
3
4
5
6
7
8
9
open my $in, "<", $log or die "unable to open file '$log' - $!";
open my $out, ">", $result or die "unable to open file '$log' - $!";
while (my $line = <$in>) {
if ($line =~ $regex) {
print $out $line;
}
}
close $in;
close $out;
perldoc Tie::File"Tie::File" represents a regular text file as a Perl array ...
The file is not loaded into memory, so this will work even for gigantic files.
2012-04-14T22:38:59 bloonixJa und was das jetzt mit meinen Ratschlägen an den TE zu tun?
use Tie::File ist eine ziemlich bescheidene Erklärung an einen
Perl-Anfänger, welche Gefahren hinter @array = <$fh> stecken.
2012-04-14T22:38:59 bloonixJa und was das jetzt mit meinen Ratschlägen an den TE zu tun?
use Tie::File ist eine ziemlich bescheidene Erklärung an einen
Perl-Anfänger, welche Gefahren hinter @array = <$fh> stecken.
2012-04-15T16:21:54 hlubenow1. Es gibt keine Gefahren dabei, wenn man weiß, wie groß die eingelesenen Daten werden und ob der Rechner das packt. Dann kann man das ruhig benutzen. Das sind schonmal schätzungsweise 98% der Fälle. Solche Warnungen sind also meist übertrieben.
2012-04-15T16:21:54 hlubenow2. Mit use Tie::File gibt es auch dann keine Gefahren, wenn die Daten sehr groß werden (s.o.).
2012-04-16T21:00:26 bloonixWenn das sonst deine Art der Programmierung ist, dann werd lieber professioneller Baumwollpullistricker. ;-)