Discussion:
Cle/Valeurs unique
(trop ancien pour répondre)
kurtz le pirate
2014-04-16 17:18:03 UTC
Permalink
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
Jean-Louis Morel
2014-04-16 18:29:03 UTC
Permalink
Post by kurtz le pirate
bonjour,
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,
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,
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,
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.
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 : $3\n";

unless ( defined $ds{$1.'-'.$2} ) {
push @{ $infos{$1} }, $2;
$ds{$1.'-'.$2} = 1;
}
}
close LOGFILE;

HTH

--
J-L
http://www.bribes.org/perl
kurtz le pirate
2014-04-18 16:23:46 UTC
Permalink
Post by Jean-Louis Morel
Post by kurtz le pirate
bonjour,
snip
Post by Jean-Louis Morel
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
Nicolas George
2014-04-18 16:25:53 UTC
Permalink
Jean-Louis Morel , dans le message
Post by Jean-Louis Morel
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.

Loading...