marinux
Goto Top

Perl Hash-Arrays auslesen

Hallo,

ich hole mir mit folgendem Code (Perl) aus einer Textdatei IP-Verbindungsdaten.

sub test {

	my %arr_hash;

	foreach (`awk '{print \$1, \$3, \$4, \$5, \$6}' textdatei.txt`){  

	      ($src_ip, $dest_ip, $src_prt, $dest_prt, $bytes) = split(/ /, $_);
	      $arr_hash{"source"}{$src_ip}{$dest_ip}{$src_prt}{$dest_prt}+=$bytes;  
	}


      foreach ($arr_hash{"source"}){  
       # Hier sollen z.B. alle Quellen IPs oder Bytes ausgegeben werden
      }
 
}

Diese sollen in einem Hash-Array abgespeichert werden. Hash-Array deshalb, weil so Verbindungssätze, die mehrfach vorkommen leicht zugeordnet werden können, ohne dass ich überprüfen muss, ob der Eintrag im Array schon vorhanden ist.

Das ist soweit auch kein Problem. Mir beschert das Auslesen des Hash-Arrays aber Probleme.

Wie kann ich mir z.B. alle Quellen IPs ($src_ip) ausgeben lassen oder für alle gespeicherten Verbindungen die Bytes ($bytes)?

Gruß

Content-Key: 179735

Url: https://administrator.de/contentid/179735

Printed on: April 24, 2024 at 21:04 o'clock

Mitglied: 64748
64748 Jan 29, 2012 at 20:43:22 (UTC)
Goto Top
Guten Abend marinux,
Zitat von @marinux:
$arr_hash{"source"}{$src_ip}{$dest_ip}{$src_prt}{$dest_prt}+=$bytes;
woher kommte denn "source"? bzw. was ist "source"? sollte nicht
$arr_hash{$src_ip}{$dest_ip}{$src_prt}{$dest_prt}+=$bytes;
gemeint sein?
Diese sollen in einem Hash-Array abgespeichert werden. Hash-Array deshalb, weil so Verbindungssätze, die mehrfach vorkommen
leicht zugeordnet werden können, ohne dass ich überprüfen muss, ob der Eintrag im Array schon vorhanden ist.
So wie ich das verstehe ist es aber nicht ein Hash sondern ein Hash von Hashes von Hashes von Hashes. Du müsstest also drei Schleifen benutzen.
foreach $key_src_ip ( keys %arr_hash){
    foreach $key_dest_ip (keys $arr_hash{$key_dest_ip}
        .... usw. 
    }
}
Es ist aber möglich, dass ich Deine Datenstruktur falsch verstanden hab. Vielleicht postest Du mal ein Beispiel Deiner textdatei.txt damit man das mal ausprobieren kann.

Gruß

Markus
Member: marinux
marinux Jan 30, 2012 at 08:09:12 (UTC)
Goto Top
Hallo,

danke für Deine Antwort, aber sie hat nicht ganz funktioniert.

Ich habe es so gelöst:

	foreach (`awk '{print \$1, \$3, \$4}' textdatei.txt`){  

	      ($src_ip, $dest_ip, $bytes) = split(/ /, $_);
	      $arr_hash{"source"}{$src_ip}{$dest_ip}+=$bytes;  
	}

      foreach $key_src_ip (keys %{$arr_hash{"source"}}){  
	      print $key_src_ip;
	      foreach $key_dest_ip (keys %{$arr_hash"source"}{$key_src_ip}}){  
		  print "\n   ".$key_dest_ip." ".$arr_hash{"source"}{$key_src_ip}{$key_dest_ip}."\n\n";  
	      }
      }