BEGIN et END avec la commande awk

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ègle END 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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *