Selon le manuel awk, BEGIN et END ne sont pas utilisés pour faire correspondre lentrée, mais plutôt pour fournir le démarrage et le nettoyage -up au script awk. Voici lexemple donné:
ls -l | \ awk "BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }" Files found: amd.conf antivir.conf xcdroast.conf xinetd.conf
Dabord ceci imprime une chaîne à la sortie. Ensuite, il vérifie lentrée pour une correspondance de modèle, où lentrée commence par un ou un x suivi par nimporte quel caractère une ou plusieurs fois suivi du .conf. Pour toutes les correspondances, la 9ème colonne est imprimée.
Le fait que nous soyons obligés dutiliser commence ici, cela signifie-t-il que awk ne peut utiliser quau plus une fonction dimpression qui contient un BEGIN ou END? Sinon, pourquoi ne pouvons-nous pas simplement utiliser la fonction dimpression au début sans le mot-clé BEGIN? Il semble que BEGIN soit superflu.
Commentaires
- Le simple fait dexécuter la commande sans BEGIN répondrait à votre question, en montrant que ' nest pas superflu et que vous obtiendriez un résultat différent.
Réponse
Le BEGIN
nest « pas superflu. Si vous ne spécifiez pas BEGIN
, alors le print
sera exécuté pour chaque ligne dentrée.
Citations de le manuel :
A
BEGIN
la règle est exécutée une seule fois, avant la lecture du premier enregistrement dentrée. De même, une règleEND
est exécutée une seule fois, après que toutes les entrées ont été lues.
$ seq 5 | awk "BEGIN{print "Hello"}/4/{print}" # Hello printed once Hello 4 $ seq 5 | awk "{print "Hello"}/4/{print}" # Hello printed for each line of input Hello Hello Hello Hello 4 Hello $
Réponse
awk
traite chaque ligne dentrée pour les expressions données dans le corps autre que BEGIN
et END
blocs. Dans le cas de BEGIN
et END
blocs, awk
ne traitera les instructions quune seule fois, avant le début du traitement de lentrée et après le traitement de lentrée ectivement. Sans le bloc BEGIN
, non seulement vous ne seriez pas en mesure dimprimer des informations ponctuelles telles que les en-têtes, mais vous ne seriez pas en mesure dinitialiser efficacement certaines des variables requises par le corps. De plus, pour info, un programme awk
peut avoir plusieurs blocs BEGIN
et END
.
Réponse
awk
exécute chaque bloc uniquement lorsque le modèle avant quil correspond. Le motif vide (juste un bloc) correspond à chaque ligne. BEGIN
et END
sont des modèles spéciaux qui correspondent au début et à la fin du fichier (analogue à la signification de ^
et $
dans le sens horizontal).
Si vous voulez quelque chose à exécuter avant de lire le fichier, utilisez BEGIN
. Par exemple, linitialisation des compteurs ou quelque chose. END
pourrait alors collecter les résultats.
Réponse
Dans lexemple donné, ce qui je pense est simplifié pour la clarté pédagogique, vous avez raison de dire que cest superflu. Vous pourriez obtenir les mêmes résultats sans utiliser BEGIN
.
1 == NR { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }
produirait les mêmes résultats puisque linstruction print est contraint uniquement à la première ligne dentrée.
Cela étant dit, les blocs BEGIN
et END
sont incroyablement puissants outils. Comme dautres solutions lont mentionné, vous pouvez utiliser le bloc BEGIN
pour initialiser des variables ou dautres routines qui ne doivent être exécutées quune seule fois, mais il peut également être utilisé pour exécuter des commandes Awk lorsquil ny a pas fichiers à traiter. Un exemple simple:
BEGIN { print sqrt(12/4) }
Vous pouvez voir un exemple plus sérieux de programmation dans Awk sans traiter aucune entrée ici .
De même, le bloc END
est extrêmement utile pour effectuer des calculs et résumer toutes les entrées. Cela ne peut pas être fait (généralement) sans première lecture de toutes les données. Un exemple simple d’entrée de synthèse peut être trouvé ici