Silvan Hunkirchen: Logfiles auslesen, Häufigkeit eines Treffers ausgeben

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

  1. 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 ... :-\