[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