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.