Aller au contenu
Administration Linux medium

Manipuler des fichiers texte avec awk

23 min de lecture

Au-delà de sed, qui permet de modifier directement le contenu ligne par ligne, il est parfois nécessaire d’extraire des colonnes précises, de transformer des champs, ou de réaliser des calculs à partir de fichiers plats comme des logs, des CSV ou des exports structurés. C’est là que la commande awk devient incontournable. Pensé comme un mini-langage de traitement de texte, awk permet de manipuler chaque ligne comme un enregistrement et chaque mot comme un champ. Grâce à sa puissance et sa simplicité, il devient un outil indispensable pour analyser, transformer et automatiser le traitement de données textuelles en ligne de commande.

La commande awk est un outil de traitement de texte conçu pour lire des fichiers ligne par ligne, découper chaque ligne en champs (colonnes), et appliquer des actions conditionnelles sur ces champs. Son nom vient des initiales de ses créateurs : Aho, Weinberger et Kernighan.

Contrairement à grep (filtrage) ou sed (modification ligne à ligne), awk agit comme un mini-langage de programmation. Il permet :

  • d’extraire des champs spécifiques,
  • de filtrer des lignes selon des règles complexes,
  • de réaliser des calculs (sommes, moyennes, comptages),
  • de reformater ou restructurer des fichiers texte.

Un exemple simple pour afficher les colonnes 1 et 3 d’un fichier séparé par des espaces :

Fenêtre de terminal
awk '{ print $1, $3 }' fichier.txt

Ou, avec un fichier CSV (séparateur ;) :

Fenêtre de terminal
awk -F';' '{ print $2 }' fichier.csv

Et pour calculer la somme d’une colonne :

Fenêtre de terminal
awk '{ total += $3 } END { print total }' fichier.txt

Avec awk, chaque ligne devient un enregistrement à traiter, chaque mot un champ manipulable et chaque fichier une source de données structurées à analyser ou transformer en temps réel.

La syntaxe de awk repose sur le principe suivant : pour chaque ligne du fichier, si un motif est vrai, alors on exécute une action. Cette syntaxe, très naturelle, permet d’écrire des commandes puissantes en quelques caractères seulement.

Fenêtre de terminal
awk 'motif { action }' fichier
  • motif : condition pour exécuter l’action (optionnelle)
  • action : opération à réaliser sur la ligne (affichage, calcul, etc.)

Si aucun motif n’est précisé, l’action est appliquée à chaque ligne.

awk propose plusieurs variables intégrées très utiles :

  • $0 : la ligne entière
  • $1, $2, … : les champs de la ligne (colonne 1, 2, etc.)
  • NF : nombre de champs dans la ligne
  • NR : numéro de la ligne en cours
  • FS : séparateur de champs (par défaut, espace ou tabulation)

Afficher toutes les lignes d’un fichier :

Fenêtre de terminal
awk '{ print }' fichier.txt

Afficher la 2ᵉ colonne uniquement :

Fenêtre de terminal
awk '{ print $2 }' fichier.txt

Afficher la dernière colonne :

Fenêtre de terminal
awk '{ print $NF }' fichier.txt

Changer le séparateur de champs (ex : fichier CSV) :

Fenêtre de terminal
awk -F';' '{ print $1, $3 }' fichier.csv

Afficher le numéro de ligne suivi du contenu :

Fenêtre de terminal
awk '{ print NR, $0 }' fichier.txt

Grâce à cette syntaxe, awk devient rapidement un outil de transformation, de lecture et d’analyse de données, tout en restant compact et intuitif.

L’un des usages les plus courants de awk est d’extraire des colonnes spécifiques d’un fichier texte et de filtrer les lignes selon des critères simples ou complexes. Cela permet de parcourir rapidement un fichier structuré et d’en isoler les informations utiles.

Afficher la première colonne :

Fenêtre de terminal
awk '{ print $1 }' fichier.txt

Afficher les colonnes 1 et 3 :

Fenêtre de terminal
awk '{ print $1, $3 }' fichier.txt

