#1 Le 06/01/2012, à 22: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] }' logpour le nombre de mots :
awk '{ names[$3]+=(NF-3) } END { for (name in names) print name, names[name] }' loget donne respectivement les résultats :
username1 3
username2 1
username3 2username1 19
username2 8
username3 15bien 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] }' logpour obtenir :
username1 3 19
username2 1 8
username3 2 15pour 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 -nrce qui donne :
19 username1
15 username3
8 username2un 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] }' logRien 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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#2 Le 06/01/2012, à 23: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 06/01/2012, à 23:39)
Hors ligne
#3 Le 07/01/2012, à 12: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 " &") }'
}
mainJ'aurais certainement pu tout faire en awk… mais c'est un script sh
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#4 Le 07/01/2012, à 12:29
- nesthib

Re : [astuce/awk] pourquoi awk est si puissant ? un petit exemple
tu aurais surtout pu tout faire en bash ![]()
#!/bin/bash
LOCATIONS=(FRXX0034 FRXX3641 FRXX0071)
for location in ${LOCATIONS[@]}
do
yweather $location &
donelà, 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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#5 Le 07/01/2012, à 12:31
- HP

Re : [astuce/awk] pourquoi awk est si puissant ? un petit exemple
tu aurais surtout pu tout faire en bash
Non, et je m'y refuse…
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#6 Le 07/01/2012, à 18: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 &
doneGUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne