La variable FILENAME
contient le nom du fichier courant.
awk '{print FILENAME}' <fichier>
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>
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>
La variable NF
contient le nombre de champs de l'enregistrement courant.
awk '{print NF}' <fichier>
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>
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>
# 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.awk '{ "date +%d-%b-%Y" | getline; print }'
date +%d-%b-%Y
est l'appel à la commande date
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.awk '(NR%3 == 1){print $0}'
awk '(NR%3 == 2){print $0}'
awk '(NR%3 == 0){print $0}' # Syntaxe alternative awk '(NR%3){print $0}'
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
En faisant astucieusement usage de la variable NF
4)
awk '{print $NF}' <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>
awk '{ somme += $1 } END { print somme }' <fichier>