Afficher la dernière colonne :

Fenêtre de terminal
awk '{ print $NF }' fichier.txt

Afficher les lignes dont la 3e colonne vaut exactement “OK” :

Fenêtre de terminal
awk '$3 == "OK"' fichier.txt

Afficher celles dont la 2e colonne est supérieure à 100 :

Fenêtre de terminal
awk '$2 > 100' fichier.txt

Afficher les lignes où la colonne 2 est > 100 et la colonne 4 contient “valide” :

Fenêtre de terminal
awk '$2 > 100 && $4 == "valide"' fichier.txt

Afficher les lignes où la colonne 1 est “admin” ou “root” :

Fenêtre de terminal
awk '$1 == "admin" || $1 == "root"' fichier.txt

Afficher les lignes dont la colonne 1 commence par “user” :

Fenêtre de terminal
awk '$1 ~ /^user/' fichier.txt

Afficher celles où la colonne 3 ne contient pas “erreur” :

Fenêtre de terminal
awk '$3 !~ /erreur/' fichier.txt

Afficher de la ligne contenant “START” à celle contenant “END” :

Fenêtre de terminal
awk '/START/,/END/' fichier.txt

Grâce à ces fonctionnalités, awk permet de naviguer, trier, extraire ou surveiller des données textuelles structurées avec une très grande souplesse.

awk est particulièrement efficace pour effectuer des opérations mathématiques sur les données textuelles : sommes, moyennes, minima, maxima, et même des calculs conditionnels. Ces fonctionnalités permettent d’analyser rapidement le contenu d’un fichier numérique.

Additionner toutes les valeurs de la colonne 2 :

Fenêtre de terminal
awk '{ total += $2 } END { print total }' fichier.txt

Calculer la moyenne des valeurs numériques d’une colonne :

Fenêtre de terminal
awk '{ total += $3; n++ } END { print total / n }' fichier.txt

Trouver la valeur maximale de la colonne 4 :

Fenêtre de terminal
awk 'NR == 1 || $4 > max { max = $4 } END { print max }' fichier.txt

Trouver la valeur minimale :

Fenêtre de terminal
awk 'NR == 1 || $4 < min { min = $4 } END { print min }' fichier.txt

Compter les lignes dont la colonne 3 vaut “OK” :

Fenêtre de terminal
awk '$3 == "OK" { count++ } END { print count }' fichier.txt

Moyenne des lignes où le champ 2 est supérieur à 50 :

Fenêtre de terminal
awk '$2 > 50 { total += $2; n++ } END { if (n > 0) print total / n }' fichier.txt

Calculer la différence entre deux colonnes et afficher la ligne :

Fenêtre de terminal
awk '{ diff = $3 - $2; print $1, diff }' fichier.txt

Avec ces opérations, awk devient un véritable moteur d’analyse statistique en ligne de commande, idéal pour examiner des rapports, des mesures systèmes ou des exports CSV chiffrés.

awk permet de personnaliser l’affichage des résultats avec une grande finesse grâce à la commande printf, qui offre un meilleur contrôle que print sur l’alignement, le format numérique ou la structure des données affichées.

  • print ajoute automatiquement un espace entre les champs et un retour à la ligne
  • printf permet de formater précisément la sortie, mais ne gère ni espaces ni retours à la ligne automatiquement
Fenêtre de terminal
awk '{ printf "%s : %s\n", $1, $2 }' fichier.txt
  • %s : chaîne de caractères
  • %d : entier
  • %f : nombre à virgule flottante
  • \n : retour à la ligne

Aligner à gauche (%-) ou à droite (%) avec une largeur fixe :

Fenêtre de terminal
awk '{ printf "%-10s | %5d\n", $1, $2 }' fichier.txt

Affiche la première colonne sur 10 caractères à gauche et la seconde sur 5 caractères à droite.

Limiter à 2 décimales :

Fenêtre de terminal
awk '{ printf "%.2f\n", $2 }' fichier.txt

Afficher une entête et un tableau structuré :

