Awk

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Traitement de texte orienté colonnes/lignes
Commande awk
Contexte Extraction de champs, filtrage et calculs sur un flux texte (sortie de commande, CSV, logs...)
Voir aussi Sed (édition de flux, outil complémentaire)

awk découpe chaque ligne d'un flux en champs et permet d'extraire, filtrer, reformater ou calculer sur ces champs en une seule commande. Il est souvent utilisé en sortie d'un pipe (après ps, df, cat...) pour ne garder que les colonnes utiles, ou pour transformer un fichier délimité (CSV, /etc/passwd...).

Extraire des colonnes

ps aux | awk '{print $2}'                                   # 2e colonne (PID)
ps aux | awk '{print $2, $1}'                               # PID puis utilisateur, séparés par un espace
ps aux | awk '{printf "PID: %s utilisé par %s\n", $2, $1}'  # avec un label formaté (printf)
awk -F: '{print $1, $3, $4}' /etc/passwd                    # -F change le séparateur de champs en entrée
awk '{print $NF}' fichier.txt                               # dernier champ de la ligne (NF = nombre de champs)
awk '{print $(NF-1)}' fichier.txt                            # avant-dernier champ

Variables spéciales

  • NR — numéro de la ligne courante (compteur d'enregistrements depuis le début du flux, toutes lignes confondues)
  • NF — nombre de champs sur la ligne courante
  • FS — séparateur de champs en entrée (espace/tabulation par défaut, modifiable avec -F ou dans un bloc BEGIN)
  • OFS — séparateur de champs en sortie utilisé par print quand plusieurs champs sont listés
  • $0 — ligne entière ; $1, $2... — champs individuels
awk '{print NR, $0}' fichier.txt                            # numérote chaque ligne
awk 'NR==1{next} {print}' fichier.txt                       # saute la première ligne (souvent un en-tête)
awk 'BEGIN{FS=";"; OFS=","} {print $1, $2}' fichier.csv     # relit un CSV séparé par ';' et réécrit en ','
awk '{if (NF==9) print $9}' fichier.txt                     # ne traite que les lignes ayant 9 champs

Filtrer des lignes

awk peut combiner en une seule commande ce que grep et cut font séparément, avec des conditions sur des champs précis.

awk '$3 > 1000' fichier.txt          # lignes où le 3e champ dépasse 1000
awk '/erreur/ {print $1}' app.log    # ligne matchant une regex, puis extraction d'un champ
awk '$1 ~ /^root/' /etc/passwd       # motif appliqué à un champ précis plutôt qu'à toute la ligne

Formater la sortie et calculer

awk -F: '{printf "Utilisateur: %s\nUID: %s\nGID: %s\nNom: %s\nHome: %s\nShell: %s\n\n", $1, $3, $4, $5, $6, $7}' /etc/passwd
echo "3 4" | awk '{print int($1+$2)}'                # fonctions mathématiques (int, sqrt, sin, cos...)
echo "Ceci Est Une Chaine" | awk '{print tolower($0)}'  # passage en minuscules (toupper pour l'inverse)
awk '{print substr($1,1,8)}' fichier.txt              # 8 premiers caractères du 1er champ

Sommer une colonne

Le bloc END s'exécute une fois tout le flux consommé, pratique pour afficher un total après une accumulation ligne par ligne.

df -P | awk '{sum += $3} END {print sum}'    # additionne la 3e colonne de chaque ligne, affiche le total à la fin

Parcourir tous les champs d'une ligne

echo "champ1;champ2;champ3" | awk 'BEGIN{FS=";"} {for (i=2; i<=NF; i++) print $i}'                  # du champ 2 jusqu'au dernier
echo "champ1;champ2;champ3;champ4;champ5" | awk 'BEGIN{FS=";"} {for (i=2; i<=4; i++) print $i}'     # du champ 2 au champ 4

Construire et exécuter une commande

cat fichier.txt | awk '{printf "echo %s; ls %s\n", $1, $1}' | ksh   # génère une commande par ligne puis l'exécute via un shell
awk 'BEGIN {print "echo hello" | "/bin/sh"}'                        # awk peut aussi rediriger directement vers une commande externe

⚠️ printf en awk ne prend pas de parenthèses autour de la liste d'arguments (contrairement à un appel de fonction C) : printf "%s\n", $1, pas printf("%s\n"), $1.

Voir aussi

  • Sed — édition de flux ligne à ligne, souvent enchaîné avec awk via un pipe (|) pour combiner substitution et extraction de colonnes