Awk
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
-Fou dans un blocBEGIN) - OFS — séparateur de champs en sortie utilisé par
printquand 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