Fenêtre de terminal
awk 'BEGIN { printf "%-10s | %s\n", "Nom", "Valeur"; print "--------------------" }
{ printf "%-10s | %s\n", $1, $2 }' fichier.txt

Avec BEGIN, on peut afficher des lignes avant le traitement du fichier.

En combinant printf et les variables d’awk, on peut produire des rapports lisibles, alignés, prêts à être copiés ou intégrés dans un fichier HTML, CSV ou Markdown, ce qui rend l’outil encore plus précieux pour l’analyse.

Comme grep ou sed, awk prend en charge les expressions régulières pour filtrer ou analyser les lignes de manière avancée. On les utilise généralement avec les opérateurs ~ (correspondance) ou !~ (non-correspondance).

Afficher les lignes dont la première colonne commence par “admin” :

Fenêtre de terminal
awk '$1 ~ /^admin/' fichier.txt

Afficher les lignes dont la troisième colonne contient “OK” :

Fenêtre de terminal
awk '$3 ~ /OK/' fichier.txt

Afficher les lignes qui ne contiennent pas “erreur” dans la colonne 4 :

Fenêtre de terminal
awk '$4 !~ /erreur/' fichier.txt

Afficher les lignes dont la colonne 2 contient un chiffre :

Fenêtre de terminal
awk '$2 ~ /[0-9]/' fichier.txt

Afficher les lignes où la première colonne est une adresse IP :

Fenêtre de terminal
awk '$1 ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' fichier.txt

Afficher les lignes dont la colonne 2 contient “start” et la colonne 3 “ok” :

Fenêtre de terminal
awk '$2 ~ /start/ && $3 ~ /ok/' fichier.txt

On peut aussi préparer un motif à l’avance :

Fenêtre de terminal
awk 'BEGIN { motif="^[A-Z]+" } $1 ~ motif' fichier.txt

Grâce à ces expressions régulières, awk peut filtrer des motifs complexes, gérer des formats variables et se montrer extrêmement puissant pour analyser des fichiers non structurés ou semi-structurés.

awk est un vrai mini-langage de programmation, ce qui signifie qu’on peut déclarer ses propres variables et fonctions pour rendre les traitements plus lisibles, réutilisables ou structurés. Cela permet de transformer des expressions complexes en blocs simples et maintenables.

Les variables peuvent être utilisées et modifiées librement :

Fenêtre de terminal
awk '{ total += $2 } END { print "Total :", total }' fichier.txt

On peut aussi déclarer des variables dans un bloc BEGIN :

Fenêtre de terminal
awk 'BEGIN { taux = 0.2 } { print $1, $2 * taux }' fichier.txt

Une fonction awk est définie avec la syntaxe :

Fenêtre de terminal
function nom_fonction(arg1, arg2) {
return arg1 + arg2
}

Exemple : fonction de calcul de TVA

Fenêtre de terminal
awk '
function tva(prix, taux) {
return prix * taux
}
{ print $1, tva($2, 0.2) }
' fichier.txt

On peut appeler des fonctions dans le traitement final :

Fenêtre de terminal
awk '
function moyenne(total, n) {
return n > 0 ? total / n : 0
}
{ somme += $2; n++ }
END { print "Moyenne :", moyenne(somme, n) }
' fichier.txt

Les variables déclarées en dehors d’une fonction sont globales. Celles passées dans une fonction sont locales, sauf si on les modifie directement dans le corps du programme.

Les fonctions personnalisées rendent awk encore plus puissant pour les traitements complexes, notamment dans les scripts longue durée, les fichiers multi-colonnes, ou les opérations conditionnelles répétitives.

L’un des atouts les plus puissants de awk est sa prise en charge des tableaux associatifs (aussi appelés “dictionnaires”). Contrairement aux tableaux classiques, ils utilisent des chaînes de caractères comme clés, ce qui les rend parfaits pour regrouper ou compter des données par catégorie.

Par exemple, pour compter le nombre de lignes par utilisateur (colonne 1) :

Fenêtre de terminal
awk '{ utilisateurs[$1]++ } END { for (u in utilisateurs) print u, utilisateurs[u] }' fichier.txt

