[gull] Filtrage d'unicité avec comptage d'apparition
Cédric Bouvier
cbouvi at gmail.com
Wed Mar 9 12:21:50 CET 2011
Le mercredi 9 mars 2011, à 11 heures 44, Yves Martin écrivait :
> Bonjour,
>
> Je suis en train de traiter des logs et j'extrais les adresses IP pour lesquelles
> une ligne d'erreur est sortie. Avec du grep | cut | sort -u
>
> Mais j'aimerai sortir un comptage d'apparition des adresses IP extraites.
> Par quoi remplacer "sort" pour faire cela en une passe ?
Avec Perl, bien sûr :
cat tonlog.log | perl -nle '/pattern pour capturer (\d+\.\d+\.\d+\.\d+)/ or next; $ip{$1}++}{print "$_ a été vue $ip{$_} fois." for sort keys %ip'
Explication courte :
L'argument -e est suivi du code Perl à exécuter.
n enrobe ce code avec 'while (<>) {' au début et '}' à la fin. Donc le
code ci-dessus est exécuté pour chaque ligne de l'entrée standard.
-l supprime automatiquement le retour chariot en fin de ligne, et
l'ajoute après un print...
Le code devient donc:
while(<>){/pattern pour capturer (\d+\.\d+\.\d+\.\d+)/ or next; $ip{$_}++}{print "$_ a été vue $ip{$1} fois." for sort keys %ip}
Avec un peu d'indentation, et de commentaires :
# Lire chaque ligne de l'entrée standard, stockée dans la variable $_
while (<>) {
# La ligne matche-t-elle ? Sinon, on passe à la suivante (next)
/pattern pour capturer (\d+\.\d+\.\d+\.\d+)/ or next;
# Si on a matché, l'IP est capturée dans $1. On incrémente donc
# un compteur d'IP
$ip{$1}++
}{
# Affichage du rapport.
print "$_ a été vue $ip{$_} fois." for sort keys %ip
}
«}{» est appelé parfois l'opérateur bisou esquimau... Il ferme le block
ouvert par l'option -n («while (<>) {»), et en ouvre un autre, qui sera
fermé par le même opérateur... Ça permet d'ajouter du code en fin de
traitement, alors qu'avec -n, normalement, tout le code de -e est
exécuté à chaque ligne :
Code de -e : <à chaque ligne> }{ <en fin de traitement
Avec -n : while (<>) { <à chaque ligne> }{ <en fin de traitement> }
Voilà.
HTH
--
C é d r i c B o u v i e r
More information about the gull
mailing list