Logfiles auslesen, Häufigkeit eines Treffers ausgeben
Silvan Hunkirchen
- perl
Hi all .
ich hab hier ein problem, wo ich schon den ganzen tag dran sitze.. finde langsam nix mehr..
folgendes problem. Ich habe 1 logfile in der nur einzelne IP Adressen drin stehen.
Aus dieser File muß ich herausfinden, welche IP Adressen drinstehen und wie häufig die IP Adresse x enthalten ist.
Das Auslesen habe ich hinbekommen, ist ja nicht so schwer :)
#splitting for Pinglog
open(Ping, '>ping.log');
select(Ping);
print (grep Ping result.log | cut -d" " -f8);
%pingarray=<Ping>;
@pingarray=sort keys(%pingarray);
open(endresult1, ">./result/$endresult");
select(endresult1);
@pingarray=<endresult1>;
close(endresult1);
close(Ping);
so.. meine ausgangsbasis ist die file ping.log. da stehen alle ips drin.
%pingarray=<Ping>; <-- mit dem befehl will ich bewirken, das alle einträge von dem Handle <ping> in das hash geschrieben werden.
dann sortiere ich den kram und suche immernoch nach einer möglichkeite das hash zu durchsuchen und dann das result auszugeben.
die ausgabe wird wiederum nicht das problem sein (hoffe ich). da hab ich mich noch nicht drangesetzt.
ich verstehe irgendwie nicht, wie ich auf einen nicht bekannten key zugreifen kann.
in dem hash ist es ja möglich einem key (meine ip), die vorhandenen gleichen ip adressen, oder am besten direkt die häufigkeit zuzuweisen.
Wenn einer ne idee hat, oder en fehler in dem code findet.. bitte melden :)
danke im Voraus
Hi auch,
%pingarray=<Ping>; <-- mit dem befehl will ich
bewirken, das alle einträge von dem Handle <ping>
in das hash geschrieben werden.
das kann ich mir nicht so recht vorstellen.
Ein Hash ist ja nun kein Array.
dann sortiere ich den kram und suche immernoch
nach einer möglichkeite das hash zu durchsuchen
und dann das result auszugeben.
Ich habe den Eindruck, daß Du das Wesen eines Hashes
noch nicht wirklich verstanden hast.
Weder Sortieren noch Durchsuchen sollten in Deinem
Fall überhaupt ein Thema sein.
ich verstehe irgendwie nicht, wie ich auf einen
nicht bekannten key zugreifen kann.
Ich verstehe nicht, wozu Du das brauchen solltest.
Die Menge aller Keys kannst Du Dir mit der Funktion
keys(%hash) berechnen und eine Schleife drüber laufen
lassen.
in dem hash ist es ja möglich einem key (meine ip),
die vorhandenen gleichen ip adressen, oder am besten
direkt die häufigkeit zuzuweisen.
Genau. Und das würde ich schon beim Einlesen machen:
while (<PING>)
{ $hash {$_} ++; }
Dabei werden die einzelnen Hash-Elemente bei Bedarf
angelegt (und quasi implizit mit dem Wert 0 initia-lisiert - äh, nicht wirklich, aber es kommt auf das-selbe heraus).
Das Verarbeiten geht dann mit
foreach my $this_key (keys (%hash))
{ irgendwas ($hash {$this_key}); )
Und statt einer unsortierten Folge von Schlüsseln
kannst Du auch eine sortierte verwenden:
foreach my $this_key (sort (keys (%hash)))
{ irgendwas ($hash {$this_key}); )
Viele Grüße
Michael
P.S.: Mal sehen, wie viele Syntaxfehler ich diesmal
wieder drin habe ... :-\