Parse de log avec awk

Parse de log avec awk - Shell/Batch - Programmation

Marsh Posté le 04-10-2011 à 21:42:54    

Hello,  
 
J'ai un petit soucis avec mes parses de logs, j'aimerai passer par awk pour faire ça mais la je bloque.
Je m'explique, normalement on lis le fichier ligne par ligne on extrait les champs, mais j'aimerai avoir le nombre de connexion sur une page/un site pour chaque IP et faire une moyenne de traffic pour cette page
 
Ex de mon fichier :  
 
id_connexion date heure port nom_page traffic ip  
 
1 10/11/10 12h30 80 index.php 280 10.120.111.1
2 16/11/10 10h35 80 test.php 288 10.129.111.1
3 19/11/10 11h54 80 index.php 390 10.120.111.1
4 28/12/10 22h28 80 index.php 400 10.120.111.9
 
En gros j'aimerai savoir combien de fois index.php a été visité et la moyenne de traffic pour cette page afin d'obtenir un truc du genre :  
 
page moyenne visités
index.php 1070 3
 
Je pensais commencer avec sort nom_page puis sort ip histoire de faciliter le traitement qui va suivre.
Et appliquer des filtres sur la sortie pour garder les 5 pages les plus visités (nombre de visites) puis en volume avec la moyenne par volume et l'inverse.  
 
Après est ce possible d'avoir la répartition du traffic pour l'adresse 10.120.111.1 ou les adresses ip contenant 120 qui passent sur les sites les plus visités ?
 
Accessoirement, on peut pas faire d'histogramme en mode console avec awk ?
 
-
 
Vu la taille potentielle des logs que je vais avoir, mettre ça dans une BDD n'est pas envisageable même si j'aurais été bien plus à l'aise avec des where et des group by et en théorie sur le papier et des modèles de maths ça marche très bien.
 
Merci d'avance de votre aide.

Reply

Marsh Posté le 04-10-2011 à 21:42:54   

Reply

Marsh Posté le 05-10-2011 à 11:42:24    

Utilises plutôt perl, qui est parfait pour faire cela.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-10-2011 à 12:21:46    

L'ennuie c'est que je n'y connais rien du tout en programmation et donc en perl.

Reply

Marsh Posté le 05-10-2011 à 14:39:29    

Tu peux voir perl comme du Awk survitaminé.
Si tu sais faire du SQL (> si j'aurais été bien plus à l'aise avec des where et des group by) tu peux apprendre le perl de base sans pb.
 
Un petit exemple qui va calculer la somme du traffic pour chaque page (identifiée par son IP et nom de page):

Code :
  1. #!/usr/bin/perl
  2.  
  3. # error-check flags
  4. use strict;
  5. use warnings;
  6. # Use readable built-in names
  7. use English qw( -no_match_vars );
  8.  
  9. my %traffic; # un hash qui va avoir pour clé une chaine concaténée de l'IP et du nom de page
  10.                  # et pour valeur (incrémentale), le traffic
  11. my $filename = 'logdata.txt'; # fichier des données ou j'ai mis les 4 lignes que tu as donné
  12. open(my $fh, '<', $filename) or die "$filename: fichier pas trouve!"; # ouverture en lecture
  13. while (<$fh> ) {
  14.  # expression régulière de ta ligne de données
  15.   if (/^(\d+)\s+(\d\d\/\d\d\/\d\d)\s+(\d\dh\d\d)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\d+\.\d+\.\d+\.\d+)\s*$/o) {
  16.     # maintenant tu as tes champs dans les variables $1, $2...$7
  17.     # a toi d'en faire usage
  18.     $traffic{$7.' '.$5} += $6; # somme avec la valeur courante
  19.  }
  20. }
  21. close $fh;
  22.  
  23. # maniere standard de parcourir un hash
  24. foreach my $key (keys %traffic) {
  25.  print "IP and page: $key, traffic: $traffic{$key}\n";
  26. }

C:\Perl>perl logdata.pl
IP and page: 10.120.111.9 index.php, traffic: 400
IP and page: 10.120.111.1 index.php, traffic: 670
IP and page: 10.129.111.1 test.php, traffic: 288


 
A+,


Message édité par gilou le 05-10-2011 à 14:40:47

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed