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 deBEGIN
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 produit | Prix | Acheter |
---|---|---|
eBook : Présentation du guide de démarrage Awk pour les débutants | 8,99 $ | [Acheter maintenant] |