Table des matières
Awk
Variables
FILENAME — nom du fichier courant
La variable FILENAME
contient le nom du fichier courant.
awk '{print FILENAME}' <fichier>
FNR — nombre d'enregistrements lus dans le fichier courant
La variable FNR
contient le nombre d'enregistrements lus dans le fichier courant.
Le compteur d'enregistrements s'initialise entre chaque fichier.
awk '{print FNR}' <fichier1> <fichier2>
FS — Séparateur de champs
La variable FS
est utilisée pour changer la valeur du séparateur de champs.
Par défaut, l'espace et la tabulation sont utilisés.
# Initialisation de la variable dans la liste de commande awk 'BEGIN { FS="=" } { print $1 }' <fichier> # Initialisation de la variable par l'option du programme awk -F'=' '{print $1}' <fichier>
Le séparateur de champ peut être une expression rationnelle.
# Initialisation de la variable dans la liste de commande awk 'BEGIN { FS="[=_]" } { print $1 }' <fichier> # Initialisation de la variable par l'option du programme awk -F'[=_]' '{print $1}' <fichier>
NF — Nombre de champs
La variable NF
contient le nombre de champs de l'enregistrement courant.
awk '{print NF}' <fichier>
NR — Nombre d'enregistrements lus
La variable NR
contient le nombre total d'enregistrements lus.
Le compteur d'enregistrements ne s'initialise pas entre chaque fichier.
awk '{print NR}' <fichier1> <fichier2>
OFS — Séparateur de champs de la sortie
La variable OFS
est utilisée pour changer la valeur du séparateur de champs de la sortie.
Par défaut, l'espace est utilisée.
awk 'BEGIN { OFS=":" } { print $1 }' <fichier>
Scripts
Remplacer les clefs par les valeurs
# fichier_1 contient l'association entre les clefs et les valeurs : # A 10 # B 30 # C 20 # fichier_2 contient les données à transformer : # ID1 A # ID2 A # ID3 C # ID4 B awk 'FNR==NR{a[$1]=$2;next}{print $1,a[$2]}' <fichier_1> <fichier_2> # La sortie de la commande donnera le résultat suivant : # ID1 10 # ID2 10 # ID3 20 # ID4 30
FNR==NR
permet l'exécution du bloc suivant uniquement lors de la lecture du premier fichier.a[$1]=$2
permet de créer un tableau associatif avec les valeurs trouvées.next
permet de passer directement à l'enregistrement suivant.{print $1,a[$2]}
permet d'afficher une valeur et une valeur convertie.
Afficher la date courante
awk '{ "date +%d-%b-%Y" | getline; print }'
date +%d-%b-%Y
est l'appel à la commandedate
du système. Le format dépend donc de la commande et non pas de awk.getline
permet de stocker la date dans une variable.
Afficher toutes les trois lignes d'un fichier
- En commençant à la première ligne
awk '(NR%3 == 1){print $0}'
- En commençant à la deuxième ligne
awk '(NR%3 == 2){print $0}'
- En commençant à la troisième ligne
awk '(NR%3 == 0){print $0}' # Syntaxe alternative awk '(NR%3){print $0}'
Faire des statistiques d'appels
Dans le journal des évènements d'une API contenant la liste des URI appelées, je veux compter les types d'appels en sachant que l'anatomie d'une URI est la suivante : /xxx/type/id
# trouver le nombre d'appels par type cat /chemin/du/fichier/de.log | awk -F '/' '{print $3}' | sort | uniq -c # Résultat obtenu 440 credit_notes 7 deposits 3 direct_debit_batches 909 incidents 26378 invoices 78 operations 11201 payments 145 refunds 81 safe_deposits # Trouver le nombre d'appels en utilisant la même syntaxe que précédemment cat /chemin/du/fichier/de.log | awk -F '/' '{print $3}' | sort | uniq -c | awk '{print $1}' | paste -sd+ - | bc # Mais c'est beaucoup plus simple d'utiliser un autre outil wc -l /chemin/du/fichier/de.log # Résultat obtenu 39242
Afficher le dernier champ de chaque ligne
En faisant astucieusement usage de la variable NF
1)
awk '{print $NF}' <fichier>
Remplacer le séparateur d'un fichier
En assignant la variable $1
à $1
, cela modifie la valeur du champ ce qui force awk
à reconstruire l'enregistrement $0
.
La reconstruction de l'enregistrement remplace le séparateur FS
par OFS
.
# Ici, 1 équivaut à true, ce qui affiche la ligne complète awk 'BEGIN { FS=","; OFS="|" } { $1=$1 } 1' <fichier> # Cette écriture est donc équivalente awk 'BEGIN { FS=","; OFS="|" } { $1=$1; print $0 }' <fichier>
Calculer la somme des champs d'un fichier
awk '{ somme += $1 } END { print somme }' <fichier>