Outils pour utilisateurs

Outils du site


informatique:awk

Ceci est une ancienne révision du document !


Awk

Variables

  • NR : nombre d'enregistrements lus
  • FNR : nombre d'enregistrements lus dans le fichier courant
  • FILENAME : nom du fichier courant
  • FS : séparateur de champs en entrée
  • OFS : séparateur de champs en sortie

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 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.

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

Liens

informatique/awk.1593759404.txt.gz · Dernière modification : 2020/07/02 23:56 de alexis