Cle/Valeurs unique
Le
kurtz le pirate

bonjour,
voila, j'ai des kilomètres de logs cisco de ce genre à analyser :
012824: Apr 15 15:12:45.161 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012825: Apr 15 15:12:45.161 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012826: Apr 15 15:12:45.165 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012833: Apr 15 15:12:45.245 France: IP: s.100.177.130 (Vlan176),
d"4.0.0.252, len 73, dispose ip.hopcount
012835: Apr 15 15:12:45.325 France: IP: s.100.177.130 (Vlan176),
d"4.0.0.252, len 73, dispose ip.hopcount
012842: Apr 15 15:12:45.361 France: IP: s.100.176.56 (Vlan176),
d#9.2.3.1, len 1116, dispose ip.hopcount
012843: Apr 15 15:12:45.361 France: IP: s.100.176.56 (Vlan176),
d#9.2.3.1, len 1116, dispose ip.hopcount
012852: Apr 15 15:12:45.441 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012853: Apr 15 15:12:45.449 France: IP: s.100.177.127 (Vlan176),
d"4.0.0.252, len 72, dispose ip.hopcount
je dois récupérer l'adresse ip source et destination.
j'ai écris ce code :
while (<LOGFILE>) {
/.*?(d{1,3}.d{1,3}.d{1,3}.d{1,3}).*?(d{1,3}.d{1,3}.d{1,3}.d{1,3}).*?(d{1,})/;
print "source : $1, destination : $2, longueur : $3";
push @{$infos{$1}}, $2;
}
close LOGFILE;
foreach my $source ( keys %infos ) {
print "De $source vers :";
foreach my $i ( 0 .. $#{$infos{$source} } ) {
print " $infos{$source}[$i]";
}
print "";
}
ca marche 'presque' bien. mon problème, c'est que ne voudrait pas qu'il
y ai plusieurs fois la même adresse ip destination. donc pouvoir pousser
dans le hash l'adresse ip que si elle n'existe pas.
pour le moment cela donne :
De 192.168.110.66 vers :
239.255.255.250
239.255.255.250
239.255.255.251
239.255.255.251
239.255.255.250
239.255.255.250
239.255.255.250
239.255.255.252
239.255.255.252
239.255.255.250
je voudrais :
De 192.168.110.66 vers :
239.255.255.250
239.255.255.251
239.255.255.251
239.255.255.252
il y a une astuce pour le 'push' ou bien il faut tester à chaque fois
avant d'insérer ?
merci pour les pistes
--
Kurtz le pirate
Compagnie de la Banquise
voila, j'ai des kilomètres de logs cisco de ce genre à analyser :
012824: Apr 15 15:12:45.161 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012825: Apr 15 15:12:45.161 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012826: Apr 15 15:12:45.165 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012833: Apr 15 15:12:45.245 France: IP: s.100.177.130 (Vlan176),
d"4.0.0.252, len 73, dispose ip.hopcount
012835: Apr 15 15:12:45.325 France: IP: s.100.177.130 (Vlan176),
d"4.0.0.252, len 73, dispose ip.hopcount
012842: Apr 15 15:12:45.361 France: IP: s.100.176.56 (Vlan176),
d#9.2.3.1, len 1116, dispose ip.hopcount
012843: Apr 15 15:12:45.361 France: IP: s.100.176.56 (Vlan176),
d#9.2.3.1, len 1116, dispose ip.hopcount
012852: Apr 15 15:12:45.441 France: IP: s.100.176.26 (Vlan176),
d"4.0.0.252, len 50, dispose ip.hopcount
012853: Apr 15 15:12:45.449 France: IP: s.100.177.127 (Vlan176),
d"4.0.0.252, len 72, dispose ip.hopcount
je dois récupérer l'adresse ip source et destination.
j'ai écris ce code :
while (<LOGFILE>) {
/.*?(d{1,3}.d{1,3}.d{1,3}.d{1,3}).*?(d{1,3}.d{1,3}.d{1,3}.d{1,3}).*?(d{1,})/;
print "source : $1, destination : $2, longueur : $3";
push @{$infos{$1}}, $2;
}
close LOGFILE;
foreach my $source ( keys %infos ) {
print "De $source vers :";
foreach my $i ( 0 .. $#{$infos{$source} } ) {
print " $infos{$source}[$i]";
}
print "";
}
ca marche 'presque' bien. mon problème, c'est que ne voudrait pas qu'il
y ai plusieurs fois la même adresse ip destination. donc pouvoir pousser
dans le hash l'adresse ip que si elle n'existe pas.
pour le moment cela donne :
De 192.168.110.66 vers :
239.255.255.250
239.255.255.250
239.255.255.251
239.255.255.251
239.255.255.250
239.255.255.250
239.255.255.250
239.255.255.252
239.255.255.252
239.255.255.250
je voudrais :
De 192.168.110.66 vers :
239.255.255.250
239.255.255.251
239.255.255.251
239.255.255.252
il y a une astuce pour le 'push' ou bien il faut tester à chaque fois
avant d'insérer ?
merci pour les pistes
--
Kurtz le pirate
Compagnie de la Banquise
On peut rajouter un hash (%ds) avec comme clé la concaténation des
adresses source et destination ( en intercalant un caractère neutre pour
les séparer).
while (<LOGFILE>) {
/.*?(d{1,3}.d{1,3}.d{1,3}.d{1,3}).*?(d{1,3}.d{1,3}.d{1,3}.d{1,3}).*?(d{1,})/;
print "nsource : $1, destination : $2, longueur : $3n";
unless ( defined $ds{$1.'-'.$2} ) {
push @{ $infos{$1} }, $2;
$ds{$1.'-'.$2} = 1;
}
}
close LOGFILE;
HTH
--
J-L
http://www.bribes.org/perl
snip
un autre hash juste pour les doublons... ingénieux ça.
merci
--
Kurtz le pirate
Compagnie de la Banquise
Si on veut pouvoir accéder aux adresses de manière un peu structurée, par
exemple trouver toutes les deuxièmes adresses associées à chaque première
adresse, on peut préférer faire un hash de hash plutôt que concaténer les
chaînes.