Aller au contenu
Administration Linux medium

Maîtriser AWK : Traitement de texte puissant

15 min de lecture

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.

  • 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é

awk fait partie des commandes de traitement de texte sous Linux. Chaque outil a sa spécialité :

CommandeSpécialitéQuand l’utiliser
awkTraiter des données en colonnesExtraire, filtrer, calculer sur des champs
sedÉditer des fichiers en fluxRemplacer du texte, supprimer des lignes
grepRechercher par contenuFiltrer les lignes qui matchent un motif
cutExtraire des colonnes simplesDécoupage basique par délimiteur
sort / uniqTrier et dédupliquerClassement, comptage d’occurrences
xargsExécuter en massePasser 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 :

Fenêtre de terminal
# awk + sort : trier les résultats d'awk
awk -F';' '{ print $2, $3 }' ventes.csv | sort -k2 -n
# grep + awk : filtrer puis extraire
grep "ERROR" app.log | awk '{ print $1, $NF }'
# awk + xargs : traitement en masse
awk '/pattern/ { print $1 }' fichier | xargs commande

🧠 Modèle mental — Comment fonctionne awk

awk = Pour chaque ligne → Si condition vraie → Exécuter action

Modèle mental awk : Entrée (fichier/stdin) → Condition (motif /regex/, $2>100) → Action ({print $1}) + Blocs spéciaux BEGIN/END

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

1
Toujours définir -F pour les CSV Par défaut awk sépare sur les espaces. Pour un CSV : awk -F';'...
2
Tester sur quelques lignes d'abord Utilise head -5 fichier | awk '...' pour vérifier ta commande.

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.

Fenêtre de terminal
awk [options] 'programme' fichier(s) # prgramme awk ecrit dans la ligne de commande pour les cas simples
awk [options] -f script.awk fichier(s) # programme awk lu depuis un fichier externe

Structure du programme :

Fenêtre de terminal
awk 'BEGIN { init } condition { action } END { final }' fichier

Options principales :

OptionDescriptionExemple
-F sepDéfinit le séparateur de champsawk -F';' '...' (CSV)
-v var=valDéfinit une variable avant l’exécutionawk -v seuil=100 '$2 > seuil'
-f scriptLit le programme depuis un fichierawk -f analyse.awk data.txt

Formes courantes :

Fenêtre de terminal
# Forme minimale : action sur toutes les lignes
awk '{ print $1 }' fichier
# Avec condition : filtrer les lignes
awk '/pattern/ { print }' fichier
awk '$3 > 100 { print $1, $3 }' fichier
# Avec blocs BEGIN/END : initialisation et finalisation
awk 'BEGIN { FS=";" } { sum += $2 } END { print sum }' fichier
# Depuis un pipe
cat fichier | awk '{ print $NF }'
# Plusieurs fichiers
awk '{ print FILENAME, $0 }' fichier1 fichier2

La commande awk suit toujours la même logique :

PartieQuestionExemplesObligatoire ?
EntréeQuel 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)
ActionQue faire sur ces lignes ?{ print $1 }, { sum += $2 }❌ Non (par défaut : { print })

Entréeawk 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 :

VariableSignificationExemple
$0La ligne entièreprint $0
$1, $2, $NChamp 1, 2, Nprint $1, $3
$NFDernier champprint $NF
NRNuméro de ligne (global)NR > 1 (sauter en-tête)
NFNombre de champsNF >= 3
FSSéparateur d’entréeBEGIN { FS=";" }

Exemple concret :

Fenêtre de terminal
# Fichier : "Alice 25 Paris"
# $1=Alice, $2=25, $3=Paris, NF=3
awk '{ print $1, "a", $2, "ans" }' fichier.txt
# Résultat : Alice a 25 ans

Par défaut, awk sépare sur les espaces et tabulations. Pour un CSV :

Fenêtre de terminal
# Fichier CSV avec séparateur ;
awk -F';' '{ print $1, $3 }' ventes.csv
# Équivalent avec BEGIN
awk '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 conditions permettent de sélectionner les lignes sur lesquelles appliquer l’action :

ConditionCe qu’elle testeExemple
$N == "val"Égalité stricte$1 == "admin"
$N != "val"Différent de$3 != "OK"
$N > valSupé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 2Sauter l’en-tête CSV

