La commande awk sous Linux : le guide complet pour enfin la comprendre
awk a une réputation : celle d’être extrêmement puissante… et difficile à apprivoiser. Cette réputation n’est pas tout à fait méritée. Si awk déroute au début, c’est qu’on l’aborde souvent comme une simple commande, alors que c’est en réalité un petit langage de programmation dédié au traitement de texte structuré en colonnes. Une fois qu’on a compris son mécanisme de base, tout le reste s’éclaire.
Ce guide prend le problème par le bon bout : il commence par expliquer comment awk raisonne, puis construit les compétences une par une, avec de nombreux exemples concrets. À la fin, vous saurez extraire des colonnes, filtrer des lignes, faire des calculs et générer des rapports — des tâches qui prendraient un script entier dans d’autres langages. Tous les exemples sont neutres et réutilisables tels quels.
Le modèle mental : comment awk lit un fichier
C’est le point le plus important de tout ce guide. Si vous retenez cette section, le reste coule de source.
awk lit un fichier ligne par ligne. Pour chaque ligne, il fait automatiquement deux choses :
- Il découpe la ligne en champs (colonnes), séparés par des espaces ou des tabulations par défaut.
- Il numérote ces champs :
$1est le premier champ,$2le deuxième, et ainsi de suite.$0représente la ligne entière.
Imaginez un fichier personnes.txt contenant :
Alice 30 Paris
Bob 25 Lyon
Claire 35 Marseille
Pour awk, sur la première ligne : $1 vaut « Alice », $2 vaut « 30 », $3 vaut « Paris », et $0 vaut « Alice 30 Paris ». C’est aussi simple que ça — et c’est toute la clé de awk.
Afficher des colonnes
Fort de ce modèle, le premier usage devient évident. Pour afficher uniquement la première colonne (les prénoms) :
awk '{print $1}' personnes.txt
Résultat : Alice, Bob, Claire. La commande print affiche ce qu’on lui demande, et { } contient l’action à effectuer sur chaque ligne.
Pour afficher plusieurs colonnes, par exemple le prénom et la ville :
awk '{print $1, $3}' personnes.txt
La virgule entre $1 et $3 insère un espace entre les deux. Sans la virgule, les valeurs seraient collées.
Pour afficher la ligne entière, on utilise $0 :
awk '{print $0}' personnes.txt
La structure de awk : condition et action
Voici le deuxième concept fondamental. Un programme awk suit toujours ce schéma :
awk 'condition { action }' fichier
- la condition détermine sur quelles lignes agir ;
- l’action, entre accolades, dit quoi faire.
Si on omet la condition, l’action s’applique à toutes les lignes (c’est ce qu’on a fait jusqu’ici). Si on omet l’action, awk affiche par défaut les lignes qui remplissent la condition. Cette double logique explique la souplesse de l’outil.
Filtrer des lignes selon une condition
C’est ici que awk commence à briller. On peut filtrer sur le contenu des champs.
Pour afficher les lignes où l’âge (deuxième champ) est supérieur à 28 :
awk '$2 > 28 {print $1}' personnes.txt
Cela affiche Alice et Claire (30 et 35), mais pas Bob (25). awk a comparé le champ numérique automatiquement.
Pour filtrer sur du texte, par exemple les personnes habitant Lyon :
awk '$3 == "Lyon" {print $1}' personnes.txt
On peut aussi chercher un motif dans toute la ligne, à la manière de grep, en le plaçant entre slashes :
awk '/Paris/ {print $1}' personnes.txt
Changer le séparateur de champs avec -F
Par défaut, awk découpe sur les espaces. Mais beaucoup de fichiers utilisent un autre séparateur — la virgule des fichiers CSV, ou le deux-points de certains fichiers système. L’option -F définit ce séparateur.
Pour un fichier CSV donnees.csv du type Alice,30,Paris :
awk -F',' '{print $1, $3}' donnees.csv
Ici, awk découpe sur la virgule. C’est l’une des utilisations les plus fréquentes de awk : extraire des colonnes d’un fichier CSV sans ouvrir de tableur.
Faire des calculs
Contrairement à la plupart des outils de texte, awk sait compter et calculer. C’est ce qui le rend irremplaçable pour produire des statistiques rapides.
Pour additionner tous les âges (le deuxième champ) et afficher le total :
awk '{somme += $2} END {print somme}' personnes.txt
Deux nouveautés ici. D’abord, somme += $2 accumule la valeur à chaque ligne (pas besoin de déclarer la variable, awk s’en charge). Ensuite, le bloc END { } s’exécute une seule fois, à la toute fin, après avoir lu toutes les lignes. C’est là qu’on affiche le résultat final.
Pour calculer une moyenne, on divise la somme par le nombre de lignes. awk fournit une variable spéciale, NR (Number of Records), qui compte les lignes :
awk '{somme += $2} END {print somme / NR}' personnes.txt
Les variables spéciales à connaître
awk met à disposition plusieurs variables automatiques, très utiles :
NR: le numéro de la ligne courante (et le total à la fin) ;NF: le nombre de champs de la ligne courante ;$0: la ligne entière ;FS: le séparateur de champs (équivalent de l’option-F).
NF est particulièrement pratique. Pour afficher le dernier champ de chaque ligne, quel que soit le nombre de colonnes :
awk '{print $NF}' fichier.txt
Comme NF contient le nombre de champs, $NF désigne le dernier. Astucieux et robuste.
Pour numéroter les lignes d’un fichier, on affiche NR suivi de la ligne :
awk '{print NR, $0}' fichier.txt
Les blocs BEGIN et END
On a vu END. Il existe aussi BEGIN, qui s’exécute avant de lire la moindre ligne. Ces deux blocs encadrent le traitement.
BEGIN sert typiquement à afficher un en-tête ou à initialiser une variable. END sert à afficher un bilan. Ensemble, ils permettent de produire un vrai petit rapport :
awk 'BEGIN {print "=== Liste des personnes ==="} {print $1} END {print "Total : " NR " personnes"}' personnes.txt
Cette commande affiche un titre, puis chaque prénom, puis un total. On tient là un rapport complet en une seule ligne — ce qui illustre pourquoi awk est si apprécié pour ce genre de tâche.
Formater la sortie avec printf
print suffit pour un affichage simple, mais quand on veut aligner des colonnes ou contrôler le format des nombres, printf offre un contrôle précis. Sa syntaxe reprend celle du langage C.
Pour afficher le prénom et l’âge dans des colonnes alignées :
awk '{printf "%-10s %s\n", $1, $2}' personnes.txt
Ici, %-10s réserve 10 caractères alignés à gauche pour la chaîne, ce qui aligne proprement la colonne suivante. Le \n est nécessaire car, contrairement à print, printf n’ajoute pas de retour à la ligne automatiquement.
Combiner plusieurs conditions
On peut associer des conditions avec les opérateurs logiques && (ET) et || (OU).
Pour afficher les personnes de plus de 28 ans et habitant Paris :
awk '$2 > 28 && $3 == "Paris" {print $1}' personnes.txt
Pour afficher celles habitant Lyon ou Marseille :
awk '$3 == "Lyon" || $3 == "Marseille" {print $1}' personnes.txt
Cette capacité à combiner des critères sur différentes colonnes est ce qui distingue vraiment awk d’un simple grep.
Un exemple complet et parlant
Rassemblons plusieurs notions dans un cas réaliste. Supposons un fichier ventes.txt où chaque ligne contient un vendeur et un montant :
Alice 1200
Bob 800
Claire 1500
Alice 600
Pour calculer le total des ventes par vendeur, awk utilise un tableau associatif (un dictionnaire) — l’une de ses fonctionnalités les plus puissantes :
awk '{total[$1] += $2} END {for (vendeur in total) print vendeur, total[vendeur]}' ventes.txt
Décortiquons : total[$1] += $2 accumule le montant ($2) dans une case du tableau indexée par le nom du vendeur ($1). À la fin, la boucle for parcourt le tableau et affiche chaque vendeur avec son total (total[vendeur]). Alice apparaîtra avec 1800, Bob avec 800, Claire avec 1500. Faire cela avec d’autres outils demanderait bien plus d’efforts.
Pièges et erreurs fréquentes
Quelques écueils classiques quand on débute avec awk :
Oublier les guillemets simples. Le programme awk doit être entouré de guillemets simples pour que le shell ne touche pas aux $1, $2 et autres symboles. Avec des guillemets doubles, le shell tenterait d’interpréter les $.
Confondre le séparateur par défaut. awk découpe sur les espaces et tabulations. Pour un CSV ou tout autre format, pensez à préciser -F avec le bon séparateur, sinon les champs seront mal découpés.
Placer l’affichage au mauvais endroit. Un calcul cumulé (comme une somme) doit être affiché dans le bloc END, pas dans le bloc principal — sinon il s’affiche à chaque ligne au lieu d’une seule fois à la fin.
Comparer du texte sans guillemets. Dans une condition, une valeur texte doit être entre guillemets doubles ($3 == "Paris"). Sans guillemets, awk la prendrait pour une variable.
Vouloir tout faire en awk. awk est excellent pour le texte en colonnes, mais pour certaines tâches un grep ou un cut plus simple suffit. Utilisez-le là où il excelle : filtrer, calculer et reformater des données tabulaires.
Combiner awk avec d’autres commandes
Comme les autres outils Unix, awk s’intègre naturellement dans une chaîne de traitement.
En bout de pipe, il extrait une colonne de la sortie d’une autre commande. Par exemple, afficher les noms de processus à partir de la sortie de ps :
ps aux | awk '{print $11}'
Combiné à grep, on filtre d’abord puis on extrait. Par exemple, isoler l’espace disque utilisé sur une ligne spécifique :
df -h | grep "/dev" | awk '{print $1, $5}'
Et associé à sort, awk sert à produire des classements — extraire une colonne puis la trier. Cette complémentarité avec grep, sed, sort et les pipes fait de awk la pièce maîtresse du traitement de texte avancé en ligne de commande.
En résumé
La difficulté de awk s’évapore dès qu’on a intégré son modèle : lire ligne par ligne, découper en champs ($1, $2, … $NF), et appliquer une action selon une condition. À partir de là :
- extraire des colonnes avec
print; - filtrer des lignes selon des conditions sur les champs ;
- calculer avec des variables cumulées et le bloc
END; - utiliser les variables spéciales (
NR,NF) et les blocsBEGIN/END; - formater avec
printfet agréger avec les tableaux associatifs ; - combiner avec
grep,sortet les pipes.
Le meilleur moyen d’apprendre awk est de partir d’un petit fichier d’exemple et de tester chaque commande en observant le résultat. Ce qui semblait cryptique devient vite un réflexe — et vous vous surprendrez à résoudre en une ligne des problèmes qui auraient demandé un script entier.
Une fois qu’on tient le fil de awk, on ne s’en passe plus. Avec find, grep et sed, il complète le quatuor des outils qui transforment le terminal en véritable atelier de traitement de données.