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

Afficher la date courante

awk '{ "date +%d-%b-%Y" | getline; print }'

Afficher toutes les trois lignes d'un fichier

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}'

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 4)

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>

Liens

4)
Astuce trouvée sur Unix & Linux Stack Exchange