awk est un mini-langage orienté « motif → action ». Il découpe automatiquement chaque ligne en champs (par défaut sur les espaces) et exécute le bloc d'action sur les lignes qui correspondent au motif. Idéal pour extraire, filtrer ou agréger des colonnes sans écrire de boucle Bash.
Syntaxe
awk 'motif { action }' fichier
awk -F: '{print $1}' /etc/passwd
# CSV simple sans virgules dans les champs ; ignorer la ligne d’en-tête
awk -F, 'NR>1 {sum+=$2; n++} END {if (n) print "moyenne:", sum/n; else print "aucune donnee"}' data.csv
Variables intégrées
$0 | Ligne entière. |
$1 … $N | Champs (1-indexés). |
NF | Nombre de champs sur la ligne courante. $NF = dernier champ. |
NR | Numéro de la ligne courante (à partir de 1). |
FS / OFS | Séparateur d'entrée / de sortie. Par défaut espace/espace. |
BEGIN / END | Blocs exécutés une fois avant et après le parcours. |
$ awk -F: '$3 >= 1000 {print $1, $6}' /etc/passwd
Liste les comptes d'UID supérieur ou égal à 1000 avec leur répertoire personnel ; cela peut inclure nobody et des comptes techniques. -F: dit à awk de découper sur :, le filtre $3 >= 1000 applique un seuil courant, dépendant de la distribution, sans garantir des comptes humains, et l'action affiche colonnes 1 (login) et 6 (home).
$ awk '{sum+=$1} END {if (NR) print "total:", sum, "moy:", sum/NR; else print "aucune donnee"}' nombres.txt
Somme et moyenne d’une colonne numérique. Le test NR protège la division lorsque le fichier est vide ; les lignes doivent contenir les nombres attendus.
$ ps aux | awk 'NR==1 || /nginx/'
Garde l'en-tête (NR==1) puis les lignes contenant « nginx ». Plus propre que grep nginx qui jetterait l'en-tête.
Astuce :
dès qu'un pipe combine grep | cut ou grep | sed | sort, un seul awk bien écrit fait souvent le même travail plus lisiblement et plus vite (un seul processus au lieu de trois).
Voir aussi :
sed cut grep