awk
À quoi il sert
awk, créé en 1977 par Aho, Weinberger et Kernighan, lit son entrée ligne par ligne, découpe chaque ligne en champs ($1, $2... $NF) et applique des règles de la forme motif { action }. Il dispose de variables, de tableaux associatifs, de printf et de calculs décimaux, ce qui suffit à la plupart des agrégations : awk '{ n[$12]++ } END { for (c in n) print c, n[c] }' compte les codes HTTP d'un journal en une passe. Le langage est normalisé par POSIX. Plusieurs implémentations coexistent : sur Debian et Ubuntu, la commande awk est par défaut mawk (1.3.4, maintenu par Thomas Dickey), rapide et conforme à POSIX ; gawk, la version GNU (5.2.1 sur Ubuntu 24.04 et Debian 13), s'installe à part et devient alors awk par le système des alternatives.
Quand le choisir
Dès qu'un script shell traite plus de quelques milliers de lignes : une boucle while read qui lance une commande par ligne est des dizaines à des milliers de fois plus lente qu'un seul processus awk. Pour du texte tabulaire à séparateur simple (journaux, sorties de commandes, /etc/passwd), awk est l'outil juste. Pour du JSON, prenez jq ; pour du CSV avec des champs entre guillemets, Python et son module csv ou Miller ; pour un programme qui dépasse quelques lignes, Python.
Points d'attention
- Écrivez pour POSIX, donc pour mawk, si le script doit tourner sur une machine Debian ou Ubuntu non modifiée :
asort,strftime,gensub, les tableaux de tableaux ou-i inplacen'existent que dans gawk. - Passez les valeurs du shell par
-v nom="$valeur", jamais en les collant dans le texte du programme, qui serait alors injectable. - L'ordre de
for (cle in tableau)n'est pas garanti : triez la sortie avecsort. - Les décimales suivent la locale avec certaines implémentations : mawk écrit
42,9sous une locale française. FixezLC_ALL=C.UTF-8dans un script qui produit des nombres pour une machine. - Le séparateur par défaut regroupe les espaces et tabulations consécutifs ;
-F,découpe sur chaque virgule, sans comprendre les guillemets du CSV.
Par où commencer
La leçon Boucles et lecture de données du cours Bash pour l'automatisation, qui compare une boucle Bash et awk sur les journaux de Signalements, et Paramètres, chaînes et calculs pour les calculs décimaux. Puis la spécification POSIX d'awk et le manuel de gawk, GAWK: Effective AWK Programming.