← Sommaire SkyLinux

Leçon 48 : AWK — Manipuler et transformer du texte

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.


1. Qu'est-ce que AWK ?

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

2. Les champs ($1, $2, ... $NF)

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

3. Le séparateur de champs (option -F)

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

4. Les conditions et motifs

Motif sur un champ

Afficher uniquement les développeurs :

awk '$2 == "Developpeur" { print $1, $3 }' employes.txt

Résultat :

Bob 6200
David 6100

Comparaison numérique

Afficher les employés gagnant plus de 5000 :

awk '$3 > 5000 { print $1, $3 }' employes.txt

Résultat :

Bob 6200
David 6100
Emma 7500

Motif texte (expression régulière)

Afficher les lignes commençant par "D" :

awk '$1 ~ /^D/ { print $0 }' employes.txt

Résultat :

David  Developpeur  6100

5. BEGIN et END — Traiter avant et après

Calculer 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

6. Les variables intégrées

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

7. Les fonctions

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

8. Les tableaux associatifs

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

9. Formatage avec printf

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

10. Utiliser un script AWK dans un fichier

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

11. Combiner AWK avec des pipes

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

12. Exercice pratique

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) :

  1. Affiche uniquement les lignes avec un code HTTP 200 (OK)
  2. Affiche la date, l'heure et l'URL de chaque requête
  3. Compte combien de fois chaque URL apparaît
  4. Affiche le nombre total de requêtes et combien ont retourné 200

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

Résumé

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.