dosenfutta Geschrieben 25. August 2003 Teilen Geschrieben 25. August 2003 hi, ich hab da ein kleines problem. ich habe mir einscript geschrieben, welches apache logfiles nach dem referer durchsucht, einfach um die herkunft der websiten besucher festzustellen. die ausgabe erfolgt in ein einfaches txt file. nun hab ich das problem das ich mehrere gleich einträge in der ausgabe.txt vorfinde. gibt es sowas wie ein "uniq" unter *nix in perl .... ideenanstöße erwünscht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
*I C Q* Geschrieben 25. August 2003 Teilen Geschrieben 25. August 2003 Original geschrieben von dosenfutta ideenanstöße erwünscht Na, dann wollen wir mal: Bau Dir doch ein Hash dass aus Referrer=>Anzahl besteht. Somit kannst Du nachvollziehen, wie oft Deine Seiten von welcher Seite aufgerufen wurden. Das Grobprinzip ist: if (exists $hash{$referrer}) { $hash{$referrer}++; } else { $hash{$referrer} = 1; } Danach durchläufst das Array sequentiell und liest alle Schlüsselpaare aus und schreibst sie in Deine Datei. ICQ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dosenfutta Geschrieben 25. August 2003 Autor Teilen Geschrieben 25. August 2003 na dann wollen wir mal wieder das problem das ich habe ist im moment nur, das das gesamte ergebnis in einer variablen gespeichert wird und dann ausgegeben wird. hier ein auszug #!/usr/bin/perl -w $checkdir =""; @exclude = ("blabla" , "was man alles ausschliessen will", ); # subs sub in_array { foreach $deny(@_) { # $zeile wird noch durch standartvariable ersetzt if($zeile =~ m/$deny/) { return 1; } } } opendir(LOGS,"/logs") || die "no directory"; @listing=readdir(LOGS); closedir(LOGS) || die "couldn't close directory"; $ausgabe = "ausgabe.txt"; open(AUSGABE, ">$ausgabe"); foreach $dir(@listing) { $logfile ="access.log"; $pfad = "/logs/$dir/$logfile"; if(-e $pfad) { open(LOGFILE, "$pfad"); @content=<LOGFILE>; close(LOGFILE); foreach $zeile(@content) { if($zeile =~ /http(.*)/) { $zeile_http = "http$1"; } $zeile_http =~ s/(\".*\".*\")//g; $array_check = in_array(@exclude); if ($array_check != 1 && $zeile =~ /http/) { if($checkdir ne $dir) { $checkdir = $dir; $test .= "\n\n$dir\n"; $test .= "======================================\n"; } $test .= "$zeile_http\n" ; } else { } } } } print AUSGABE "$test"; close(AUSGABE); wie du unschwer erkennen kannst, wird am ende alles in der variablen $test gespeichert. ist es möglich die variable direkt in nen array zu pushen oder besser nen hash und dann mit sort oder so zu arbeiten? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
*I C Q* Geschrieben 25. August 2003 Teilen Geschrieben 25. August 2003 Original geschrieben von dosenfutta ist es möglich die variable direkt in nen array zu pushen oder besser nen hash und dann mit sort oder so zu arbeiten? Warum so umständlich? Bau doch an der Stelle, wo Du $test mit $zeile_http füllst die Hashüberprüfung von oben ein und mach hinter der Leseschleife eine Schleife zum durchlesen des Hashs rein und pack's in $test, dann musst Dein Programm kaum umstellen. Darfst nur nicht vergessen, das Hash vor jeder Datei wieder zu löschen! EDIT: Musst natürlich keine Schleife machen, kannst ja auch mit 'nem Join arbeiten, fällt mir gerade ein. ICQ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.