Additionner la colonne 3 pour chaque valeur unique de la colonne 2 :

Fenêtre de terminal
awk '{ total[$2] += $3 } END { for (groupe in total) print groupe, total[groupe] }' fichier.txt
Fenêtre de terminal
awk '{ nb[$1]++ } END { for (nom in nb) print nom, nb[nom] }' fichier.txt | sort -k2 -n

On peut combiner plusieurs colonnes comme clé :

Fenêtre de terminal
awk '{ cle = $1 "-" $2; stats[cle]++ } END { for (c in stats) print c, stats[c] }' fichier.txt

Tester si une clé existe :

Fenêtre de terminal
awk '{ if (!($1 in comptage)) comptage[$1] = 0; comptage[$1]++ } END { for (k in comptage) print k, comptage[k] }' fichier.txt

Les tableaux associatifs transforment awk en moteur de regroupement et d’agrégation, très utile pour analyser des logs, faire des statistiques simples ou générer des résumés dynamiques à partir de données brutes.

Lorsque les traitements deviennent complexes, il est plus lisible et plus pratique d’écrire un script awk complet dans un fichier dédié. Cela permet de structurer son code avec des blocs BEGIN, END, des fonctions et de faciliter la réutilisation dans d’autres contextes.

Un script awk peut comporter trois blocs principaux :

BEGIN {
# Initialisation
FS = ";"
print "Nom | Total"
}
{
total[$1] += $2
}
END {
for (nom in total)
printf "%-10s | %d\n", nom, total[nom]
}

Ce script :

  • définit le séparateur de champs (FS)
  • agrège les valeurs numériques par utilisateur
  • affiche un rapport final formaté

Enregistrez le code dans un fichier nommé par exemple rapport.awk.

Fenêtre de terminal
awk -f rapport.awk fichier.csv

Débuter le fichier par :

#!/usr/bin/awk -f

Puis rendre le fichier exécutable :

Fenêtre de terminal
chmod +x rapport.awk
./rapport.awk fichier.csv
  • Lisibilité et maintenabilité du code
  • Facilité de test et de versioning (Git, etc.)
  • Réutilisation dans des pipelines automatisés

Les scripts awk sont idéaux pour les tâches d’analyse régulières, les rapports dynamiques, ou les traitements batch sur de gros volumes de données structurées.

awk est particulièrement adapté à la manipulation de fichiers structurés comme les fichiers CSV, TSV ou les fichiers plats issus de bases de données ou d’exports automatisés. Il permet d’extraire, transformer ou reformater les champs facilement.

Par défaut, awk considère que les champs sont séparés par des espaces ou des tabulations. Pour un fichier CSV avec ; :

Fenêtre de terminal
awk -F';' '{ print $1, $3 }' fichier.csv

Pour un fichier TSV (tabulations), utilisez :

Fenêtre de terminal
awk -F'\t' '{ print $2 }' fichier.tsv

Par exemple, supprimer les guillemets dans la colonne 3 :

Fenêtre de terminal
awk -F';' '{ gsub(/"/, "", $3); print $3 }' fichier.csv

Supprimer la 2e colonne et réafficher les autres :

Fenêtre de terminal
awk '{ $2=""; print }' fichier.txt

À noter : cela conserve l’espace entre les colonnes

Fenêtre de terminal
awk -F';' 'BEGIN { OFS="\t" } { print $1, $2, $3 }' fichier.csv

Afficher la colonne 3, puis la 1, puis la 2 :

Fenêtre de terminal
awk -F';' '{ print $3, $1, $2 }' fichier.csv

Par exemple, ajouter un total en additionnant les colonnes 2 et 3 :

Fenêtre de terminal
awk -F';' 'BEGIN { OFS=";" } { print $0, $2 + $3 }' fichier.csv

awk offre une solution rapide et portable pour préparer des données, nettoyer des exports, ou automatiser la transformation de fichiers structurés sans passer par un tableur ou un script Python complet.