Combiner les conditions — ET (&&) / OU (||) / NON (!) :

Fenêtre de terminal
# ET : les deux conditions doivent être vraies
awk '$2 > 100 && $3 == "OK" { print }' fichier.txt
# OU : au moins une condition vraie
awk '$1 == "admin" || $1 == "root" { print }' fichier.txt
# NON : inverser une condition
awk '!($3 ~ /error/) { print }' fichier.txt

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

ActionCe qu’elle faitExemple
{ print }Affiche la ligne (défaut){ print }
{ print $1, $3 }Affiche certains champs{ print $1, $3 }
{ sum += $2 }Accumule dans une variableCalcul de total
{ count[$1]++ }Tableau associatifComptage par clé
{ next }Passe à la ligne suivanteIgnorer cette ligne

awk propose deux blocs qui s’exécutent avant et après le traitement du fichier :

Fenêtre de terminal
awk 'BEGIN { actions_init } condition { actions } END { actions_fin }' fichier
BlocQuand s’exécuteCas d’usage
BEGIN { }Avant de lire le fichierDéfinir FS, afficher un titre
END { }Après avoir lu tout le fichierAfficher un total, une moyenne

Exemple complet — Rapport avec total :

Fenêtre de terminal
awk -F';' '
BEGIN { print "=== Rapport ===" }
NR > 1 { total += $3; print $1, $3 }
END { print "Total:", total }
' ventes.csv

awk excelle pour les statistiques simples sur des fichiers :

Fenêtre de terminal
# Somme d'une colonne
awk '{ sum += $2 } END { print "Total:", sum }' fichier.txt
# Moyenne
awk '{ sum += $2; n++ } END { print "Moyenne:", sum/n }' fichier.txt
# Min et Max
awk 'NR == 1 || $2 > max { max = $2 } END { print "Max:", max }' fichier.txt
# Comptage de lignes selon une condition
awk '$3 == "OK" { count++ } END { print "OK:", count }' fichier.txt

Les tableaux associatifs sont la fonctionnalité la plus puissante de awk pour l’analyse :

Fenêtre de terminal
# Compter les occurrences par valeur
awk '{ count[$1]++ } END { for (k in count) print k, count[k] }' access.log
# Somme par catégorie
awk -F';' '{ ventes[$4] += $2 } END { for (v in ventes) print v, ventes[v] }' data.csv
# Combiner avec un tri externe
awk '{ count[$1]++ } END { for (k in count) print k, count[k] }' log | sort -k2 -rn

print ajoute automatiquement des espaces et un retour à la ligne. printf offre un contrôle précis :

Fenêtre de terminal
# Alignement et format
awk '{ 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
FormatSignificationExemple
%sChaîneprintf "%s", $1
%dEntierprintf "%5d", $2 (5 caractères)
%.2fDécimal 2 chiffresprintf "%.2f", $3
%-10s10 caractères, aligné gaucheprintf "%-10s", $1
\nRetour à la ligneObligatoire avec printf !

⚠️ Piège : printf ne met pas de retour à la ligne automatiquement. Ajoutez \n !

ErreurCauseSolution
$2 est vide ou incorrectMauvais séparateurDéfinir -F';' pour CSV
Le shell interprète $1Doubles guillemetsUtiliser des guillemets simples : awk '...'
L’en-tête est inclus dans les calculsPas de filtreAjouter NR > 1
printf colle tout sur une lignePas de \nAjouter \n à la fin du format
Comparaison string au lieu de nombre”9” > “100” est vrai (string)Forcer avec ($2 + 0) > 100

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
Formule awk '{ print $N }' fichier
Exemple
awk '{ print $2 }' fichier.txt
Paramètres
  • $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
Formule awk -F'<sep>' '{ print $1, $3 }' fichier.csv
Exemple
awk -F';' '{ print $1, $3 }' ventes.csv
Paramètres
  • -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
Formule awk '<condition> { action }' fichier
Exemple
awk '$3 > 100 { print $1, $3 }' fichier.txt
Paramètres
  • $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
Formule awk 'NR > 1 { action }' fichier
Exemple
awk -F';' 'NR > 1 { print $1 }' data.csv
Paramètres
  • 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
Formule awk '{ sum += $N } END { print sum }' fichier
Exemple
awk '{ sum += $2 } END { print sum }' ventes.txt
Paramètres
  • 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
