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" }')