G. T.: Sortieren von Logfiles?

Hi folks,
gibt es bereits vorgefertigte Scripte um ein Unix/Apache Logfile zu sortieren? (nach IP, OS, Browser, etc.)
Das Beispiel im "Kochbuch" klappt irgendwie nicht...

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";
}

Falls jemand ein Script dafür kennt bzw. eine Idee hat wie man es besser (leichter) machen könnte wäre ich äußerst dankbar dafür.

best regards
GT

  1. Hi GT,

    Falls jemand ein Script dafür kennt bzw. eine Idee hat wie man es
    besser (leichter) machen könnte wäre ich äußerst dankbar dafür.

    das folgende Statemant packt Dir die Logfilebestandteile (apache-Logfile) in Variablen, mit denen Du dann irgendwas anstellen kannst, z.B. auszaehlen:

    (($site,$rfc931,$user,$when,$request,$status,$bytes,$from,$agent)=
        /^(\S+)\s*(\S+)\s*(\S+)\s*[([^]]+)]\s*"([^"]+)"\s*(\S+)\s*(\S+)\s*"\s*([^"]*)\s*"\s*"\s*([^"]*)\s*"\s*$/o)

    Mehr Ideen zur Logfileanalyse mit Perl findest Du z.B. in den Scripten unter

    http://cgi.resourceindex.com/Programs_and_Scripts/Perl/Logging_Accesses_and_Statistics/

    Gruss

    Dorthe

    P.S. Kennt jemand ein (freies) Script, das typische Wege von Usern auf Webseiten berechnen kann?

  2. Hi GT!

    versuchs mal damit: http://www.analog.cx/

    Gruß Frank

  3. 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