Formule awk '{ sum += $N; n++ } END { print sum/n }' fichier
Exemple
awk 'NR > 1 { sum += $3; n++ } END { print sum/n }' data.csv
Paramètres
  • 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
Formule awk '{ count[$1]++ } END { for (k in count) print k, count[k] }'
Exemple
awk '{ count[$1]++ } END { for (ip in count) print ip, count[ip] }' access.log
Paramètres
  • 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
Formule awk '{ total[$1] += $2 } END { for (k in total) print k, total[k] }'
Exemple
awk -F';' '{ ventes[$4] += $2 } END { for (v in ventes) print v, ventes[v] }' data.csv
Paramètres
  • total[$1] += $2 — Accumule par clé
Filtrer par regex Inter.

Sélectionner les lignes matchant un motif.

awk '/ERROR|WARN/ { print }' app.log
Formule awk '/<pattern>/ { action }' fichier
Exemple
awk '/ERROR|WARN/ { print }' app.log
Paramètres
  • /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
Formule awk '{ printf "%-10s %5d\n", $1, $2 }' fichier
Exemple
awk '{ printf "%-15s %8.2f€\n", $1, $2 }' prix.txt
Paramètres
  • %-10s — 10 caractères, aligné gauche
  • %5d — Entier sur 5 caractères
  • %.2f — Décimal avec 2 chiffres après virgule

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
Le piège : awk "{ print $1 }" fichier — $1 est interprété par le shell
Symptôme : Résultat vide ou inattendu, le shell remplace $1
Cause : Les doubles guillemets laissent le shell interpréter les $
Correction : TOUJOURS utiliser des guillemets simples pour awk
awk '{ print $1 }' fichier
Mauvais séparateur de champs

awk '{ print $2 }' fichier.csv affiche la ligne entière

Attention
Le piège : awk '{ print $2 }' fichier.csv affiche la ligne entière
Symptôme : $2 ne contient pas ce que j'attendais ou est vide
Cause : Le fichier utilise ; ou , mais awk attend des espaces par défaut
Correction : Définir le séparateur avec -F
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
Le piège : awk -F';' '{ sum += $2 } END { print sum }' data.csv — résultat faux
Symptôme : Le total ou la moyenne est incorrect
Cause : La ligne d'en-tête (texte) est ajoutée au calcul (vaut 0)
Correction : Sauter la première ligne avec NR > 1
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
Le piège : awk '{ printf "%s %s", $1, $2 }' — tout sur une seule ligne
Symptôme : La sortie est collée, pas de retours à la ligne
Cause : printf n'ajoute PAS de newline automatiquement (contrairement à print)
Correction : Ajouter \n à la fin du format
awk '{ printf "%s %s\n", $1, $2 }'
Comparaison string vs nombre

awk '$2 > 100' — "9" > "100" est vrai (comparaison string)

Info
Le piège : awk '$2 > 100' — "9" > "100" est vrai (comparaison string)
Symptôme : Résultats de comparaison incohérents
Cause : Si le champ ressemble à un texte, awk compare comme des strings
Correction : Forcer le contexte numérique avec +0 ou comparer explicitement
awk '($2 + 0) > 100' fichier.txt
Condition sans accolades

awk '$3 > 100' fichier — fonctionne mais pas clair

Info
Le piège : awk '$3 > 100' fichier — fonctionne mais pas clair
Symptôme : Ça affiche des lignes mais sans action explicite
Cause : Sans { }, awk fait { print } par défaut — peu lisible
Correction : Toujours écrire { print } explicitement pour la clarté
awk '$3 > 100 { print }' fichier

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

Extraire une colonne Afficher un champ spécifique de chaque ligne.
awk '{ print $2 }' fichier.txt
Traiter un CSV Lire un fichier avec un séparateur personnalisé.
awk -F';' '{ print $1, $3 }' ventes.csv
Filtrer par condition N'afficher que les lignes qui matchent.
awk '$3 > 100 { print $1, $3 }' fichier.txt
Sauter l'en-tête Ignorer la première ligne (headers CSV).
awk -F';' 'NR > 1 { print $1 }' data.csv
Additionner une colonne Calculer le total d'une colonne numérique.
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

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
80% requis

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

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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.