Cle/Valeurs unique

3 réponses
Avatar
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=10.100.176.26 (Vlan176),
d=224.0.0.252, len 50, dispose ip.hopcount
012825: Apr 15 15:12:45.161 France: IP: s=10.100.176.26 (Vlan176),
d=224.0.0.252, len 50, dispose ip.hopcount
012826: Apr 15 15:12:45.165 France: IP: s=10.100.176.26 (Vlan176),
d=224.0.0.252, len 50, dispose ip.hopcount
012833: Apr 15 15:12:45.245 France: IP: s=10.100.177.130 (Vlan176),
d=224.0.0.252, len 73, dispose ip.hopcount
012835: Apr 15 15:12:45.325 France: IP: s=10.100.177.130 (Vlan176),
d=224.0.0.252, len 73, dispose ip.hopcount
012842: Apr 15 15:12:45.361 France: IP: s=10.100.176.56 (Vlan176),
d=239.2.3.1, len 1116, dispose ip.hopcount
012843: Apr 15 15:12:45.361 France: IP: s=10.100.176.56 (Vlan176),
d=239.2.3.1, len 1116, dispose ip.hopcount
012852: Apr 15 15:12:45.441 France: IP: s=10.100.176.26 (Vlan176),
d=224.0.0.252, len 50, dispose ip.hopcount
012853: Apr 15 15:12:45.449 France: IP: s=10.100.177.127 (Vlan176),
d=224.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 "\nsource : $1, destination : $2, longueur : $3\n";
push @{$infos{$1}}, $2;
}
close LOGFILE;

foreach my $source ( keys %infos ) {
print "De $source vers :\n";
foreach my $i ( 0 .. $#{$infos{$source} } ) {
print " $infos{$source}[$i]\n";
}
print "\n\n";
}

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

3 réponses

Avatar
Jean-Louis Morel
Le 16/04/2014 19:18, kurtz le pirate a écrit :
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 "nsource : $1, destination : $2, longueur : $3n"; push
@{$infos{$1}}, $2; } close LOGFILE;

foreach my $source ( keys %infos ) { print "De $source vers :n";
foreach my $i ( 0 .. $#{$infos{$source} } ) { print "
$infos{$source}[$i]n"; } print "nn"; }

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 ?




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
Avatar
kurtz le pirate
Le 16/04/2014 20:29, Jean-Louis Morel a écrit :
Le 16/04/2014 19:18, kurtz le pirate a écrit :
bonjour,





snip

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



un autre hash juste pour les doublons... ingénieux ça.
merci


--
Kurtz le pirate
Compagnie de la Banquise
Avatar
Nicolas George
Jean-Louis Morel , dans le message
<534ecbeb$0$2388$, a écrit :
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).



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.