GNU AWK
⚠️ Ces pratiques ont été testées avec l’implémentation GNU de AWK (GAWK), il n’est pas garanti que cela fonctionne avec d’autres implémentations (MAWK, NAWK…)
Pense-bête
Additionner toutes les valeurs numériques de plusieurs lignes
Exemple pratique : additionner la taille de toutes les bibliothèques de fonctions
contenues dans /usr/lib
.
Première étape : identifier tous les fichiers concernés :
find /usr/lib -type f -iname '*.so' -ls
…
<beaucoup de fichiers>
…
153269 12 -rwxr-xr-x 1 root root 10288 déc. 7 05:47 /usr/lib/ImageMagick-6.8.0/modules-Q16/coders/clip.so
151870 12 -rwxr-xr-x 1 root root 10232 déc. 7 05:47 /usr/lib/ImageMagick-6.8.0/modules-Q16/filters/analyze.so
Seconde étape : identifier le champ de chaque ligne contenant la valeur
numérique à cumuler aux autres (ici, le 7ème champ), et filtrer l’output de
find
avec awk
:
find /usr/lib -type f -iname '*.so' -ls | awk '{ sum += $7 } END { print sum }'
460310309
Astuces
Utiliser des variables Bash dans une expression AWK
Il est parfois utile de pouvoir accéder à des variables Bash depuis une
expression AWK. Pour ce faire, il faut invoquer l’interpréteur awk
avec
l’option -v
et initialiser une variable AWK à la valeur de la variable Bash.
Exemple utilisant un timestamp UNIX récupéré en Bash :
$ grep eth0 /proc/net/dev | cut -d: -f 2 | awk -v ts=\`date +%s\` '{print ts":"$1,ts":"$9}'
1311629204:4916897284 1311629204:10797655993
Écrire dans un fichier plutôt que sur la sortie standard
echo "plop" | gawk '{ print > "/tmp/blah" }')