Auteur Sujet: Script bash pour suppression de lignes en double dans un fichier de log  (Lu 5722 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 076
    • Twitter LaFibre.info
Je chercher à faire un script de suppression de lignes en double dans un fichier de log.

Vous connaissez la commande sous Linux qui permet de se débarrasser de double dans un fichier :
cat fichier.log | sort | uniq > sortie.log

Je souhaiterais supprimer les lignes d’un fichier de log Apache2 en ne gardant qu’une ligne par IP.




Exemple concret :

Fichier source :
46.227.16.8  - [19/Sep/2016:09:57:18 +0200] "GET / HTTP/1.1" 200 2622 "" "Firefox/48.0"
46.227.16.8  - [19/Sep/2016:09:57:19 +0200] "GET /Themes/default/images/theme/menu_gfx.png HTTP/1.1" 200 2622 "" "Firefox/48.0"
21.46.64.16  - [19/Sep/2016:09:57:20 +0200] "GET /orange-les-news/show-hello-2016/ HTTP/1.1" 200 2622 "" "Chrome/52.0"
46.227.16.8  - [19/Sep/2016:09:57:21 +0200] "GET /images/logo/lafibre.png HTTP/1.1" 200 2622 "" "Firefox/48.0"
21.46.64.16  - [19/Sep/2016:09:57:22 +0200] "GET / HTTP/1.1" 200 2622 "" "Chrome/52.0"
21.46.64.16  - [19/Sep/2016:09:57:23 +0200] "GET /images/orange/201603_livebox_v4_02.jpg HTTP/1.1" 200 2622 "" "Chrome/52.0"

Fichier en sortie :
46.227.16.8  - [19/Sep/2016:09:57:18 +0200] "GET / HTTP/1.1" 200 2622 "" "Firefox/48.0"
21.46.64.16  - [19/Sep/2016:09:57:20 +0200] "GET /orange-les-news/show-hello-2016/ HTTP/1.1" 200 2622 "" "Chrome/52.0"

Seul la première ligne de chaque IP est conservée.
Cela permet d'avoir rapidement les visiteurs uniques (en supposant un visiteur unique = une IP), de faire des stats pour voir si IE8 est encore utilisé par beaucoup d'utilisateurs distincts,...

Optix

  • AS41114 - Expert OrneTHD
  • Abonné Orne THD
  • *
  • Messages: 4 644
  • WOOHOO !
    • OrneTHD
Script bash pour suppression de lignes en double dans un fichier de log
« Réponse #1 le: 19 septembre 2016 à 10:19:02 »
Pas plus simple de dire à Apache de ne pas logger les accès aux fichiers statiques, genre images, css & cie ?

vivien

  • Administrateur
  • *
  • Messages: 47 076
    • Twitter LaFibre.info
Script bash pour suppression de lignes en double dans un fichier de log
« Réponse #2 le: 19 septembre 2016 à 10:28:28 »
Cela ne te donnes pas les visiteurs uniques et j'ai d'autres idées de choses à faire avec un tel script...

Personne n'a ce type de script sous la main ?

Si c'est plus simple, il faut garder une ligne, pas nécessairement la première qui apparaît.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Script bash pour suppression de lignes en double dans un fichier de log
« Réponse #3 le: 19 septembre 2016 à 11:28:29 »
essai un truc du genre:

cat fichier.log | awk '!x[$1]++'
on peut raffiner apres.

vivien

  • Administrateur
  • *
  • Messages: 47 076
    • Twitter LaFibre.info
Script bash pour suppression de lignes en double dans un fichier de log
« Réponse #4 le: 19 septembre 2016 à 14:54:32 »
Merci ! C'est exactement ce que je cherchais.
Je suis scotché par la vitesse de traitement, c'est vraiment rapide, sur un fichier de plus de 3 millions de lignes (de toute façon Excel / cal ne gèrent pas au-delà de 1million de ligne, donc on n'a pas le choix)

Précision pour ceux qui voudraient utiliser le script de kgersen avec un fichier .csv, le séparateur par défaut FS(Fields Separator) est un espace. Pour un fichier .csv, voici comment spécifier le FS :

awk 'BEGIN{FS=","} !x[$1]++' tableau.csv

Pour la suite d'enregistrements, par défaut RS (Record Separator) = saut de ligne, il est possible de modifier de la même façon RS, si les enregistrements ne sont plus séparées par des saut de ligne.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Script bash pour suppression de lignes en double dans un fichier de log
« Réponse #5 le: 19 septembre 2016 à 17:02:38 »
Tu peux aussi préciser le séparateur via l'option -F de la commande awk:

awk -F, '!x[$1]++'

ce qui est plus succinct.


vivien

  • Administrateur
  • *
  • Messages: 47 076
    • Twitter LaFibre.info
Script bash pour suppression de lignes en double dans un fichier de log
« Réponse #6 le: 20 septembre 2016 à 11:42:00 »
Voici ce que cela donne pour voir les IP uniques sur un fichier de log : (ici celui de LaFibre.info pour le mois d’août 2016)

Je supprime dans les log tous les éléments du type images, qui peuvent être utilisées (certains diront volés) par d'autres sites.
Je supprime également les principaux robots (Google/Bing/Yahoo/Facebook External Hit/Alexa Crawler)
J’applique ensuite la ligne de kgersen qui permet de ne garder qu'une ligne par IP.


$ cat 201608_lafibre.log | grep -v -E ".jpg HTTP/|.jpeg HTTP/|.png HTTP/|.gif HTTP/|.ico HTTP/|.pdf HTTP/|Googlebot|Bingbot|Slurp|facebot|ia_archiver" | awk '!x[$1]++' | wc -l
319285
Il y a donc 319 285 IP distinctes qui ont visités le forum au mois d’août.

https://lafibre.info :
Janvier 2016 : 322 112 IP
Février 2016 : 313 687 IP
Mars 2016 : 328 881 IP
Avril 2016 : 322 423 IP
Mai 2016 : 316 892 IP
Juin 2016 : 309 477 IP
Juillet 2016 : 305 415 IP
Août 2016 : 319 285 IP

https://carte-fh.lafibre.info/
Janvier 2016 : 1 814 IP
Février 2016 : 1 839 IP
Mars 2016 : 2 945 IP
Avril 2016 : 2 354 IP
Mai 2016 : 2 249 IP
Juin 2016 : 2 592 IP
Juillet 2016 : 3 449 IP
Août 2016 : 3 439 IP

https://iperf.fr
Janvier 2016 : 62 164 IP
Février 2016 : 65 836 IP
Mars 2016 : 72 376 IP
Avril 2016 : 68 337 IP
Mai 2016 : 70 772 IP
Juin 2016 : 68 940 IP
Juillet 2016 : 63 506 IP
Août 2016 : 69 560 IP


Voici ce que cela donne sans les robots pour LaFibre.info août 2016 :
$ cat 201608_lafibre.log | grep -v -E ".jpg HTTP/|.jpeg HTTP/|.png HTTP/|.gif HTTP/|.ico HTTP/|.pdf HTTP/" | awk '!x[$1]++' | wc -l
319438
Il y a donc 153 IP distinctes de robots qui ont parcouru le forum (319438 - 319285 = 153)

Voici ce que cela donne sans les robots ni filtrage des images pour août 2016 :
$ cat 201608_lafibre.log | awk '!x[$1]++' | wc -l
505893
(il y a donc près de 200 000 IP qui récupèrent des images du forum, sans jamais le visiter)

Nombre de ligne du fichier brut pour août 2016 :
$ cat 201608_lafibre.log | wc -l
22105668