informatique:awk
Ceci est une ancienne révision du document !
Table des matières
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 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
Liens
informatique/awk.1593759404.txt.gz · Dernière modification : 2020/07/02 23:56 de alexis