AWK et traitement de logs

Fermé
ooliver27 - 16 mars 2009 à 11:49
 ooliver27 - 16 mars 2009 à 14:47
Bonjour,

je travaille actuellement sur des logs http d'un pare-feu que je dois trier et dont je dois extraire des stats.
Par exemple, je reçois ce type de log:

src=10.0.0.2 dstname=www.google.fr rcvd=3123
src=10.11.20.56 dstname=www.yahoo.com rcvd=12987
...

Et je dois obtenir la liste des sites les plus visités, et la liste des sites qui génèrent le plus de trafic (avec le champ rcvd). On m'a conseillé AWK pour effectuer le traitement, mais comme Awk ne gère ni les tableaux à deux dimensions, ni les variables structurées, j'ai un peu mal...

Qqn peut m'expliquer comment je pourrais faire? Merci! Je précises que la machine qui traite les logs tourne sous Debian 5.0. Donc s'il y a mieux et plus simple qu'awk, je suis preneur!!
A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
16 mars 2009 à 13:48
Ca change pas mal de choses.
Avec un simple script perl, cela se fait en deux coups de cuillère à pot.

toto.pl
#!/usr/bin/perl 
use strict;use warnings;

my %tab;

while (<STDIN>) {
    /dstname=(.*) rcvd=(.*)/;
    $tab{$1}[0]++;
    $tab{$1}[1]+=$2;
}

foreach my $k (keys %tab) {
    print "$k visites $tab{$k}[0] visites $tab{$k}[1] Ko\n";
}


Pour lancer utiliser le fichier : cat Log | toto.pl
N'oublie pas de faire chmod u+x pour mettre les droits nécessaires à l'exécution du programme.

De plus, le script toto.pl réalise juste la sortie de la forme : www.google.fr 81 visites 678098 Ko.
Je ne savais par quoi tu voulais trier, je te laisse modifier le script perl ;)

Si tu sais pas, tu peux passer par sort.

Pour le tri par nombre de visites :
cat Log | toto.pl | sort -rn -k3

Pour le tri par somme des rcvd :
cat Log | toto.pl | sort -rn -k5

Cdlt
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
16 mars 2009 à 12:18
Salut,
Il y a sûrement plus court, mais tu peux utiliser :
sed 's/.* rcvd=\([0-9]*\)/\1\|&/' Log | sort -rn | cut -d'|' -f2

Le premier sed va rajouter une colonne contenant le champ rcvd. Grâce à cette colonne, on va trier suivant les valeurs numériques (sort -n). Et enfin on supprime cette colonne.

Si tu veux récupérer la colonne dstname :
sed 's/.* rcvd=\([0-9]*\)/\1\|&/' Log | sort -rn | awk '{print $2}'


Cdlt
0
Merci fiddy, mais j'ai oublié de préciser qqchose: les logs que je reçois correspondent à des trames. Donc, j'ai plusieurs fois les mêmes sites qui apparaissent:

src=10.0.0.2 dstname=www.google.fr rcvd=3123
src=10.11.20.56 dstname=www.yahoo.com rcvd=12987
src=10.0.1.4 dstname=www.google.fr rcvd=6453
...

En fait, il faudrait que je compte le nombre de fois ou un site apparait, et que j'additionne le nombre de "rcvd" correspondant. Pour obtenir quelche chose dans ce genre:

www.google.fr 81 visites 678098 Ko
www.yahoo.com 21 visites 56989 Ko
...
0
Merci beaucoup! ça marche très bien! Et puis le Perl a franchement une gueule plus sympa que le Awk ;)
0