Outils pour utilisateurs

Outils du site


informatique:awk

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
informatique:awk [2019/03/21 08:58] – [Awk] alexisinformatique:awk [2023/01/04 20:46] (Version actuelle) – [Remplacer le séparateur d'un fichier] alexis
Ligne 1: Ligne 1:
 ====== Awk ====== ====== Awk ======
  
-<WRAP todo> +===== Variables =====
-<code bash>cat var/logs/accounting_prod-2019-03-21.log | awk -F '/' '{print $3}' | sort | uniq -c</code>+
  
-    440 credit_notes +=== FILENAME — nom du fichier courant === 
-      7 deposits +La variable ''FILENAME'' contient le nom du fichier courant. 
-      3 direct_debit_batches +<WRAP prewrap> 
-    909 incidents +<code bash> 
-  26378 invoices +awk '{print FILENAME}' <fichier> 
-     78 operations +</code> 
-  11201 payments +</WRAP>
-    145 refunds +
-     81 safe_deposits+
  
-<code bash>cat var/logs/accounting_prod-2019-03-21.log | awk -F '/' '{print $3}' | sort | uniq -c | awk '{print $1}' | paste -sd+ - | bc</code>+=== 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. 
 +<WRAP prewrap> 
 +<code bash> 
 +awk '{print FNR}' <fichier1> <fichier2> 
 +</code
 +</WRAP>
  
-39242+=== 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. 
 +<WRAP prewrap> 
 +<code bash> 
 +# 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> 
 +</code>
 </WRAP> </WRAP>
  
 +<WRAP info>
 +Le séparateur de champ peut être une expression rationnelle.
 +<WRAP prewrap>
 +<code bash>
 +# Initialisation de la variable dans la liste de commande
 +awk 'BEGIN { FS="[=_]" } { print $1 }' <fichier>
  
-===== Variables ===== +# Initialisation de la variable par l'option du programme 
-  * NR : nombre d'enregistrements lus +awk -F'[=_]' '{print $1}' <fichier> 
-  * FNR : nombre d'enregistrements lus dans le fichier courant +</code> 
-  * FILENAME : nom du fichier courant +</WRAP> 
-  * FS : séparateur de champs en entrée +</WRAP> 
-  OFS séparateur de champs en sortie+ 
 + 
 +=== NF — Nombre de champs === 
 +La variable ''NF'' contient le nombre de champs de l'enregistrement courant. 
 +<WRAP prewrap> 
 +<code bash> 
 +awk '{print NF}' <fichier> 
 +</code> 
 +</WRAP> 
 + 
 +=== 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. 
 +<WRAP prewrap> 
 +<code bash> 
 +awk '{print NR}' <fichier1> <fichier2> 
 +</code> 
 +</WRAP> 
 + 
 +=== 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. 
 +<WRAP prewrap> 
 +<code bash> 
 +awk 'BEGIN { OFS=":" } { print $1 }' <fichier> 
 +</code> 
 +</WRAP>
  
 ===== Scripts ===== ===== Scripts =====
 ==== Remplacer les clefs par les valeurs ==== ==== Remplacer les clefs par les valeurs ====
 +<WRAP prewrap>
 <code awk> <code awk>
 # fichier_1 contient l'association entre les clefs et les valeurs : # fichier_1 contient l'association entre les clefs et les valeurs :
Ligne 48: Ligne 95:
 # ID4 30 # ID4 30
 </code> </code>
 +</WRAP>
   * ''%%FNR==NR%%'' permet l'exécution du bloc suivant uniquement lors de la lecture du premier fichier.   * ''%%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.   * ''%%a[$1]=$2%%'' permet de créer un tableau associatif avec les valeurs trouvées.
Ligne 54: Ligne 102:
  
 ==== Afficher la date courante ==== ==== Afficher la date courante ====
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '{ "date +%d-%b-%Y" | getline; print }' awk '{ "date +%d-%b-%Y" | getline; print }'
 </code> </code>
 +</WRAP>
   * ''%%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.   * ''%%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.   * ''%%getline%%'' permet de stocker la date dans une variable.
Ligne 63: Ligne 112:
 ==== Afficher toutes les trois lignes d'un fichier ==== ==== Afficher toutes les trois lignes d'un fichier ====
   * En commençant à la première ligne   * En commençant à la première ligne
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '(NR%3 == 1){print $0}' awk '(NR%3 == 1){print $0}'
 </code> </code>
 +</WRAP>
   * En commençant à la deuxième ligne   * En commençant à la deuxième ligne
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '(NR%3 == 2){print $0}' awk '(NR%3 == 2){print $0}'
 </code> </code>
 +</WRAP>
   * En commençant à la troisième ligne   * En commençant à la troisième ligne
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '(NR%3 == 0){print $0}' awk '(NR%3 == 0){print $0}'
Ligne 76: Ligne 130:
 # Syntaxe alternative # Syntaxe alternative
 awk '(NR%3){print $0}' awk '(NR%3){print $0}'
 +</code>
 +</WRAP>
 +
 +==== 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''
 +<WRAP prewrap>
 +<code bash>
 +# 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
 +</code>
 +</WRAP>
 +
 +==== Afficher le dernier champ de chaque ligne ====
 +En faisant astucieusement usage de la variable ''NF'' ((Astuce trouvée sur [[https://unix.stackexchange.com/questions/145672/print-last-element-of-each-row/145673#145673|Unix & Linux Stack Exchange]]
 +))
 +<WRAP prewrap>
 +<code bash>
 +awk '{print $NF}' <fichier>
 +</code>
 +</WRAP>
 +
 +==== 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''.
 +<WRAP prewrap>
 +<code bash>
 +# 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>
 +</code>
 +</WRAP>
 +
 +==== Calculer la somme des champs d'un fichier ====
 +<code bash>
 +awk '{ somme += $1 } END { print somme }' <fichier>
 </code> </code>
  
informatique/awk.1553183903.txt.gz · Dernière modification : 2019/03/21 08:58 de alexis