Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 06/01/2012, à 23:31

nesthib

[astuce/awk] pourquoi awk est si puissant ? un petit exemple

une petite astuce pour montrer la puissance d'awk (et plus généralement des « petits » programmes en ligne de commande)

j'avais un fichier de log de la forme :

20xx-xx-xx xx:xx:xx username1 Lorem ipsum dolor sit amet
20xx-xx-xx xx:xx:xx username2 consectetur adipisicing elit, sed do eiusmod tempor 
20xx-xx-xx xx:xx:xx username3 incididunt ut labore et dolore magna aliqua
20xx-xx-xx xx:xx:xx username1 Ut enim ad minim veniam, quis nostrud 
20xx-xx-xx xx:xx:xx username3 exercitation ullamco laboris nisi ut aliquip
20xx-xx-xx xx:xx:xx username1 ex ea commodo consequat.
[…]

je voulais faire quelques statistiques pour compter le nombre de lignes ou de mots par username, ce qui, vous allez le voir, se fait simplement avec awk.
pour le nombre de lignes :

awk '{ names[$3]++ } END { for (name in names) print name, names[name] }' log

pour le nombre de mots :

awk '{ names[$3]+=(NF-3) } END { for (name in names) print name, names[name] }' log

et donne respectivement  les résultats :

username1 3
username2 1
username3 2
username1 19
username2 8
username3 15

bien sûr il est possible de faire les deux à la fois :

awk '{ lignes[$3]++ ; mots[$3]+=(NF-3) } END { for (name in lignes) print name, lignes[name], mots[name] }' log

pour obtenir :

username1 3 19
username2 1 8
username3 2 15

pour trier par ordre décroissant on peut combiner awk et sort :

awk '{ names[$3]+=(NF-3) } END { for (name in names) print names[name], name }' log | sort -nr

ce qui donne :

19 username1
15 username3
8 username2

un petit hack un peu plus compliqué, pour trier sans utiliser sort (awk n'est pas vraiment fait pour trier facilement) :

awk '{ names[$3]+=(NF-3) } END { for (name in names) x[name]=sprintf("%5d %s", names[name], name) ; n=asort(x) ; for (i=n;i>0;i--) print x[i] }' log

Rien de bien extraordinaire, mais j'espère que ça donnera l'envie d'utiliser la ligne de commande (et awk) à ceux qui n'osent pas ou n'y pensent pas.
Et pour ceux qui ne sont toujours pas convaincus, il suffit d'une ligne de code et d'une demi seconde pour analyser un fichier de plusieurs centaines de milliers de lignes.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#2 Le 07/01/2012, à 00:22

Kanor

Re : [astuce/awk] pourquoi awk est si puissant ? un petit exemple

Alors vue que nesthib m' a demandé de voir qu'est ce que ça peux donner une version en python voila ce que je trouve

from itertools import groupby
from operator import itemgetter
import re
a = [re.findall(r'\w+', j)[6] for j in open('log.ex').readlines()]
a.sort()
b = [(i, len(list(l))) for i, l in groupby(a)]
b.sort(key= itemgetter(1), reverse = True)
print "\n".join(["%s %s" % c for c in b])

Dernière modification par Kanor (Le 07/01/2012, à 00:39)

Hors ligne

#3 Le 07/01/2012, à 13:00

HP

Re : [astuce/awk] pourquoi awk est si puissant ? un petit exemple

#!/bin/sh

LOCATIONS="FRXX0034 FRXX3641 FRXX0071"
main() {
    echo $LOCATIONS | \
    awk '{ for (i = 1; i <= NF; i++) system("yweather " $i " &") }'
}

main

J'aurais certainement pu tout faire en awk… mais c'est un script sh

Hors ligne

#4 Le 07/01/2012, à 13:29

nesthib

Re : [astuce/awk] pourquoi awk est si puissant ? un petit exemple

tu aurais surtout pu tout faire en bash smile

#!/bin/bash
LOCATIONS=(FRXX0034 FRXX3641 FRXX0071)
for location in ${LOCATIONS[@]}
do
    yweather $location &
done

là, l'utilisation d'awk pour faire une boucle et lancer une commande est un peu superflue

(NB. pour ceux qui veulent tester le script yweather présenté ci-dessus, le lien)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#5 Le 07/01/2012, à 13:31

HP

Re : [astuce/awk] pourquoi awk est si puissant ? un petit exemple

nesthib a écrit :

tu aurais surtout pu tout faire en bash smile

Non, et je m'y refuse…

Hors ligne

#6 Le 07/01/2012, à 19:10

nesthib

Re : [astuce/awk] pourquoi awk est si puissant ? un petit exemple

à utiliser bash ? pourquoi ?
de toute façon, en sh :

#!/bin/sh
LOCATIONS="FRXX0034 FRXX3641 FRXX0071"
for location in $LOCATIONS
do
    yweather $location &
done

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

Haut de page ↑