Pour tirer le meilleur parti de awk dans vos scripts ou en ligne de commande, voici quelques bonnes pratiques qui facilitent la lisibilité, la maintenance et la robustesse de vos traitements.

Toujours définir explicitement le séparateur (FS)

Section intitulée « Toujours définir explicitement le séparateur (FS) »

Même si l’espace est le séparateur par défaut, mieux vaut le définir clairement, surtout pour les fichiers structurés :

Fenêtre de terminal
awk 'BEGIN { FS=";" } { print $2 }' fichier.csv

Utilisez BEGIN pour les initialisations et END pour les bilans :

Fenêtre de terminal
awk 'BEGIN { print "Début" } { print $1 } END { print "Fin" }' fichier.txt

Évitez les noms comme a, b, ou x : préférez des noms explicites comme total, compteur, moyenne.

Fenêtre de terminal
awk '{ total += $2 } END { print "Total :", total }'

Utilisez head, tail, ou less pour tester vos traitements sur quelques lignes avant de les appliquer à un fichier complet :

Fenêtre de terminal
head -n 20 fichier.csv | awk -F';' '{ print $1, $2 }'

Utiliser des scripts .awk pour les traitements longs

Section intitulée « Utiliser des scripts .awk pour les traitements longs »

Plutôt que d’écrire des blocs complexes dans une seule ligne :

  • Créez un fichier script.awk
  • Ajoutez un shebang (#!/usr/bin/awk -f) si nécessaire
  • Rappelez-le avec awk -f script.awk fichier.txt

Comme dans tout script, commentez les parties clés :

# Calcul du total par produit
{ total[$1] += $3 }

Protégez vos traitements avec des conditions :

Fenêtre de terminal
awk 'NF > 0 { print $1 }' fichier.txt

En appliquant ces bonnes pratiques, vous ferez de awk un outil fiable et maintenable, aussi puissant dans des scripts d’automatisation que dans une analyse ponctuelle sur un terminal.

Exercices pratiques : mettre en application vos connaissances

Section intitulée « Exercices pratiques : mettre en application vos connaissances »

Vous avez maintenant une bonne compréhension de la commande awk et de ses fonctionnalités. Pour aller plus loin, il est essentiel de pratiquer et de mettre en application vos connaissances. La meilleure façon d’apprendre est d’expérimenter par vous-même, de tester différentes commandes et de découvrir les subtilités de awk en manipulant des fichiers texte.

Pour cela, je vous propose de réaliser une série d’exercices pratiques. Je vous invite à vous rendre sur le dépôt GitHub suivant, où vous trouverez une série de d’excercies spécialement conçus pour vous aider à maîtriser la commande awk et à vous familiariser avec ses différentes options et fonctionnalités.

👉 Travaux pratiques : TP 02-3 : Manipuler des fichiers texte avec awk

Ces exercices couvrent notamment :

  • Extraction de colonnes
  • Filtrage de données
  • Manipulation de variables intégrées
  • Formatage des résultats
  • Traitement de plusieurs fichiers
  • Création de scripts awk

Ensuite vous serez invitée à réaliser un challenge pour mettre en pratique vos compétences nouvellement acquises. Ce challenge vous permettra de tester vos connaissances et de vous familiariser avec l’utilisation de awk dans des situations réelles.

Pourquoi pratiquer ?

L’apprentissage des commandes Linux repose sur la répétition et l’expérimentation. En travaillant sur ces TP :

  • Vous gagnez en confiance avec la ligne de commande
  • Vous découvrez des cas d’usage concrets
  • Vous développez des réflexes indispensables en environnement professionnel

Clonez le dépôt ou suivez directement les consignes en ligne, puis lancez-vous !

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 bien plus qu’un simple extracteur de colonnes : c’est un langage de traitement de texte structuré, capable d’automatiser l’analyse, la transformation et la présentation de données issues de fichiers plats. Grâce à sa syntaxe concise, sa logique ligne par ligne et ses fonctions avancées comme les tableaux ou les scripts complets, awk devient un allié puissant pour toutes les tâches de manipulation de texte en ligne de commande.