Vous êtes sur la page 1sur 4

Loutil awk

DEA Chimie Informatique Th eorique 24 mars 2004

Le programme awk permet deectuer des transformations sur un chier en raisonnant sur les champs des lignes. Les champs sont les parties de lignes s epar ees par des espaces. Il est souvent utilis e en conjonction avec sed : sed cr ee les champs en rempla cant les s eparateurs dun chier en entr ee par des espaces, et awk agit en fonction de ces champs.

1
1.1

Syntaxe et actions
Appel du programme
La syntaxe g en erique de lutilisation de awk est : awk programme chier

Si le chier nest pas pr esent, awk agit sur les lignes de son entr ee standard. Comme pour sed, il est possible de sauvegarder un programme dans un chier c prog, et de lutiliser avec la commande : awk -f c prog chier

1.2

Format dun programme

Un programme pour awk est une suite de commandes sch ema 1 -action : sch ema { action } Il est aussi possible de d enir des fonctions, mais cela nest pas n ecessaire pour de petits programmes tels que nous en verrons dans la suite du cours et les TDs.
1

pattern

Henri Poincare anne e 2003-2004 Universite

II

1.3
1.3.1

Sch emas possibles


Grammaire

Une commande sch ema -action de awk peut ne pas avoir de sch ema. Dans ce cas, elle est appliqu ee sur toutes les lignes. Les sch emas sont d enis suivant la grammaire suivante : sch ema ::= BEGIN END /expression r eguli` ere / expression arithm etique sch ema ||sch ema sch ema &&sch ema sch ema ?sch ema :sch ema (sch ema) sch ema,sch ema

1.3.2

S emantique

Lors de lanalyse, une commande sch ema-action est ex ecut ee si, et seulement si, le sch ema est vrai. Nous reprenons la grammaire pour expliquer quand un sch ema est vrai. BEGIN : ce sch ema est vrai au d ebut du programme, avant que les lignes commencent ` a etre lues. Laction correspondante est en g en eral utilis ee pour initialiser des variables ; END : sym etriquement, le sch ema END est vrai apr` es que le chier en entr ee soit termin e; /expression r eguli` ere / : laction est appliqu ee si la ligne contient une suite de caract` eres correspondant ` a lexpression r eguli` ere ; expression bool eenne : laction est ex ecut ee si lexpression bool eenne est vraie au moment de lanalyse de la ligne ; sch ema ||sch ema : laction est ex ecut ee si lun des deux sch emas est vrai ; sch ema &&sch ema : laction est ex ecut ee si les deux sch emas sont vrais ; sch ema ?sch ema :sch ema : (if..then..else..) si le premier sch ema est vrai, laction est ex ecut ee si le second lest aussi. Sinon, laction est ex ecut ee si le troisi` eme sch ema est vrai ; (sch ema) : laction est ex ecut ee si le sch ema est vrai ; sch ema,sch ema : laction est ex ecut ee ` a partir du moment o` u une ligne v erie le premier sch ema, et jusqu` a ce quon trouve une ligne v eriant

Henri Poincare anne e 2003-2004 Universite le second sch ema.

III

1.4

Actions
Les structures de contr ole et les variables pr ed enies que nous allons utiliser ont et e donn ees en cours.

Le langage de programmation de awk est extr emement complet, et il est vivement conseill e daller regarder sur la page de manuel toutes les possibilit es (lancement dun autre processus, pipe, utilisation dexpressions r eguli` eres,...). Il y a aussi un livre complet consacr e` a lutilisation en conjonction de awk et sed. Si une commande sch ema-action na pas daction, la ligne est redirig ee ` la di vers la sortie d` es que le sch ema est vraie. A erence de sed, si aucune commande sch ema-action ne sapplique sur une ligne, la ligne nest pas redirig ee vers la sortie standard. Nous ne verrons que les deux commandes print et printf, sur des exemples.

Exemples dutilisation
1. Ecrire les lignes contenant le motif un. awk /un/ {print} chier 2. Ecrire les lignes de plus de 7 caract` eres. awk length > 7 {print} chier 3. Ecrire les deux premiers champs en sens inverse. awk NF>=2 print $2,$1 chier note : pour la fonction print, lespace signie la concat enation de deux cha nes de caract` eres, et la virgule la s eparation par un espace... 4. ... en ecrivant le reste de la ligne. awk NF>=2 printf(%s %s, $2,$1) ; for(i=3 ;i=NF ;i++) printf(%s ,$i) ; chier Le probl` eme ici est que la fonction print passe ` a la ligne automatiquement, do` u lutilisation de printf, qui permet de mieux contr oler la sortie. 5. Impression des lignes entre un ceci et un que (comprises).

Henri Poincare anne e 2003-2004 Universite awk /ceci/,/que/ {print} c

IV

6. Impression de toutes les lignes dont le premier champs est di erent du premier champs de la ligne pr ec edente. awk BEGIN {avant =} {if ($1==avant) print ; avant = $1} c note : lexpression r eguli` ere / avant/ nest pas possible, car avant est une variable de awk. 7. Num eroter les lignes dun chier. awk {print NR,$0} c

Vous aimerez peut-être aussi