Dans cette leçon, tu vas découvrir AWK, un langage incrusté et un outil en ligne de commande extrèmement puissant pour manipuler du texte structuré. Si grep sélectionne des lignes et sed remplace du texte, AWK va bien plus loin : il permet d'appliquer des calculs, des conditions, des formats et de générer des rapports structurés — le tout en une seule commande.
Tu verras également le cousin de AWK : GAWK (GNU AWK), qui est la version la plus courante sur Linux aujourd'hui.
AWK est né en 1977 aux laboratoires Bell. Son nom vient des initiales de ses créateurs : Aho, Weinberger et Kernighan.
Conçu à l'origine pour traiter des fichiers textes structurés (comme des tableaux ou des logs), AWK lit un fichier ligne par ligne, divise chaque ligne en champs (colonnes) séparés par des espaces ou un séparateur personnalisé, et exécute des actions sur chaque ligne correspondant à un motif.
La syntaxe de base est simple :
awk 'motif { action }' fichier
BEGIN / END spéciales)- pour l'entrée standard)Chaque ligne est automatiquement divisée en champs. AWK utilise :
| Variable | Signification |
|---|---|
$0 |
La ligne entière |
$1 |
Le 1er champ |
$2 |
Le 2e champ |
$3 ... |
Les champs suivants |
$NF |
Le dernier champ (NF = Number of Fields) |
Exemple — Voici un fichier employes.txt :
Alice Administrateur 4500 Bob Developpeur 6200 Claire Technicien 3800 David Developpeur 6100 Emma Manager 7500
Afficher le nom et le salaire (1er et 3e champ) :
awk '{ print $1, $3 }' employes.txt
Résultat :
Alice 4500 Bob 6200 Claire 3800 David 6100 Emma 7500
Par défaut, AWK utilise l'espace comme séparateur. Pour un fichier CSV (séparateur ;) :
awk -F';' '{ print $1, $3 }' employes.csv
On peut aussi changer le séparateur avec BEGIN { FS = ";" } :
awk 'BEGIN { FS = ":" } { print $1, $NF }' /etc/passwd | head -5
Afficher uniquement les développeurs :
awk '$2 == "Developpeur" { print $1, $3 }' employes.txt
Résultat :
Bob 6200 David 6100
Afficher les employés gagnant plus de 5000 :
awk '$3 > 5000 { print $1, $3 }' employes.txt
Résultat :
Bob 6200 David 6100 Emma 7500
Afficher les lignes commençant par "D" :
awk '$1 ~ /^D/ { print $0 }' employes.txt
Résultat :
David Developpeur 6100
BEGIN : s'exécute avant le traitement du fichierEND : s'exécute après le traitement du fichierCalculer la somme totale des salaires :
awk 'BEGIN { total = 0 }
{ total += $3 }
END { print "Total salaires :", total }' employes.txt
Résultat :
Total salaires : 28100
Autre exemple — ajouter un en-tête :
awk 'BEGIN { print "Nom", "Salaire" }
{ print $1, $3 }
END { print "--- Fin du rapport ---" }' employes.txt
AWK fournit des variables prédéfinies très utiles :
| Variable | Description |
|---|---|
NF |
Nombre de champs dans la ligne courante |
NR |
Numéro de la ligne courante (Number of Record) |
FNR |
Numéro de ligne dans le fichier courant |
FS |
Séparateur de champs (Field Separator) |
RS |
Séparateur d'enregistrements (Record Separator) |
OFS |
Séparateur de champs en sortie (Output FS) |
ORS |
Séparateur d'enregistrements en sortie |
Exemple — Numéroter les lignes :
awk '{ print NR, $0 }' employes.txt
Résultat :
1 Alice Administrateur 4500 2 Bob Developpeur 6200 3 Claire Technicien 3800 4 David Developpeur 6100 5 Emma Manager 7500
AWK dispose de nombreuses fonctions prédéfinies :
| Fonction | Description |
|---|---|
length() |
Longueur de la chaîne |
substr(s, d, l) |
Extraire une sous-chaîne |
toupper() / tolower() |
Changer la casse |
sprintf() |
Formater une chaîne |
int() |
Partie entière |
rand() / srand() |
Nombres aléatoires |
systime() |
Timestamp Unix |
Exemple — Mettre les noms en majuscules :
awk '{ print toupper($1), $3 }' employes.txt
Résultat :
ALICE 4500 BOB 6200 CLAIRE 3800 DAVID 6100 EMMA 7500
AWK supporte des tableaux associatifs (clés = chaînes) :
awk '{ salaries[$2] += $3 }
END { for (dept in salaries)
print dept, salaries[dept] }' employes.txt
Résultat :
Administrateur 4500 Developpeur 12300 Technicien 3800 Manager 7500
Pour un contrôle précis du formatage, utilise printf :
awk '{ printf "%-10s %-15s %6d\n", $1, $2, $3 }' employes.txt
| Format | Signification |
|---|---|
%-10s |
Chaîne, justifiée à gauche, 10 caractères |
%6d |
Entier, justifié à droite, 6 caractères |
Résultat :
Alice Administrateur 4500 Bob Developpeur 6200 Claire Technicien 3800 David Developpeur 6100 Emma Manager 7500
Quand la logique devient complexe, place-la dans un fichier .awk :
# rapport.awk
BEGIN {
print "=== Rapport des salaires ==="
FS = " "
}
$3 > 5000 {
count++
total += $3
printf "%-10s %6d\n", $1, $3
}
END {
printf "\n%d employés > 5000 | Total : %d\n", count, total
}
Exécute-le avec :
awk -f rapport.awk employes.txt
AWK brille aussi en combinaison avec d'autres commandes :
Nombre de connexions SSH par IP dans les logs :
grep "sshd" /var/log/auth.log | awk '{ print $NF }' | sort | uniq -c | sort -rn | head -10
Afficher la mémoire libre :
free -m | awk 'NR==2{print "Mémoire libre : "$7 " MB"}'
Extraire les colonnes 1 et 5 d'un ls -l (taille et nom) :
ls -l | awk '{ print $5, $9 }' | tail -n +2
Contexte : Tu as un fichier logs.txt avec le format suivant :
2026-04-08 10:15:22 GET /index.html 200 2026-04-08 10:15:45 POST /api/login 401 2026-04-08 10:16:03 GET /index.html 200 2026-04-08 10:16:28 GET /dashboard 302 2026-04-08 10:17:01 GET /api/users 200 2026-04-08 10:17:33 POST /api/login 200 2026-04-08 10:18:05 GET /index.html 200 2026-04-08 10:18:22 GET /dashboard 404 2026-04-08 10:19:11 GET /api/users 200
Objectifs (réalise-les avec AWK) :
Corrigé :
# 1. Lignes avec code 200
awk '$NF == 200 { print $0 }' logs.txt
# 2. Date, heure et URL
awk '{ print $1, $2, $4 }' logs.txt
# 3. Compteur par URL
awk '{ urls[$4]++ } END { for (u in urls) print urls[u], u }' logs.txt
# 4. Total et compteur 200
awk 'BEGIN { total=0; ok=0 }
{ total++; if ($NF == 200) ok++ }
END { print "Total :", total, "| 200 OK :", ok }' logs.txt
| Concept | Description |
|---|---|
$0, $1, $NF |
Champs d'une ligne |
-F |
Séparateur de champs personnalisé |
NR, NF |
Numéros de ligne et nombre de champs |
BEGIN / END |
Actions avant / après le fichier |
printf |
Formatage personnalisé |
-f script.awk |
Exécuter un script AWK depuis un fichier |
| Tableaux associatifs | Agréger, compter, grouper |
À retenir : AWK est l'outil idéal pour tout travail tabulaire ou structuré. La prochaine fois que tu dois extraire une colonne, calculer une somme ou générer un rapport depuis un fichier texte, pense d'abord à AWK — tu gagneras du temps et tu écriras moins de code.
AWK complète parfaitement grep et sed. Si tu as suivi les leçons 9 (recherche) et 15 (redirections/pipes), tu as maintenant un arsenal complet pour manipuler du texte sous Linux.