Zum Inhalt springen

perl + ausgabe


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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