Recherche de site Web

Comment utiliser efficacement BEGIN et END dans Awk


Dans la partie 8 de cette série Awk, nous avons introduit de puissantes fonctionnalités de commande awk, à savoir des variables, des expressions numériques et des opérateurs d’affectation.

Dans ce segment, nous aborderons d’autres fonctionnalités d’Awk, en particulier des modèles spéciaux : BEGIN et END. Ces fonctionnalités spéciales seront utiles alors que nous élargissons notre exploration des opérations complexes d’Awk.

Pour commencer, revenons à l’introduction de la série Awk, rappelez-vous que lorsque nous avons commencé cette série, j’ai souligné que la syntaxe générale de l’exécution d’une commande Awk est :

awk 'script' filenames  

Dans cette syntaxe, le script Awk est formaté comme suit :

/pattern/ { actions } 

Lorsque vous considérez le motif dans le script, il s’agit normalement d’une expression régulière, de plus, vous pouvez également considérer les motifs comme des motifs spéciaux BEGIN et END.

Par conséquent, nous pouvons également écrire une commande Awk sous la forme ci-dessous :

awk '
  BEGIN { actions }
  /pattern/ { actions }
  /pattern/ { actions }
  ...
  END { actions }
' filenames  

Dans le cas où vous utilisez les motifs spéciaux : BEGIN et END dans un script Awk, voici ce que chacun d’eux signifie :

  • Modèle BEGIN : signifie qu’Awk exécutera la ou les actions spécifiées dans BEGIN une fois avant que les lignes d’entrée ne soient lues.
  • Modèle END : signifie qu’Awk exécutera la ou les actions spécifiées dans END avant de se fermer.

Le flux d’exécution d’un script de commande Awk avec ces modèles est le suivant :

  • Lorsque le modèle BEGIN est utilisé dans un script, toutes les actions de BEGIN sont exécutées une fois avant qu’une ligne d’entrée ne soit lue.
  • Ensuite, une ligne d’entrée est lue et analysée dans les différents champs.
  • Ensuite, chacun des motifs non spéciaux spécifiés est comparé à la ligne d’entrée d’une correspondance, lorsqu’une correspondance est trouvée, la ou les actions de ce modèle sont alors exécutées. Cette étape sera répétée pour tous les motifs que vous avez spécifiés.
  • Ensuite, les étapes 2 et 3 sont répétées pour toutes les lignes d’entrée.
  • Lorsque toutes les lignes d’entrée ont été lues et traitées, si vous spécifiez le modèle END, la ou les actions seront exécutées.

Vous devez toujours vous souvenir de cette séquence d’exécution lorsque vous travaillez avec des motifs spéciaux pour obtenir les meilleurs résultats dans une opération Awk.

Pour tout comprendre, illustrons à l’aide de l’exemple de la partie 8, à propos de la liste des domaines appartenant à Tecmint, tels qu’ils sont stockés dans un fichier nommé domains.txt.

news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net

Dans cet exemple, nous voulons compter le nombre de fois où le domaine linux-console.net est répertorié dans le fichier domains.txt. Nous avons donc écrit un petit script shell appelé 'script.sh' pour nous aider à le faire en utilisant l'idée de variables, d'expressions numériques et d'opérateurs d'affectation qui ont le contenu suivant :

#!/bin/bash
for file in $@; do
    if [ -f $file ]; then
        echo "File is: $file"
        awk '/^linux-console.net/ { counter+=1 ; printf "%s\n", counter ; }' $file
    else
        echo "$file is not a file, please specify a file." >&2 && exit 1
    fi
done
exit 0

Employons maintenant les deux modèles spéciaux : BEGIN et END dans la commande Awk du script ci-dessus comme suit :

awk '
  BEGIN { print "The number of times linux-console.net appears in the file is:" ; }
  /^linux-console.net/ { counter+=1 ; }
  END { printf "%s\n", counter ; }
' $file

Après avoir apporté les modifications à la commande Awk, le script shell complet ressemble maintenant à ceci :

#!/bin/bash
for file in $@; do
    if [ -f $file ]; then
        echo "File is: $file"
        awk '
          BEGIN { print "The number of times linux-console.net appears in the file is:" ; }
          /^linux-console.net/ { counter+=1 ; }
          END { printf "%s\n", counter ; }
        ' $file
    else
        echo "$file is not a file, please specify a file." >&2 && exit 1
    fi
done
exit 0

Lorsque vous exécutez ce script, il affiche d’abord l’emplacement du fichier, puis exécute la commande Awk. Le modèle BEGIN imprime le message avant que les lignes d’entrée ne soient traitées. Le motif /^linux-console.net/ compte les occurrences de linux-console.net, et le motif END imprime le nombre total.

Ensuite, notre motif, /^linux-console.net/ est comparé à chaque ligne d’entrée et à l’action, { compteur+=1 ; } est exécuté pour chaque ligne d’entrée, qui compte le nombre de fois linux-console.net apparaît dans le fichier.

Enfin, le modèle END imprimera le nombre total de fois que le domaine linux-console.net apparaît dans le fichier.

./script.sh domains.txt

Conclusion

Pour conclure, nous avons passé en revue d’autres fonctionnalités d’Awk en explorant les concepts de motifs spéciaux : BEGIN et END.

Comme je l’ai déjà souligné, ces fonctionnalités d’Awk nous aideront à construire des opérations de filtrage de texte plus complexes, il y a plus à couvrir sous les fonctionnalités d’Awk, et dans la partie 10, nous aborderons l’idée des variables intégrées d’Awk, alors restez connecté.

Pour ceux qui recherchent une ressource complète, nous avons compilé tous les articles de la série Awk dans un livre, qui comprend 13 chapitres et s’étend sur 41 pages, couvrant à la fois l’utilisation de base et avancée d’Awk avec des exemples pratiques.

Nom du produitPrixAcheter
eBook : Présentation du guide de démarrage Awk pour les débutants8,99 $[Acheter maintenant]

Articles connexes: