Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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 :)

Geschrieben
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

Geschrieben

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?

Geschrieben
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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...