Retour au cours

awk

Objectifs

  • Comprendre la structure de base d’un script awk : pattern { action }.
  • Extraire et manipuler des données organisées en colonnes (champs).
  • Filtrer des lignes en fonction de la valeur d’un champ.
  • Effectuer des calculs simples comme des sommes ou des moyennes.
  • Changer le séparateur de champs pour traiter des fichiers comme les CSV.

Explications détaillées

Notions clés

awk : Un langage pour traiter du texte

awk est un langage de programmation extrêmement puissant conçu pour traiter du texte structuré, ligne par ligne. Alors que grep excelle pour trouver des lignes et sed pour les substituer, awk brille lorsqu’il s’agit de manipuler des données en colonnes.

Le principe : pattern { action }

awk lit une entrée (un fichier ou un flux) ligne par ligne. Pour chaque ligne, il évalue une série de paires pattern { action }.

  • pattern : Une condition. Si elle est vraie pour la ligne en cours, l’action est exécutée. Si le pattern est absent, l’action est exécutée pour toutes les lignes.
  • { action } : Le bloc de code à exécuter. L’action par défaut, si elle est omise, est print $0 (afficher la ligne entière).

Champs et Variables

Par défaut, awk découpe chaque ligne en “champs” (colonnes) en utilisant l’espace ou la tabulation comme séparateur.

  • $0 : La ligne entière.
  • $1 : Le premier champ.
  • $2 : Le deuxième champ, etc.
  • $NF : Le dernier champ de la ligne (NF = Number of Fields).

awk dispose aussi de variables intégrées très utiles :

  • NR : Le numéro de la ligne en cours (Number of Record).
  • NF : Le nombre de champs dans la ligne en cours.
  • FS : Le séparateur de champ d’entrée (Field Separator). On le change avec l’option -F.
  • OFS : Le séparateur de champ de sortie (Output Field Separator).

Les blocs BEGIN et END

  • BEGIN { ... } : Ce bloc est exécuté une seule fois, avant que la première ligne ne soit lue. Parfait pour initialiser des variables ou imprimer un en-tête.
  • END { ... } : Ce bloc est exécuté une seule fois, après que la dernière ligne a été lue. Idéal pour afficher des totaux, des moyennes ou un résumé.

Syntaxe / Usages

# Afficher la 1ère et la 3ème colonne, séparées par un tiret
ls -l | awk '{ print $1, "-", $9 }'

# Afficher les lignes où la 2ème colonne est supérieure à 10
awk '$2 > 10 { print $0 }' data.txt

# Traiter un fichier CSV avec le séparateur ','
awk -F',' '{ print "Utilisateur:", $1 }' utilisateurs.csv

# Calculer une somme
awk -F',' '{ sum += $2 } END { print "Total:", sum }' ventes.csv

Exemples

# Créez un fichier 'disques.txt' avec la sortie de 'df -h'
df -h > disques.txt

# 1. Afficher le nom du disque et son utilisation en pourcentage
# Le nom est la 1ère colonne, l'utilisation la 5ème. On ignore l'en-tête (NR > 1).
awk 'NR > 1 { print $1, $5 }' disques.txt

# 2. Alerter si l'utilisation dépasse 80%
# On retire le '%' de la 5ème colonne avant de comparer numériquement.
awk 'NR > 1 && int($5) > 80 { printf "ALERTE: %s est utilisé à %s\n", $1, $5 }' disques.txt

# 3. Calculer la somme des nombres d'une colonne
# Créez un fichier 'nombres.txt' avec un nombre par ligne
printf "10\n5\n20\n" > nombres.txt
awk '{ total += $1 } END { print "La somme est:", total }' nombres.txt
# -> La somme est: 35

Bonnes pratiques

  • awk est l’outil de choix dès que vous avez besoin de manipuler des colonnes. Il est souvent plus simple et plus performant que des scripts shell complexes avec cut, paste, etc.
  • Utilisez les blocs BEGIN et END pour garder votre logique propre : initialisation au début, résumé à la fin.
  • Pour des scripts awk complexes, placez-les dans un fichier séparé et exécutez-les avec awk -f mon_script.awk mon_fichier_de_donnees.

Pièges courants

  • Les champs et les espaces : Par défaut, awk traite toute séquence d’un ou plusieurs espaces/tabulations comme un seul séparateur. Cela peut être surprenant si vos colonnes sont alignées avec un nombre variable d’espaces.
  • Comparaisons numériques vs textuelles : awk essaie d’être intelligent, mais awk '$1 > "10"' fera une comparaison de chaînes, pas de nombres. Pour forcer une comparaison numérique, on peut faire awk '$1+0 > 10'.
  • Oublier les guillemets simples : Le script awk doit presque toujours être entouré de guillemets simples ('...') pour empêcher le shell d’interpréter les $, *, etc.

Exercices

  1. Analyse de ls -l :

    • Utilisez ls -l et awk pour n’afficher que les permissions, le propriétaire et le nom du fichier (colonnes 1, 3 et 9).
  2. Calcul de moyenne :

    • Créez un fichier notes.txt avec une note par ligne.
    • Écrivez une commande awk qui calcule et affiche la note moyenne. (Indice : utilisez NR et un total dans le bloc END).
  3. Filtrage de CSV :

    • Créez un fichier produits.csv avec le contenu nom,prix,stock (ex: stylo,2.50,100).
    • Utilisez awk pour afficher uniquement les noms des produits dont le stock est inférieur à 20.