Hi GT,
Logfile Auszug:
62.158.203.xxx - - [24/May/2000:10:55:52 +0200] "GET /config HTTP/1.0" 301 233 212.227.xxx.xxx "-" "Mozilla/4.05 [de]C-NECCK (WinNT; I)"So habe ich es dann "abgetippt" (verstehen tu ich da allerdings nix!)
while (<LOGFILE>)
{
»» my ($client, $identuser, $authuser, $datum, $uhrzeit, $zz, $methode, $url, $protokoll, $status, $bytes) = /^(\S+) (\S+) [([^:]+) : (\d+:\d+:\d+) ([^]]+)] "(\S+) (.*?) (\S+)" (\S+) (\S+)$/;
»» print "$client\n";
}
Im Ansatz ist das ja schon richtig. Vom Prinzip wird mit einem Regulären Ausdruck versucht, sozusagen ein Template für die Logzeile zu definieren. Die Platzhalter (in diesem Fall geklammerte Ausdrücke) werden dann Variablen zugeordnet. Hier mal zum Vergleich untereinander:
$client $identuser $authuser $datum $uhrzeit $zz $methode $url $protokoll $status $bytes
^(\S+) (\S+) [([^:]+) : (\d+:\d+:\d+) ([^]]+)] "(\S+) (.*?) (\S+)" (\S+) (\S+) $
^ ^ ^
+-------- hier wurde einmal (\S+) vergessen
+------- Zeilenanfang Zeilenende ---------+
abgesehen von dem vergessen (\S+) dürfen um das freistehen : keine Leerzeichen stehen, da diese dann auch in der Logdatei "gesucht" aber nicht gefunden werden. Auch stehen in Deinem Logfile mehr Einträge, als erwartet werden:
212.227.xxx.xxx "-" "Mozilla/4.05 [de]C-NECCK (WinNT; I)"
Der Reguläre Ausdruck erwartet aber schon das Zeilenende ... Fürs erste einfach das $-Zeichen am Ende entfernen.
Gruß,
Jörk