Quand vous travaillez avec des fichiers de logs, des exports CSV ou des données tabulaires, vous avez souvent besoin d’extraire des colonnes, de filtrer des lignes ou de calculer des statistiques. awk est un mini-langage de traitement de texte qui lit un fichier ligne par ligne, découpe chaque ligne en champs ($1, $2…), et permet d’appliquer des conditions et des actions sur ces champs.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Extraire des colonnes spécifiques d’un fichier
- Filtrer des lignes selon des conditions (valeur, regex)
- Effectuer des calculs (somme, moyenne, comptage)
- Utiliser les blocs BEGIN et END pour structurer vos traitements
- Manipuler des fichiers CSV avec un séparateur personnalisé
La commande awk dans l’écosystème Linux
Section intitulée « La commande awk dans l’écosystème Linux »awk fait partie des commandes de traitement de texte sous Linux. Chaque outil a sa spécialité :
| Commande | Spécialité | Quand l’utiliser |
|---|---|---|
awk | Traiter des données en colonnes | Extraire, filtrer, calculer sur des champs |
sed | Éditer des fichiers en flux | Remplacer du texte, supprimer des lignes |
grep | Rechercher par contenu | Filtrer les lignes qui matchent un motif |
cut | Extraire des colonnes simples | Découpage basique par délimiteur |
sort / uniq | Trier et dédupliquer | Classement, comptage d’occurrences |
xargs | Exécuter en masse | Passer des lignes à une commande |
Combinaisons de commandes fréquentes :
La commande awk est souvent utilisée en combinaison avec d’autres outils pour
des traitements plus complexes :
# awk + sort : trier les résultats d'awkawk -F';' '{ print $2, $3 }' ventes.csv | sort -k2 -n
# grep + awk : filtrer puis extrairegrep "ERROR" app.log | awk '{ print $1, $NF }'
# awk + xargs : traitement en masseawk '/pattern/ { print $1 }' fichier | xargs commandeComprendre la commande awk en 2 min
Section intitulée « Comprendre la commande awk en 2 min »🧠 Modèle mental — Comment fonctionne awk
awk = Pour chaque ligne → Si condition vraie → Exécuter action
Points clés
- awk lit le fichier ligne par ligne automatiquement
- Chaque ligne est découpée en champs : $1, $2, $3... ($0 = ligne entière)
- Par défaut, le séparateur est l'espace ou la tabulation
- Sans condition, l'action s'applique à TOUTES les lignes
- BEGIN s'exécute AVANT de lire le fichier (init)
- END s'exécute APRÈS avoir lu tout le fichier (bilan, totaux)
Règles d'or
Vocabulaire essentiel
- $0
- La ligne entière
- $1, $2, $N
- Champ 1, 2, N de la ligne
- $NF
- Dernier champ de la ligne
- NR
- Numéro de la ligne courante
- NF
- Nombre de champs dans la ligne
- FS
- Field Separator (séparateur de champs)
📚 Pour aller plus loin — 12 options avancées
- OFS
- Output Field Separator (séparateur de sortie)
- RS
- Record Separator (séparateur d'enregistrements)
- ORS
- Output Record Separator
- FILENAME
- Nom du fichier en cours de traitement
- FNR
- Numéro de ligne dans le fichier courant
- gsub()
- Remplacer toutes les occurrences
- sub()
- Remplacer la première occurrence
- split()
- Découper une chaîne en tableau
- length()
- Longueur d'une chaîne
- substr()
- Extraire une sous-chaîne
- printf
- Affichage formaté (comme en C)
- arrays[]
- Tableaux associatifs (clé/valeur)
Contrairement à grep (qui filtre des lignes) ou sed (qui modifie en flux), awk est un vrai langage qui permet de traiter chaque ligne comme un enregistrement avec des champs numérotés.
Syntaxe complète
Section intitulée « Syntaxe complète »awk [options] 'programme' fichier(s) # prgramme awk ecrit dans la ligne de commande pour les cas simplesawk [options] -f script.awk fichier(s) # programme awk lu depuis un fichier externeStructure du programme :
awk 'BEGIN { init } condition { action } END { final }' fichierOptions principales :
| Option | Description | Exemple |
|---|---|---|
-F sep | Définit le séparateur de champs | awk -F';' '...' (CSV) |
-v var=val | Définit une variable avant l’exécution | awk -v seuil=100 '$2 > seuil' |
-f script | Lit le programme depuis un fichier | awk -f analyse.awk data.txt |
Formes courantes :
# Forme minimale : action sur toutes les lignesawk '{ print $1 }' fichier
# Avec condition : filtrer les lignesawk '/pattern/ { print }' fichierawk '$3 > 100 { print $1, $3 }' fichier
# Avec blocs BEGIN/END : initialisation et finalisationawk 'BEGIN { FS=";" } { sum += $2 } END { print sum }' fichier
# Depuis un pipecat fichier | awk '{ print $NF }'
# Plusieurs fichiersawk '{ print FILENAME, $0 }' fichier1 fichier2Les 3 parties d’un programme awk
Section intitulée « Les 3 parties d’un programme awk »La commande awk suit toujours la même logique :
| Partie | Question | Exemples | Obligatoire ? |
|---|---|---|---|
| Entrée | Quel fichier ou flux traiter ? | fichier.txt, stdin | ⚠️ Fichier ou pipe |
| Condition (motif) | Quelles lignes traiter ? | /ERROR/, $3 > 100, NR > 1 | ❌ Non (par défaut : toutes) |
| Action | Que faire sur ces lignes ? | { print $1 }, { sum += $2 } | ❌ Non (par défaut : { print }) |
Entrée — awk lit le fichier ou le flux ligne par ligne. Chaque ligne est automatiquement découpée en champs selon le séparateur (espace par défaut).
Condition (optionnelle) — Si vous ne mettez pas de condition, l’action s’applique à toutes les lignes. Sinon, seules les lignes qui matchent sont traitées.
Action (optionnelle) — Entre accolades { }. Sans action explicite, awk fait { print } (affiche la ligne).
Les variables intégrées : comprendre le découpage
Section intitulée « Les variables intégrées : comprendre le découpage »awk découpe automatiquement chaque ligne en champs numérotés :
| Variable | Signification | Exemple |
|---|---|---|
$0 | La ligne entière | print $0 |
$1, $2, $N | Champ 1, 2, N | print $1, $3 |
$NF | Dernier champ | print $NF |
NR | Numéro de ligne (global) | NR > 1 (sauter en-tête) |
NF | Nombre de champs | NF >= 3 |
FS | Séparateur d’entrée | BEGIN { FS=";" } |
Exemple concret :
# Fichier : "Alice 25 Paris"# $1=Alice, $2=25, $3=Paris, NF=3awk '{ print $1, "a", $2, "ans" }' fichier.txt# Résultat : Alice a 25 ansDéfinir le séparateur de champs
Section intitulée « Définir le séparateur de champs »Par défaut, awk sépare sur les espaces et tabulations. Pour un CSV :
# Fichier CSV avec séparateur ;awk -F';' '{ print $1, $3 }' ventes.csv
# Équivalent avec BEGINawk 'BEGIN { FS=";" } { print $1, $3 }' ventes.csv⚠️ Piège courant : si $2 est vide ou incorrect, vérifiez que vous avez bien défini -F !
Les filtres : cibler les lignes à traiter
Section intitulée « Les filtres : cibler les lignes à traiter »Les conditions permettent de sélectionner les lignes sur lesquelles appliquer l’action :
| Condition | Ce qu’elle teste | Exemple |
|---|---|---|
$N == "val" | Égalité stricte | $1 == "admin" |
$N != "val" | Différent de | $3 != "OK" |
$N > val | Supérieur (numérique) | $2 > 100 |
$N ~ /regex/ | Matche la regex | $1 ~ /^192/ |
$N !~ /regex/ | Ne matche pas | $4 !~ /error/ |
/pattern/ | Pattern sur toute la ligne | /ERROR/ |
NR > 1 | À partir de la ligne 2 | Sauter l’en-tête CSV |
Combiner les conditions — ET (&&) / OU (||) / NON (!) :
# ET : les deux conditions doivent être vraiesawk '$2 > 100 && $3 == "OK" { print }' fichier.txt
# OU : au moins une condition vraieawk '$1 == "admin" || $1 == "root" { print }' fichier.txt
# NON : inverser une conditionawk '!($3 ~ /error/) { print }' fichier.txtLes actions : que faire des lignes sélectionnées ?
Section intitulée « Les actions : que faire des lignes sélectionnées ? »Une fois les lignes filtrées, vous pouvez agir dessus :
| Action | Ce qu’elle fait | Exemple |
|---|---|---|
{ print } | Affiche la ligne (défaut) | { print } |
{ print $1, $3 } | Affiche certains champs | { print $1, $3 } |
{ sum += $2 } | Accumule dans une variable | Calcul de total |
{ count[$1]++ } | Tableau associatif | Comptage par clé |
{ next } | Passe à la ligne suivante | Ignorer cette ligne |
Les blocs spéciaux : BEGIN et END
Section intitulée « Les blocs spéciaux : BEGIN et END »awk propose deux blocs qui s’exécutent avant et après le traitement du fichier :
awk 'BEGIN { actions_init } condition { actions } END { actions_fin }' fichier| Bloc | Quand s’exécute | Cas d’usage |
|---|---|---|
BEGIN { } | Avant de lire le fichier | Définir FS, afficher un titre |
END { } | Après avoir lu tout le fichier | Afficher un total, une moyenne |
Exemple complet — Rapport avec total :
awk -F';' ' BEGIN { print "=== Rapport ===" } NR > 1 { total += $3; print $1, $3 } END { print "Total:", total }' ventes.csvEffectuer des calculs
Section intitulée « Effectuer des calculs »awk excelle pour les statistiques simples sur des fichiers :
# Somme d'une colonneawk '{ sum += $2 } END { print "Total:", sum }' fichier.txt
# Moyenneawk '{ sum += $2; n++ } END { print "Moyenne:", sum/n }' fichier.txt
# Min et Maxawk 'NR == 1 || $2 > max { max = $2 } END { print "Max:", max }' fichier.txt
# Comptage de lignes selon une conditionawk '$3 == "OK" { count++ } END { print "OK:", count }' fichier.txtTableaux associatifs : regrouper et compter
Section intitulée « Tableaux associatifs : regrouper et compter »Les tableaux associatifs sont la fonctionnalité la plus puissante de awk pour l’analyse :
# Compter les occurrences par valeurawk '{ count[$1]++ } END { for (k in count) print k, count[k] }' access.log
# Somme par catégorieawk -F';' '{ ventes[$4] += $2 } END { for (v in ventes) print v, ventes[v] }' data.csv
# Combiner avec un tri externeawk '{ count[$1]++ } END { for (k in count) print k, count[k] }' log | sort -k2 -rnFormater la sortie avec printf
Section intitulée « Formater la sortie avec printf »print ajoute automatiquement des espaces et un retour à la ligne. printf offre un contrôle précis :
# Alignement et formatawk '{ printf "%-15s %8.2f€\n", $1, $2 }' prix.txt
# Tableau formatéawk 'BEGIN { printf "%-10s %s\n", "Nom", "Valeur" } { printf "%-10s %d\n", $1, $2 }' fichier.txt| Format | Signification | Exemple |
|---|---|---|
%s | Chaîne | printf "%s", $1 |
%d | Entier | printf "%5d", $2 (5 caractères) |
%.2f | Décimal 2 chiffres | printf "%.2f", $3 |
%-10s | 10 caractères, aligné gauche | printf "%-10s", $1 |
\n | Retour à la ligne | Obligatoire avec printf ! |
⚠️ Piège : printf ne met pas de retour à la ligne automatiquement. Ajoutez \n !
Erreurs typiques (et solutions)
Section intitulée « Erreurs typiques (et solutions) »| Erreur | Cause | Solution |
|---|---|---|
$2 est vide ou incorrect | Mauvais séparateur | Définir -F';' pour CSV |
Le shell interprète $1 | Doubles guillemets | Utiliser des guillemets simples : awk '...' |
| L’en-tête est inclus dans les calculs | Pas de filtre | Ajouter NR > 1 |
printf colle tout sur une ligne | Pas de \n | Ajouter \n à la fin du format |
| Comparaison string au lieu de nombre | ”9” > “100” est vrai (string) | Forcer avec ($2 + 0) > 100 |
Les Modèles de traitement courants
Section intitulée « Les Modèles de traitement courants »Maintenant que vous comprenez awk, voici des patterns prêts à l’emploi pour des traitements fréquents.
Ces recettes couvrent les cas d'usage les plus fréquents. Cliquez sur un pattern pour voir la formule complète et un exemple prêt à copier.
Extraire une colonne Base Afficher un champ spécifique de chaque ligne.
awk '{ print $2 }' fichier.txt
awk '{ print $N }' fichier awk '{ print $2 }' fichier.txt -
$N— Numéro du champ (1, 2, 3...) -
$0— Ligne entière -
$NF— Dernier champ
Traiter un CSV Base Lire un fichier avec un séparateur personnalisé.
awk -F';' '{ print $1, $3 }' ventes.csv
awk -F'<sep>' '{ print $1, $3 }' fichier.csv awk -F';' '{ print $1, $3 }' ventes.csv -
-F— Définit le séparateur de champs -
;— Séparateur CSV (ou , ou \t)
Filtrer par condition Base N'afficher que les lignes qui matchent.
awk '$3 > 100 { print $1, $3 }' fichier.txt
awk '<condition> { action }' fichier awk '$3 > 100 { print $1, $3 }' fichier.txt -
$N == "val"— Égalité stricte -
$N > val— Comparaison numérique -
$N ~ /regex/— Match une regex
Sauter l'en-tête Base Ignorer la première ligne (headers CSV).
awk -F';' 'NR > 1 { print $1 }' data.csv
awk 'NR > 1 { action }' fichier awk -F';' 'NR > 1 { print $1 }' data.csv -
NR— Numéro de ligne (1, 2, 3...) -
NR > 1— À partir de la ligne 2
Additionner une colonne Base Calculer le total d'une colonne numérique.
awk '{ sum += $2 } END { print sum }' ventes.txt
awk '{ sum += $N } END { print sum }' fichier awk '{ sum += $2 } END { print sum }' ventes.txt -
sum += $N— Accumule dans la variable -
END— S'exécute après le fichier
Calculer une moyenne Inter. Moyenne d'une colonne ou d'une ligne.
awk 'NR > 1 { sum += $3; n++ } END { print sum/n }' data.csv
awk '{ sum += $N; n++ } END { print sum/n }' fichier awk 'NR > 1 { sum += $3; n++ } END { print sum/n }' data.csv -
n++— Compte le nombre de lignes -
sum/n— Moyenne = total / nombre
Compter par groupe Inter. Regrouper et compter les occurrences.
awk '{ count[$1]++ } END { for (ip in count) print ip, count[ip] }' access.log
awk '{ count[$1]++ } END { for (k in count) print k, count[k] }' awk '{ count[$1]++ } END { for (ip in count) print ip, count[ip] }' access.log -
count[$1]++— Tableau associatif indexé par $1 -
for (k in arr)— Parcourt les clés du tableau
Somme par groupe Inter. Additionner par catégorie.
awk -F';' '{ ventes[$4] += $2 } END { for (v in ventes) print v, ventes[v] }' data.csv
awk '{ total[$1] += $2 } END { for (k in total) print k, total[k] }' awk -F';' '{ ventes[$4] += $2 } END { for (v in ventes) print v, ventes[v] }' data.csv -
total[$1] += $2— Accumule par clé
Filtrer par regex Inter. Sélectionner les lignes matchant un motif.
awk '/ERROR|WARN/ { print }' app.log
awk '/<pattern>/ { action }' fichier awk '/ERROR|WARN/ { print }' app.log -
/regex/— Pattern sur toute la ligne -
$N ~ /regex/— Pattern sur un champ -
!~— Ne matche PAS
Formater la sortie Inter. Afficher avec alignement et format précis.
awk '{ printf "%-15s %8.2f€\n", $1, $2 }' prix.txt
awk '{ printf "%-10s %5d\n", $1, $2 }' fichier awk '{ printf "%-15s %8.2f€\n", $1, $2 }' prix.txt -
%-10s— 10 caractères, aligné gauche -
%5d— Entier sur 5 caractères -
%.2f— Décimal avec 2 chiffres après virgule
Aucune recette ne correspond à votre recherche.
Les Pièges à éviter
Section intitulée « Les Pièges à éviter »Ces erreurs courantes peuvent faire perdre du temps ou causer des dégâts. Les pièges les plus critiques sont affichés en premier.
Confusion guillemets simples/doubles awk "{ print $1 }" fichier — $1 est interprété par le shell
Danger
awk "{ print $1 }" fichier — $1 est interprété par le shell
awk '{ print $1 }' fichier Mauvais séparateur de champs awk '{ print $2 }' fichier.csv affiche la ligne entière
Attention
awk '{ print $2 }' fichier.csv affiche la ligne entière
awk -F';' '{ print $2 }' fichier.csv En-tête inclus dans les calculs awk -F';' '{ sum += $2 } END { print sum }' data.csv — résultat faux
Attention
awk -F';' '{ sum += $2 } END { print sum }' data.csv — résultat faux
awk -F';' 'NR > 1 { sum += $2 } END { print sum }' data.csv printf sans retour à la ligne awk '{ printf "%s %s", $1, $2 }' — tout sur une seule ligne
Attention
awk '{ printf "%s %s", $1, $2 }' — tout sur une seule ligne
awk '{ printf "%s %s\n", $1, $2 }' Comparaison string vs nombre awk '$2 > 100' — "9" > "100" est vrai (comparaison string)
Info
awk '$2 > 100' — "9" > "100" est vrai (comparaison string)
awk '($2 + 0) > 100' fichier.txt Condition sans accolades awk '$3 > 100' fichier — fonctionne mais pas clair
Info
awk '$3 > 100' fichier — fonctionne mais pas clair
awk '$3 > 100 { print }' fichier Cheatsheet
Section intitulée « Cheatsheet » 📋
Cheatsheet awk
📝 Syntaxe :
awk [options] '{ programme }' fichier(s) Format général de la commande awk [options] -f script.awk fichier(s) Programme depuis un fichier externe awk 'BEGIN { init } condition { action } END { final }' fichier Structure complète avec blocs spéciaux 🚀 Commandes types :
awk '{ print $2 }' fichier.txt awk -F';' '{ print $1, $3 }' ventes.csv awk '$3 > 100 { print $1, $3 }' fichier.txt awk -F';' 'NR > 1 { print $1 }' data.csv awk '{ sum += $2 } END { print sum }' ventes.txt ⚙️ Options
-F sep | Définit le séparateur de champs | awk -F';' '...' data.csv |
-v var=val | Définit une variable avant exécution | awk -v seuil=100 '$2 > seuil' |
-f script.awk | Lit le programme depuis un fichier | awk -f analyse.awk data.txt |
🔍 Filtres
$0 | Ligne entière | print $0 |
$1, $2, $N | Champ 1, 2, N | print $1, $3 |
$NF | Dernier champ | print $NF |
NR | Numéro de ligne (global) | NR > 1 |
NF | Nombre de champs | NF >= 3 |
FS | Séparateur d'entrée | BEGIN { FS=";" } |
OFS | Séparateur de sortie | BEGIN { OFS="," } |
🎯 Conditions
$N == "val" | Égalité stricte | $1 == "admin" |
$N ~ /regex/ | Match regex | $1 ~ /^[A-Z]/ |
$N !~ /regex/ | Ne matche pas | $2 !~ /error/ |
/pattern/ | Match sur ligne entière | /ERROR/ |
&& || | ET, OU logiques | $2 > 0 && $3 < 100 |
⚡ Actions
BEGIN { } | Avant le fichier | BEGIN { print "Titre" } |
END { } | Après le fichier | END { print total } |
length() | Longueur de chaîne | length($1) |
substr(s,i,n) | Sous-chaîne | substr($1,1,3) |
gsub(r,s) | Remplacer tout | gsub(/old/,"new") |
split(s,a,fs) | Découper en tableau | split($1,parts,"-") |
tolower() toupper() | Casse | tolower($1) |
print | Affiche (avec \n) | print $1, $2 |
printf | Affichage formaté | printf "%-10s", $1 |
%s | Chaîne | printf "%s", $1 |
%d | Entier | printf "%5d", $2 |
%.2f | Décimal 2 chiffres | printf "%.2f", $3 |
arr[$1]++ | Compteur par clé | count[$1]++ |
for (k in arr) | Parcourir clés | for (ip in count) |
delete arr[k] | Supprimer une clé | delete data["tmp"] |
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
Conclusion
Section intitulée « Conclusion »La commande awk est un outil fondamental pour quiconque travaille avec des données textuelles. Grâce à son découpage automatique en champs, ses conditions flexibles et ses capacités de calcul, elle permet de traiter, analyser et transformer des fichiers structurés en quelques lignes. Que ce soit pour parser des logs, traiter des CSV ou générer des rapports, la maîtrise de awk vous fera gagner un temps considérable.