Vous êtes sur la page 1sur 105

1 Ann

e Sp ciale Informatique e e ENSIMAG Grenoble 1992

LE LANGAGE AWK

Fr d ric LACROIX e e Dan Bog

Remerciements
Nous adressons ces pages d'encre noircies notre ma^tre Serge Rouveyrol, Grand a
Pr^tre des Brumes Astrales et Xinurales. e Nous remercions la famille roumaine Bog et la famille BOZO compos e de : e Gimo : trop petit pour sa gratte Gillou : sans qui nous n'aurions jamais connu Arthur Jackie : notre synth tiseuse de r^ve e e Nathalie dite Caro : ma ch rie, je t'adore e Le p re PNEC : il en bave a l'arm e e e Le ptose : fournisseur o ciel pour le mois de juin La m re Michel : pour avoir fait la lessive et la bou e e En n, j'embrasse le vieux Nain, tous les grands Steaks et toute la famille au pays ...

Introduction
Ce livre est un hymne a l'Obscure, cet tat de l'Esprit lu par le fruit inconscient a e e de notre Ame. C'est un art conu pour faire naitre la passion. Aussi ces mots qui c ne sont qu'assemblages et imbrications de lettres vous paraitront sans signi cation aucune mais ils sont en fait la nature fondamentale qui r git l'univers de la r alit e e e et ces alin as qui sont noy s dans ce brouillard de silhouettes noirs sont cette part e e de r^ve sans quoi le monde ne pourrait exister. e C'est le langage AWK, tendue in nie de verts paturages issus d'un savoir-faire e malthusien encore ignor . Mais comme c'est trange de se retrouver dans cet tat e e e oubli dont il est possible de r^ver les nuits de somnolences inconscientes. e e La premi re partie de ce livre explique les principes essentiels de AWK de faon e c simple et de telle sorte que l'utilisateur les assimile facilement. La deuxi me partie de ce livre d taille chaque point du langage AWK. On pourra e e s'y r f rer apr s avoir bien compris chacun des exemples de la partie 1. ee e La derni re partie de ce livre donne quelques applications r elles trait es par AWK. e e e

Chapter 1 Les principes essentiels de AWK

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

10

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

1.1 Introduction et d nitions e

1.1.1 structure d'un chier de donn es e

Le langage de programmation AWK est tr s e cace dans la gestion de chiers. En e g n ral, un chier de donn es admet une structure coh rente qui peut se d nir de e e e e e la faon suivante : c champ 1 champ2 ::: champ n ligne 1 champ 1 champ2 ::: champ n ligne 2 ::::: ::::: ::::: ::::: ligne i champ 1 champ2 ::: champ n ligne q Les exceptions d pendent de la d nition m^me du type de donn es et peuvent ^tre e e e e e trait es lorsqu'elles sont parfaitement connues. e L'exemple de chier de donn es qui sera utilis dans toute la partie 1 sera le e e suivant : Fichier c.data :
Nom Nombre de cigarettes fumees par jour 20 15 10 10 20 15 0 10 0 Marque de cigarettes Prix du paquet de 20 cigarettes 10.50 10.50 10.50 10.50 6.50 12.50 0 10.50 0

Serge Fredo Marc Alain Agnes Isabelle Pyr Thyll LeSaint

Toute Camel Camel Peter_Bleu Goldo_Leg Royal_Ment Aucune Camel Aucune

Quelques notions de champs et de s parateurs : e 1 Dans notre exemple, chaque champ est s par par un ou plusieurs blancs. Le e e s parateur peut ^tre modi comme on le veut par la variable globale FS. e e e Pour l'instant, FS = " " . 2 AWK compte le nombre de champs d'une ligne courante; ce nombre est plac e dans la variable globale NF dans l'exemple, NF = 4. 3 AWK compte le nombre de lignes du chier d'entr e; ce nombre est plac dans la e e variable globale NR dans l'exemple, NR = 9.

1.1. INTRODUCTION ET DEFINITIONS


Exemples : visualisation du chier d'entr e e imprime chaque ligne du chier.
awk ' print ' fic.data ou awk ' print $0 ' fic.data Serge 20 Toute 10.50 Fredo 15 Camel 10.50 Marc 10 Camel 10.50 Alain 10 Peter_Bleu 10.50 Agnes 20 Goldo_Leg 6.50 Isabelle 15 Royal_Ment 12.50 Pyr 0 Aucune 0 Thyll 10 Camel 10.50 LeSaint 0 Aucune 0

11

crit chaque champ s par d'un blanc virgule, ligne par ligne. e e e
awk ' print NR,$1,$2,$3,$4 ' fic.data 1 Serge 20 Toute 10.50 2 Fredo 15 Camel 10.50 3 Marc 10 Camel 10.50 4 Alain 10 Peter_Bleu 10.50 5 Agnes 20 Goldo_Leg 6.50 6 Isabelle 15 Royal_Ment 12.50 7 Pyr 0 Aucune 0 8 Thyll 10 Camel 10.50 9 LeSaint 0 Aucune 0

crit le nombre de champ de la ligne, le premier puis le dernier champ de chaque e ligne prise en entr e. e
awk ' print NF,$1,$NF ' fic.data 4 Serge 10.50 4 Fredo 10.50 4 Marc 10.50 4 Alain 10.50 4 Agnes 6.50 4 Isabelle 12.50 4 Pyr 0 4 Thyll 10.50 4 LeSaint 0

12

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

1.1.2 ex cution d'un programme AWK e

La commande "awk" est tout d'abord une commande UNIX et par cons quent en e pr sente tous les avantages pipe, criture de scripte shell avec des instructions awk. e e Mais surtout, AWK est un v ritable langage de programmation . e Ainsi, il y a 2 faons g n rales d'ex cuter des instructions AWK: c e e e

1 pour des applications simples : awk 'program' chier1 ... chier n


liste des chiers de donn es en entr e e e

'program' est une liste d'instructions se pr sentant sous la forme qui sera e d nie dans la partie suivante : pattern f action 1; action 2; ... ; action n g. e La commande ex cute le programme, chier par chier, sur chaque ligne de e faon s quentielle, ou s'il n'y a pas de chier en entr e, prend le standard input c e e en tant que chier d'entr e. e Exemple : imprime les lignes o la chaine "Camel" apparait en troisi me champ, c'est- u e a dire les personnes fumant exclusivement des Camels.
awk '$3 == "Camel" Fredo 15 Marc 10 Thyll 10 Fredo 15 Marc 10 Thyll 10 print ' fic.data fic.data Camel 10.50 Camel 10.50 Camel 10.50 Camel 10.50 Camel 10.50 Camel 10.50

imprime une deuxieme fois

2 pour des applications plus complexes :

On ouvre un chier d'instructions awk et l'ex cution s'e ectue par la come mande :

awk -f chierprog liste optionnelle de chiers de donn es e


La commande ex cute s quentiellement le programme se trouvant dans le e e chier programme sur chaque ligne des chiers en entr e. e

1.1. INTRODUCTION ET DEFINITIONS


Exemple : Coh rence des donn es e e On met les instructions suivantes dans le chier " chierprog" :

13

NF != 4 print $0, "le nombre de champ n'est pas egal a 4" $2 0 print $0, "le nombre de cigarettes fumees doit etre positif ou nul" $4 0 print $0, "le prix doit etre positif ou nul" $4 20 print $0, "le prix des cigarettes est cher"

On lance le programme par la commande :

awk -f chierprog c.data

14

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

1.1.3 structure d'un programme AWK


$2 0 print ...

Nous avons vu pr c demment un exemple o AWK tait employ comme une comee u e e mande UNIX et o des conditions et des actions taient combin es : u e e Ces deux arguments d nissent la structure d'un programme AWK. e Un programme AWK se pr sente toujours de la faon suivante : e c

PATTERN f ACTION g PATTERN f ACTION g ..................


Un pattern est une condition portant exclusivement sur une ligne du chier d'entr e e ou sur le standard input. Une action s'e ectue lorsque la condition est valid e ou si elle est e ectivement e ex cutable. e Exemples : imprime le nom des personnes qui fument.
awk ' $2 0 pattern print $1 action ' fic.data Serge Fredo Marc Alain Agnes Isabelle Thyll

la pr sence de pattern ou d'action n'est pas obligatoire : e crit toutes les lignes o le second champ est nul, c'est- -dire les lignes des personnes e u a ne fumant pas.
awk '$2 == 0' fic.data ou Pyr 0 Aucune LeSaint 0 Aucune awk ' if $2 == 0 0 0 print ' fic.data

L'op ration de base de AWK consiste chantillonner la s quence des lignes e ae e d'entr e les unes apr s les autres, recherchant les lignes qui sont "match es" par e e e chacun des patterns du programme. AWK travaille de faon s quentielle d'o son c e u int r^t pour la gestion de chiers. ee

1.1. INTRODUCTION ET DEFINITIONS

15

1.1.4 quelques exemples

Nous supposerons maintenant que les lignes d'instruction sont crites dans le chier e " chierprog" et sont lanc s par l'alias cr e pr c demment "a". e e ee Nous donnons ici quelques exemples d'utilisation de format de sortie avec les deux fonctions print et printf dont la derni re s'apparente exactement a la fonction printf e du langage C. Imprime le nom des fumeurs et le nombre de cigarettes fum es en deux jours e
$2 0 print $1,$2*2 Serge 40 Fredo 30 Marc 20 Alain 20 Agnes 40 Isabelle 30 Thyll 20

printf cr e n'importe quel type de format en sortie. e Le format est une string contenant des  Chaque  est associ une valeur : il y a autant de  que de valeur. ea
printf "argent s .2f n argent argent argent argent argent argent argent argent argent depense depense depense depense depense depense depense depense depense depense apres 1 jour pour s : F .2f n", $1,$2*$4 20 : $1 pour une string nom : $2*$4 20 pour un nombre avec 2 chiffres apres la virgule : retour chariot 1 1 1 1 1 1 1 1 1 jour jour jour jour jour jour jour jour jour pour pour pour pour pour pour pour pour pour Serge : F 10.50 Fredo : F 7.88 Marc : F 5.25 Alain : F 5.25 Agnes : F 6.50 Isabelle : F 9.38 Pyr : F 0.00 Thyll : F 5.25 LeSaint : F 0.00

printf format, valeur 1, valeur 2, valeur 3,....

apres apres apres apres apres apres apres apres apres

16

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

1.2 D buter avec AWK : les fonctions et les varie ables usuelles
Cette partie contient quelques notions essentielles lorsqu'on doit programmer en AWK.

1.2.1 aucune d claration de variable et de type e

L'un des principaux attraits du langage AWK est qu' la fois les variables utilis es a e et leur type ne sont pas d clar s et qu'une variable peut aussi bien avoir un type e e correspondant une chaine de caract re ou un nombre ou m^me, elle peut correa e a e spondre aux deux types. AWK convertit la valeur d'une chaine en un nombre, ou vice-versa lors de l'ex cution du programme. e Puisqu'une variable peut avoir priori deux types, il faut faire attention quant a a son utilisation mais cela prof re au langage une tr s grande souplesse que ne peuvent e e se permettre le langage C ou le Pascal. Exemple :
$1 == "Fredo" Fredo=10 $2=$2+Fredo string=$1 " a l'etat stone :" print string, $2 Fredo a l'etat stone : 25

1.2.2 la s lection par les Patterns : le "Matching" e

Les Patterns sont tr s utilis s pour s lecter les lignes d'un chier qui nous sont utiles e e e : lorsqu'un pattern est v ri , la ligne correspondante du chier est s lect e ou " e e e e match e " et s'il y a une action qui lui succ de, alors l'action est ex cut e sur cette e e e e ligne sinon la ligne est a ch e en sortie. e Cette section donne plusieurs grandes cat gories de patterns souvent employ s : e e 1 : S lection par comparaison e Les symboles de comparaison usuels  ; =; ==; ! =; =;  peuvent ^tre e utilis s la fois sur des nombres et sur des chaines. e a
Exemple : imprime le nom des personnes suivi de la chaine ": gros fumeur" $2 = 20 print $1, ": Gros fumeur" Serge : Gros fumeur Agnes : Gros fumeur

1.2. DEBUTER AVEC AWK : LES FONCTIONS ET LES VARIABLES USUELLES17

2 : S lection par calcul e


Exemple :

On peut e ectuer toutes les op rations arithm tiques les plus simples que ce e e soit dans l'utilisation des patterns ou dans l' criture d'une action. e

pattern s lectionnant les lignes contenant les fumeurs qui d pensent par jour e e une somme sup rieure ou gale 10,50 F. e e a
$2*$4 20 Serge = 10.50 20 Toute 10.50

3 : S lection par texte e


Exemple :

On peut s lecter des lignes sp ci ant simplement un mot. e e pattern s lectionnant toutes les lignes dont le premier champ est par ordre e alphab tique avant la chaine "Fredo". e
$1 "Fredo" Alain 10 Agnes 20 Peter_Bleu Goldo_Leg 10.50 6.50

Mais aussi, il est possible d'e ectuer des recherches sur n'importe quel type de caract re en utilisant des expressions r guli res, similaires au expression e e e r guli res sous "ed" nous d taillons cet aspect dans le chapitre 2. e e e Exemples : matche toutes les lignes o apparait la chaine "Camel" m^me sous la forme u e "RallyeCamel" ou sous la forme "TETEDECamel".
Camel Fredo Marc Thyll 15 10 10 Camel Camel Camel 10.50 10.50 10.50

matche les lignes contenant le symbole y et les imprime.


y Isabelle Pyr Thyll 15 0 10 Royal_Ment Aucune Camel 12.50 0 10.50

18

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK


Comme en C, les op rateurs bool ens AND, OR et NOT sont repr sent s par e e e e .
&& ---|| ---| ---AND OR NOT

4 : Combinaison de patterns
&&, || et |

Exemple : pattern imprimant les lignes o le nombre de cigarettes fum es est sup rieur u e e a 10 ET o la marque est Camel. u
$2 10 && $3 == "Camel" Fredo 15 Camel ou | $2 10.50 = 10 || $3 != "Camel"

5 : BEGIN et END

Les patterns BEGIN et END jouent un r^le particulier et sont tr s souvent o e employ s. Lorsque BEGIN est utilis respectivement END, les actions qui lui e e succ dent sont e ectu es avant respectivement apr s que la premi re respece e e e tivement derni re ligne du chier d'entr e soit lue. Ainsi, on peut e ectuer e e des programmes AWK sans avoir n cessairement de chier en entr e. e e Exemple :
BEGIN END print; print "NOM NOMBRE MARQUE PRIX";print print  commentaires : action sur le fichier fic.data print; print "Nombre de lignes lues :", NR print "VISUALISATION TERMINEE"; print NOMBRE 20 15 10 10 20 15 0 10 0 MARQUE Toute Camel Camel Peter_Bleu Goldo_Leg Royal_Ment Aucune Camel Aucune PRIX 10.50 10.50 10.50 10.50 6.50 12.50 0 10.50 0

NOM Serge Fredo Marc Alain Agnes Isabelle Pyr Thyll LeSaint

Nombre de lignes lues : 9 VISUALISATION TERMINEE

1.2. DEBUTER AVEC AWK : LES FONCTIONS ET LES VARIABLES USUELLES19

1.2.3 la programmation par les actions : les tests et les boucles

La syntaxe des actions est tout fait similaire a celle du langage C mais la grande a di rence r side dans le fait qu'il n'y a aucune d claration de variable comme nous e e e l'avons dit pr c demment. ee Nous donnons quelques exemples d'instructions usuelles.

1 : if-else

Les patterns et les actions de test ou de condition sont priori similaires mais a il faut bien voir qu'un pattern agit sur toutes les lignes d'un chier en entr e e r action en chaine alors qu'une action de test peut agir sur toute variable e tout en contr^lant l'ex cution du programme. o e Exemple : Moyenne sur l'argent depens e par fumeur et par jour. e
$4 END 0 n=n+1; argent=$2*$4 20 + argent if n 0 printf " Argent depense en moyenne par fumeur par jour :" printf "5.2f pour d fumeurs n n", argent n, n else print "pas de fumeur parmi les", NR, "personnes" Argent depense en moyenne par fumeur par jour : 7.14 pour 7 fumeurs

2 : while

Exemple : Sachant que le prix du paquet de cigarettes augmente tous les 6 mois de 10 , donnons les prix apr s 2 ann es. e e
BEGIN $4 != 0 printf" n t Marque t6 mois t12 mois t18 mois t24 mois n" i=1; prix=$4;printf" n t10s",$3 while i =4 prix=prix*1.1 printf" t4.1f",prix i=i+1

END

printf" n n"

20
Marque Toute Camel Camel Peter_Bleu Goldo_Leg Royal_Ment Camel

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK


6 mois 11.6 11.6 11.6 11.6 7.2 13.8 11.6 12 mois 18 mois 24 mois 12.7 12.7 12.7 12.7 7.9 15.1 12.7 14.0 14.0 14.0 14.0 8.7 16.6 14.0 15.4 15.4 15.4 15.4 9.5 18.3 15.4

3 : for

Exemple : imprime tous les fumeurs du chier c.data en cr ant une tabulation nt e

$3 != "Aucune"

for i=1;i =NF;i++ printf" t10s",$i printf" n" 20 Toute 15 Camel 10 Camel 10 Peter_Bleu 20 Goldo_Leg 15 Royal_Ment 10 Camel 10.50 10.50 10.50 10.50 6.50 12.50 10.50

Serge Fredo Marc Alain Agnes Isabelle Thyll

1.2.4 les op rations AWK sur les chaines de caract res e e


1 : la concat nation de chaine e
Exemple : assemble tous les noms des personnes du chier c.data dans la variable "noms" puis imprime le r sultat e
noms=noms $1 " " END print noms Serge Fredo Marc Alain Agnes Isabelle Pyr Thyll LeSaint

En AWK, on peut assembler des chaines de caract res sans que cela pose de e probl mes en crivant les chaines les unes la suite des autres. e e a

1.2. DEBUTER AVEC AWK : LES FONCTIONS ET LES VARIABLES USUELLES21

2 : les fonctions AWK

Comme la plupart des langages, AWK permet l'utilisation de fonctions pr e construites admettant des param tres et retournant le r sultat de leur ex cution. e e e Les fonctions arithm tiques sont donn s dans le chapitre 2 et leur utilie e sation est tr s simple: e Exemple :

crit le logarithme n p rien puis le logarithme d cimal du prix des paquets. e e e e


$4 != 0 print "log du prix :",log$4,"log10 du prix :",log$4 log10 log du prix : 2.35138 log10 du prix : 1.02119 log du prix : 2.35138 log10 du prix : 1.02119 log du prix : 2.35138 log10 du prix : 1.02119 log du prix : 2.35138 log10 du prix : 1.02119 log du prix : 1.8718 log10 du prix : 0.812913 log du prix : 2.52573 log10 du prix : 1.09691 log du prix : 2.35138 log10 du prix : 1.02119

Les fonctions sur les chaines sont sp ci ques au langage AWK puisque toutes e les variables sont d nies comme des chaines de caract res. e e Nous donnons ici deux des fonctions les plus employ es : split et gsub. e La fonction splits,a clate la chaine s, caract re par caract re suivant le e e e s parateur FS et place chaque l ment clat dans le tableau a nous voyons e ee e e les tableaux plus bas. Elle retourne le nombre d' l ments du tableau a. ee Exemple : explosion de la ligne contenant la chaine Fr.
Fr max=split$0,tab for i=1;i =max;i++ print i, tab i

1 2 3 4

Fredo 15 Camel 10.50

22

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK


La fonction gsubr,s,t substitue par s ce qui est match par l'expression e r guli re r, globalement dans la chaine t. e e Exemple : suppression du dernier caract re dans la chaine Fredo jusqu' sa n d nitive e a e et alors sortie forc e du programme par "exit". e
$1 == "Fredo" printf" Mort lente de s chaine=$1 while $1 != "" n", $1

printf" ts n", $1 gsub a-zA-Z $ ,"", $1 printf" exit s est mort mais il meurt avec $1 n", chaine

Mort lente de Fredo Fredo Fred Fre Fr F Fredo est mort mais il meurt avec $1

1.2. DEBUTER AVEC AWK : LES FONCTIONS ET LES VARIABLES USUELLES23

1.2.5 les tableaux - la notion de tableaux associatifs


Exemple : crit le chier d'entr e dans l'ordre inverse. e e
x NR =$0 END for i=NR;i 0;i-- print x LeSaint 0 Aucune Thyll 10 Camel Pyr 0 Aucune Isabelle 15 Royal_Ment Agnes 20 Goldo_Leg Alain 10 Peter_Bleu Marc 10 Camel Fredo 15 Camel Serge 20 Toute i 0 10.50 0 12.50 6.50 10.50 10.50 10.50 10.50

AWK permet l'utilisation de tableaux pour stocker des chaines ou des nombres sans qu'il y ait besoin de les d clarer. e

La caract ristique qui fait que les tableaux en AWK sont di rents des tableaux e e employ s par les principaux langages est que les indices sont des chaines. Pour cette e raison, les tableaux sous AWK sont appel s tableaux associatifs. e Exemple :
Camel Nb Camel +=$2 Peter_Bleu Nb "Peter_Bleu" +=$2 END print " Nombre de Camel fumees :", Nb Camel print " Nombre de Peter_Bleu fumees :", Nb "Peter_Bleu" Nombre de Camel fumees : 35 Nombre de Peter_Bleu fumees : 10 $3 ~ Toute tab 6 ="clo";tab 3 ="x";tab 4 ="eur " tab 5 ="de ";tab 2 ="ta";tab 1 ="pes" printf"s ",$1 for c in tab printf"s", tab c  print ""

Serge taxeur de clopes Avec l'option "in", l'ordre d'ecriture est quelconque.

24

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

1.2.6 cr er une fonction par "function" e

En plus des fonctions pr -d nies, un programme AWK peut contenir ses propres e e fonctions. De m^me qu'en C, une fonction se d nit de la faon suivante : e e c function nom liste de param tres f instructions g e La d nition des fonctions est enti rement s par e du corps du programme princie e e e pal. Le corps de la focntion peut contenir l'instruction "return" qui retourne alors un tat ou une valeur vers l'instruction appelante. e Exemple : Lorsque Fredo et Marc se rencontrent, il y a une consommation de cigarettes qui croit par rapport la normale de faon g om trique raison 2. On veut calculer au a c e e bout de combien de temps chacune des deux personnes aura consomm 20 cigarettes e sachant qu'il y a 15 heures dans une journ e de fumeur : e On utilise pour cela une fonction calcul qui value le temps en minute partir du e a nombre de cigarettes fum es par jour. e On utilise aussi la fonction arithm tique "int" qui prend la partie enti re d'une e e valeur num rique. e

1.2. DEBUTER AVEC AWK : LES FONCTIONS ET LES VARIABLES USUELLES25


$1=="Fredo" $1=="Marc" END printf printf printf printf printf "Temps de rencontre apres 20 cigarettes fumees n" " t pour Fredo : d heures", inttab "fredo" 60 " d minutes n", tab "fredo" -60*inttab "fredo" 60 " t pour Marc : d heures", inttab "marc" 60 " d minutes n", tab "marc" -60*inttab "marc" 60 tab "fredo" =calcul$2 tab "marc" =calcul$2

function calculnombre normal=nombre 15 terme=normal x=0;i=0 whilex 20 i++ xold=x x=x+terme terme=2*terme cigaminute=x-xold 60 min=20-xold cigaminute temps=inti-1*60+min returntemps Temps de rencontre apres 20 cigarettes fumees pour Fredo : 4 heures 18 minutes pour Marc : 4 heures 56 minutes

26

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

1.2.7 les entr es : la fonction "getline " e

Il y a plusieurs faons de cr er des entr es un programme AWK. La faon la plus c e e a c simple est celle que nous utilisons depuis le d but, c.a.d. placer des donn es dans e e un chier c.data puis le lire s quentiellement par les commandes : e
- awk 'program' fic.data - awk -f fichierprog fic.data

Une autre faon est d'utiliser les pipes : c Exemple : on utilise la commande grep pour s lectionner la ligne contenant "Fredo" e puis on travaille dessus.
grep 'Fredo' fic.data | awk '$2 0 Fredo est un fumeur print "Fredo est un fumeur" '

La fonction " getline " lit l'enregistrement sur l'entr e et incr mente NR. Elle ree e tourne 1 s'il n'y a pas eu d'erreur 0 si c'est la n de chier et -1 en cas d'erreur. Exemples : lit la ligne point e du chier " chier" : e
getline "fichier"

place dans la variable x la ligne point e du chier " chier" : e


getline x "fichier"

tous les exemples pr c dents peuvent ^tre crit avec la fonction getline en plaant ee e e c le corps du programme dans BEGIN : Mort lente de Fredo.
BEGIN while getline "fic.data" 0 && $1=="Fredo" printf" Mort lente de s chaine=$1 while $1 != "" n", $1

printf" ts n", $1 gsub a-zA-Z $ ,"", $1 printf" exit s est mort mais il meurt avec $1 n", chaine

1.2. DEBUTER AVEC AWK : LES FONCTIONS ET LES VARIABLES USUELLES27


Mort lente de Fredo Fredo Fred Fre Fr F Fredo est mort mais il meurt avec $1

Le programme se lance alors par la commande :


awk -f fichierprog

Nous avons vu avec "print" et "printf" des exemples d'a chage en sortie sur le standard output mais il est possible aussi de diriger la sortie l'int rieur d'un proa e gramme awk vers un chier. Exemples :

1.2.8 les sorties et les int ractions avec d'autres programmes e : la fonction "system"

le premier exemple imprime les noms des fumeurs dans un chier nomm "nom". e le second exemple imprime la suite du chier nom ainsi cr la marque de cigarette a ee fum e. e
awk '$2 0 awk '$2 0 print $1 print $3 "nom" ' fic.data "nom" ' fic.data

fichier "nom" resultant Serge Fredo Marc Alain Agnes Isabelle Thyll Toute Camel Camel Peter_Bleu Goldo_Leg Royal_Ment Camel

28

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

Les int ractions avec d'autres programmes se font de faon di rente : e c e 1 : les pipes en sortie et en entr e e
print | commande commande | getline

Exemples : tri suivant le nom des fumeurs ; on utilise l'option "in" dans for ce qui nous permet d'obtenir tous les l ments du tableau constitu . ee e
$2 0 END Marque $1 =$3 for c in Marque printf"8s t10s n", c, Marque c  | "sort -b +0"

Agnes Alain Fredo Isabelle Marc Serge Thyll

Goldo_Leg Peter_Bleu Camel Royal_Ment Camel Toute Camel

d compte du nombre de personnes logg es sur le syst me Arthur un instant e e e a donn . e


BEGIN while "who" | getline x n++;print x print "personnes loggees sur Arthur :", n fredo ttyq1 Jun 12 bonhair ttyq2 Jun 12 gillou ttyq3 Jun 12 gemo ttyq4 Jun 12 jackie ttyq6 Jun 12 renz ttyq8 Jun 12 leptose ttyq13 Jun 12 personnes loggees sur Arthur : 15:28 17:21 17:35 16:01 17:35 16:47 16:52 7

peut aussi etre effectue par la commande Unix : who | awk ' n++;print END print "personnes loggees sur Arthur :", n '

1.2. DEBUTER AVEC AWK : LES FONCTIONS ET LES VARIABLES USUELLES29

2 : la fonction "system" La fonction "system expression" ex cute la commande e


"expression" donn e sous forme de string : e Exemple : plusieurs exemples d'ecritures sur le standard erreur.
BEGIN printf" t Message : " getline message print 1, message | "cat 1 &2" system"echo '2 "message"' 1 &2" print 3, message " dev tty" Message 1 And my blood is 2 And my blood is 3 And my blood is : And my blood colder, closed colder, closed colder, closed is colder, closed the doors of my mind the doors of my mind the doors of my mind the doors of my mind

30

CHAPTER 1. LES PRINCIPES ESSENTIELS DE AWK

Chapter 2 Le langage AWK en d tail e

31

32

CHAPTER 2. LE LANGAGE AWK EN DETAIL

33 Ce chapitre explique, l'aide d'exemples, tous les ingr dients de programmation a e en AWK. La premi re section d crit les patterns en d tail. La seconde donne la description e e e des actions par les expressions, les a ectations et les actions de tests et de boucles. Les sections restantes couvrent la d nition des fonctions, des sorties, des entr es et e e comment des programmes awk peuvent int ragir sur d'autres programmes. e Le chier d'entr e choisi comme exemple dans cette partie sera un chier texte e Fichier elds :
Would you pay lifes pleasure to see me Does it heart for I want you to remain I run your hair through, in another decade Summerlands holds me in sumerian haze Between the spaces, along the wall appearing faces that disappear at dawn Were getting closer, I can see the door closer and closer Kthulhu calls forever remain, forever remain

34

CHAPTER 2. LE LANGAGE AWK EN DETAIL

2.1 Les patterns


Les patterns contr^lent l'ex cution des actions : quand un pattern est v ri , il o e e e matche la ligne concern e et l'action est ex cut e sur cette ligne. Cette partie d crit e e e e les six types de patterns et les conditions sous lesquelles elles sont v ri es. e e MATCHE avant que toute entr e soit lue e apr s que toute entr e soit lue e e matche les lignes o le nombre u de champs est sup rieur 5 e a patterns sur chaines =closer= matche les lignes contenant la string "closer" compos de patterns e NF 5 && =I= matche les lignes contenant plus de 5 champs et contenant la string "I" intervalle NR==10, NR==20 matche les lignes de 10 20 a PATTERN BEGIN END expression EXEMPLE BEGIN END NF 5

2.1. LES PATTERNS

35

2.1.1 BEGIN et END

Les patterns BEGIN et END ne matchent aucune ligne en entr e. Les instructions e qui succ dent le pattern BEGIN sont ex cut es avant toute lecture en entr e. De e e e e faon similaire, les instructions qui succ dent le pattern END sont ex cut es apr s c e e e e toute lecture en entr e. e BEGIN et END ne se combinent avec aucun autre pattern. Si plusieurs BEGIN apparaissent dans un programme, les actions associ es sont e ex cut es dans l'ordre auquel ils apparaissent dans le programme. e e Exemple :
BEGIN print "on met en general les actions BEGIN en tete de fichier" NF 5 BEGIN printf"je suis toujours execute avant la premiere ligne d'entree n" on met en general les actions BEGIN en tete de fichier je suis toujours execute avant la premiere ligne d'entree Does it heart for I want you to remain I run your hair through, in another decade Summerlands holds me in sumerian haze Between the spaces, along the wall appearing faces that disappear at dawn Were getting closer, I can see the door

36

CHAPTER 2. LE LANGAGE AWK EN DETAIL

2.1.2 Les expressions

Comme la plupart des langages de programmation, AWK est riche dans la description des op rations arithm tiques. Par contre, contrairement a tous les langages, e e AWK comprend des expressions sur les chaines de caract res. e Une string est une chaine de z ro ou plus de z ro caract res. Elles peuvent ^tre e e e e stock es dans des variables, ou peuvent apparaitre litt ralement en tant que des e e constantes telles que "Fredo". La chaine "" est appel e la chaine nulle. Le terme de e substring signi e une s quence de z ro ou plus de z ro caract res l'int rieur d'une e e e e a e string. Toute expression peut ^tre utilis e en tant qu'op rande de tout op rateur. Si une e e e e expression a une valeur num rique mais qu'un op rateur requiert une string, alors la e e valeur num rique est automatiquement transform e en une string et r ciproquement. e e e Les patterns les plus typiques sont les comparaisons entre les chaines ou nombres. Ces op rateurs sont list s dans le tableau qui suit. e e L'op rateur  tilde sera expliqu dans la partie suivant. e e SIGNIFICATION plus petit que = plus petit ou gal e a == gal a e != di rent de e = plus grand ou gal e a plus grand que  match par e ! non match par e Dans le cas d'une comparaison, si les 2 op randes sont num riques, une comparaison e e num rique est e ectu e; sinon, tout op rande num rique est converti en une string e e e e et alors les op randes sont compar s en tant que string. e e Les strings sont compar es caract re par caract re selon l'ordre d ni par la mae e e e chine, souvent selon les codes ASCII. Une chaine est dite inf rieure une autre si e a elle apparait avant l'autre selon cet ordre. Exemple :
"Fumer" "Fumee" "Fumeur" "Stone" "Fumeur" "fumeur"

OPERATEUR

Lorsqu'un pattern de comparaison est valid e sur la ligne courante, alors la ligne e courante est dite " match e ", c'est- -dire s lect e. e a e e

2.1. LES PATTERNS

37

2.1.3 Les patterns sp ci ques aux chaines e

AWK permet de s lecter ou de matcher des chaines de caract res quelconques pare e a tir d'expressions sp ci ques appel es EXPRESSIONS REGULIERES qui sont e e tr s souvent utilis es en Shell et sous diteur. e e e Un pattern sur une chaine teste si la chaine contient e ectivement la substring match e par l'expression r guli re. e e e Le tableau ci-dessous donne les 3 grands types de patterns sp ci ques a la recherche e de chaines de caract res : e SIGNIFICATION Matche la ligne courante quand une substring est match e par l'expression r guli re e e e expression=expr.reg.= Matche la ligne courante si la chaine "expression" contient une substring match e par l'expression r guli re e e e expression!=expr.reg.= Matche la ligne courante si la chaine "expression" ne contient pas une substring match e par l'expression r guli re e e e TYPE =expression r guli re= e e

L'expression r guli re la plus simple est une suite de lettres ou de chi res entre e e slashs. Exemple : =Fredo= Ce pattern recherche sur chaque ligne les occurences de la substring "Fredo" et si cette chaine est trouv e m^me sous la forme FredoLeBon, alors la ligne est match e. e e e Remarque : = Fredo = Ce pattern recherche la string "Fredo"; une ligne contenant FredoLeBon ne sera donc pas match e. e Les deux autres types de patterns sp ci ques aux chaines utilisent un op rateur e e : l'op rateur tilde :  e
expression ~ r expression !~ r r represente une expression reguliere

L'op rateur  signi e "est match par" et l'op rateur ! constitue son compl ment. e e e e

38 Exemples :

CHAPTER 2. LE LANGAGE AWK EN DETAIL

$1 ~ e  matche toutes les lignes dont le premier champ  contient au moins un "e". Does it heart for I want you to remain Summerlands holds me in sumerian haze Between the spaces, along the wall appearing faces that disappear at dawn Were getting closer, I can see the door closer and closer forever remain, forever remain $1 !~ e  matche toutes les lignes dont le premier champ  ne contient pas de "e". Would you pay lifes pleasure to see me I run your hair through, in another decade Kthulhu calls

2.1. LES PATTERNS

39

2.1.4 Les expressions r guli res e e

Une expression r guli re est une expression sp ci que contenant des symboles pare e e ticuliers, qui permet la s lection de n'importe quel type de substring d'un texte par e exemple. Elles sont toujours plac es entre slash : =r= comme nous l'avons d j vu dans la e ea partie pr c dente. On les utilise aussi dans toutes les actions de conditions car nous ee savons que les actions de conditions tests et boucles s'apparentent beaucoup aux patterns. Leur utilisation en tant que pattern se r sume donc : e a
r expression ~ r expression !~ r r represente une expression reguliere

Les caract res n,^,$, ,j, ,,+,? sont a la base de toute construction d'expressions e r guli res; ils sont appel s "m tacaract res". Si on veut matcher l'un de ses symboles e e e e e dans une expression r guli re sous sa d nition naturelle, on doit placer un antislash e e e devant n$ matche le caract re $ par exemple. e

40

CHAPTER 2. LE LANGAGE AWK EN DETAIL


Le m tacaract re n plac devant un autre m tacaract re le transforme en un e e e e e caract re normal. e Le m tacaract re n plac devant certains symboles sp ciaux matche aussi une e e e e s quence de tabulations voir le tableau ci-apr s e e SEQUENCE nb nf nn nr nt nddd nc SIGNIFICATION backspace : supprime le dernier caract re d'une chaine e formfeed : nouvelle page newline : nouvelle ligne carriage return : retour la ligne a tabulation : cr e une tabulation de 10 espaces e valeur octale ddd o ddd est trois nombres compris entre 0 et 7 u tout caract re pris sous sa forme litt rale e e except pour les caract res : n : nn et " : n" e e

1. n,^,$,. :

Le m tacaract re ^ matche le d but d'une string. e e e Le m tacaract re $ matche la n d'une string. e e Le m tacaract re . matche un caract re quelconque et un seul. e e e Exemples :
^F F$ ^F$ ^.$ ... .$ matche matche matche matche matche matche un F au debut d'une chaine. un F en fin de chaine. la chaine composee du simple caractere F. toute chaine composee de un seul caractere. toute suite de trois caracteres. le point en fin de chaine.

2.1. LES PATTERNS

41

2.

: Une expression r guli re consistant en un groupe de caract res entour de e e e e crochets est appel e classe de caract res; elle matche chacun des caract res e e e a l'int rieur des crochets. e Lorsqu'on veut matcher une s rie de caract res qui se suivent d'apr s l'ordre e e e d nie par la machine, on peut utiliser le tiret. e La classe compl mentaire d'une classe quelconque est d not e par le m tacaract re e e e e e ^ apr s l'ouverture du crochet. e Exemples :
AEO ^AEO ^ ^ABC ^ ^a-za-zA-Z 0-9 matche chacun des caracteres A,E et O. matche tous les caracteres sauf A,E et O. matche tout caractere en debut de chaine sauf A,B et C. matche toute chaine consistant en un seul caractere sauf les minuscules et "-". matche toute chaine consistant en une lettre minuscule ou majuscule suivie d'un nombre.

A l'int rieur d'une classe de caract re, tout caract re admet sa signi cation e e e normale except les caract res n , ^ plac en d but et - plac entre 2 caract res. e e e e e e Ainsi :
. ^ ^^ matche le point ".". matche tout caractere en debut de chaine sauf l'accent ^.

42

CHAPTER 2. LE LANGAGE AWK EN DETAIL


Il y a deux op rateurs binaires sur les expressions r guli res : la concat nation e e e e et le ou. Si r1 et r2 sont des expressions r guli res, alors : e e r1jr2 matche toute string match e par r1 ou r2 . e r1r2 matche toute string de la forme xy o r1 matche x et r2 matche y. u Si r1 ou r2 ne contiennent pas d'op rateur j, les parenth ses peuvent ^tre e e e omises. Exemple :
 a-zA-Z ee  matche les substring contenant un caractere suivi  de la chaine "ee". forever|closer remain|and  matche les lignes contenant l'un des deux  mots presents dans la premiere parenthese  suivi par l'un des deux mots presents dans  l'autre parenthese. to see me Between the spaces, along the wall Were getting closer, I can see the door closer and closer forever remain, forever remain

3.  ,j :

2.1. LES PATTERNS

43

4. +,,? :

Ces op rateurs unaires sont utilis s pour sp ci er des r p titions dans des exe e e e e pressions r guli res. e e r matche toute chaine consistant en z ro ou plus de z ro substring cons cutives e e e match es par r. e r+ matche toute chaine consistant en une ou plus de une substring cons cutives e match es par r. e r? matche la chaine nulle ou toute chaine match e par r. e Exemple :
F* FR*E FR+E FRR*E FR?E A-Z + FR+E : : : : : : : matche matche matche matche matche matche matche la chaine nulle ou F ou FF, etc... FE ou FRE ou FRRE, etc... FRE ou FRRE ou FRRRE, etc... FRE ou FRRE ou FRRRE, etc... FE ou FRE. toute chaine de une ou plus de une lettre majuscule FRE, FRFRE, FRFRFRE, etc...

^ +- ? 0-9 + . ? 0-9 *| . 0-9 + eE +- ? 0-9 +?$ matche les nombres reels avec un signe optionnel et un exposant optionnel.

44

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Nous r capitulons dans le tableau ci-dessous toutes les expressions r guli res que e e e l'on peut rencontrer et leur signi cation. EXPRESSION c nc ^ $ .
c1 c2 ::: ^c1 c2 ::: c1 -c2 ^c1 -c2 r1 jr2 r1r2

r r+ r? r

MATCHE le non m tacaract re c e e s quence de tabulation ou le caract re litt ral c e e e d but de string e n de string tout caract re e tout caract re c1 , c2 .... e tout caract re sauf c1 , c2 .... e tout caract re de c1 c2 e a tout caract re non de c1 c2 e a toute chaine match e par r1 ou r2 e toute chaine xy o r1 matche x et o r2 matche y u u les parenth ses ne sont pas obligatoires si on n'utilise pas j e z ro ou plus de z ro chaines cons cutives match es par r e e e e une ou plus de une chaines cons cutives match es par r e e la chaine nulle ou toute chaine match e par r e toute chaine match e par r e

2.1. LES PATTERNS

45

2.1.5 Les compos s de patterns e


Exemple :
forever|closer && ^ fc closer and closer forever remain, forever remain

Un compos de patterns est un expression qui combine une s rie de patterns par un e e op rateur logique : jj OU, && ET et j NON. e Un compos de pattern matche la ligne courante si l'expression valu e est vraie. e e e

2.1.6 Les intervalles

On d nit un intervalle de patterns comme tant deux patterns s par s par une e e e e virgule telle que :
pat1, pat2

Un intervalle de patterns matche chaque ligne entre une occurence de pat1 et la prochaine occurence de pat2 , incluse; pat2 peut matcher la m^me ligne que pat1 e donnant ainsi en r sultat de l'intervalle une seule ligne. e Exemples :
see , I to see me Does it heart for I want you to remain Were getting closer, I can see the door I , see Does it heart for I want you to remain I run your hair through, in another decade Summerlands holds me in sumerian haze Between the spaces, along the wall appearing faces that disappear at dawn Were getting closer, I can see the door

46

CHAPTER 2. LE LANGAGE AWK EN DETAIL

2.2 Les actions


Dans la structure d'un programme AWK :

PATTERN f ACTION g instruction PATTERN f ACTION g instruction


............................... les patterns d terminent quand une action doit s'ex cuter. e e Parfois, une action peut ^tre tr s simple : print ... ou elle peut ^tre une a ece e e tation; souvent, elle regroupe une s rie de lignes contenant des fonctions, accolades e et autres l ments du vocabulaire non terminal qui d nissent toute la richesse du ee e langage AWK. Le tableau ci-dessous donne tous les l ments du vocabulaire de haut niveau ee intervenant dans une action : ACTIONS
expressions avec des constantes, variables, a ectations, appel de fonctions, etc.. printformat,liste d'expression printfformat,liste d'expression if expression instructions if expression instructions else instructions while expression instruction for expression;expression;expression instructions for variable in tableau instruction do instructions while expression break continue next exit exit expression f expression g

2.2. LES ACTIONS

47

2.2.1 Les Expressions

Les expressions les plus simples sont des blocs primaires constitu s de constantes, e de variables, de tableaux, d'appels des fonctions et de variables pr -d nies telles a e e que les s parateurs. e Les op rateurs sur les expressions combinent les expressions entre elles et ils e entrent dans cinq grandes cat gories : arithm tique, comparaison, logique, condie e tionelle et a ectation. En n, les fonctions pr d nies et les fonctions que l'on peut construire utilisent e e les expressions et repr sentent aussi une grande classe d'expressions. e Il existe deux types de constantes, les chaines et les nombres. Une constante chaine est cr e en entourant la chaine de quotes : " telle que ee "pleasure ", "holds", "me ", "for", "", "?". Une constante num rique peut ^tre un entier 2000 ou un r el sous toutes les formes e e e suivantes : 2000.01 0.07E-1 ou 0.07e-1 1e6, 1.00E6, 10e5, 0.1e7 et 1000000 sont identiques Tous les nombres ont la pr cision maximale d pendant de la machine. e e Il y a deux types de variables sous AWK : 1. les variables d nies par l'utilisateur : ce sont toutes les s quences de lettres, e e chi res et soulign s qui ne commencent pas par un chi re et qui ne font pas e partie du vocabulaire non terminal du langage AWK. Puisque le type d'une variable n'est pas d clar , AWK d termine son type e e e de part le contexte du programme. Ainsi, AWK convertit la valeur d'une chaine en un nombre ou en une chaine suivant la faon dont on veut utiliser c la variable.

Les constantes, variables, variables pr -d nies e e

Les variables

2. les variables pr -d nies : il existe sous AWK des variables globales qui sont e e
x es au d part et que l'on ne peut utiliser al atoirement. Par contre, la valeur e e e de ces variables peut ^tre modi e par l'utilisateur tout en restant coh rent e e e avec sa d nition. e

48

CHAPTER 2. LE LANGAGE AWK EN DETAIL


Le tableau ci-dessous liste la forme litt rale, la d nition et la valeur par d faut e e e de chacune de ces variables. VARIABLE ARGC ARGV FILENAME FNR FS NF NR OFMT OFS ORS RLENGTH RS RSTART SUBSEP Exemple :
BEGIN OFS=" " print "nombre d'arguments :", ARGC " n" for c in ARGV print c,ARGV c printf" n" for i=0;i ARGC;i++ printf" s", ARGV i  printf" n n" printf"NOM du fichier1 : s n", FILENAME print "FNR=" FNR,"NR=" NR,$0 END printf"NOM du fichier2 : s n", FILENAME nombre d'arguments : 2 0 1 fields awk fields awk fields fields 3

DEFINITION nombre d'arguments de la ligne de commande tableau d'arguments de la ligne de commande nom du chier d'entr e courant e nombre d'enregistrement du chier courant controle le s parateur de champ en entr e e e nombre de champ de l'enregistrement courant nombre d'enregistrements lus format de sortie pour les nombres s parateur de sortie e s parateur des enregistrements e longueur d'une chaine match e par la fonction "match" e controle le s parateur d'enregistrement en entr e e e d but de la chaine match e par la fonction "match" e e s parateur d'indice e

DEFAUT "" ".6g" "" "nn" "nn" "n034"

NOM du fichier1 : fields

2.2. LES ACTIONS


FNR=1 FNR=2 FNR=3 FNR=4 FNR=5 FNR=6 FNR=7 FNR=8 FNR=9 FNR=10 FNR=11 FNR=1 FNR=2 FNR=3 FNR=4 FNR=5 FNR=6 FNR=7 FNR=8 FNR=9 FNR=10 FNR=11 NOM du NR=1 Would you pay lifes pleasure NR=2 to see me NR=3 Does it heart for I want you to remain NR=4 I run your hair through, in another decade NR=5 Summerlands holds me in sumerian haze NR=6 Between the spaces, along the wall NR=7 appearing faces that disappear at dawn NR=8 Were getting closer, I can see the door NR=9 closer and closer NR=10 Kthulhu calls NR=11 forever remain, forever remain NR=12 Would you pay lifes pleasure NR=13 to see me NR=14 Does it heart for I want you to remain NR=15 I run your hair through, in another decade NR=16 Summerlands holds me in sumerian haze NR=17 Between the spaces, along the wall NR=18 appearing faces that disappear at dawn NR=19 Were getting closer, I can see the door NR=20 closer and closer NR=21 Kthulhu calls NR=22 forever remain, forever remain fichier2 : fields

49

On peut additionner des arguments ARGV ou modi er son contenu; ARGC a peut aussi ^tre modi . A chaque n de chier d'entr e, awk traite l' l ment e e e ee suivant non nul de ARGV jusqu' la valeur de ARGC-1 comme le nom du a prochain chier d'entr e. Ainsi, mettre un l ment de ARGV z ro signi e e ee a e qu'il ne sera pas trait comme un chier d'entr e. Le nom "-" peut ^tre utilis e e e e pour l'entr e standard. nous voyons un exemple dans la partie Int raction e e avec les autres programmes.

50

CHAPTER 2. LE LANGAGE AWK EN DETAIL

AWK permet la combinaison des expressions par les op rateurs. e Nous listons les di rents op rateurs dans le tableau ci-dessous. e e

les op rateurs arithm tiques, logiques et d'a ectation e e

OPERATION a ectation conditionnel logique OU logique ET l ment de tableau ee matching relationel concat nation e

OPERATEURS EXEMPLE = += -= = x = 2 = = ^= ?: x?y:z jj x jj y && in


~ !~

SIGNIFICATION x= x2

= == != =

somme, soustraction + mult.,div.,modulo   plus et moins unaire + logique NON j puissance incr ment e d cr ment e e champ groupement ^ ++ $ 

si x est vrai alors y sinon z 1 si x ou y sont vrais 0, sinon x && y 1 si x et y sont vrais 0, sinon i in tab 1 si tab i existe, 0 sinon $1 ~ x 1 si le premier champ contient un x, 0 sinon x == y 1 si x est gal y e a 0,sinon "Bad" " Deal" "Bad Deal"; il 'y a pas d'op rateur explicite e de concat nation e x+y somme de x et de y xy reste de la division de x par y -x oppos de x e j$1 1 si $1 n'est pas z ro ou "" e 0, sinon x^y x^ y ++x, x++ additionne 1 x a $i+1 $i++ valeur du i me champ e additionn de 1 e additionne 1 la valeur a du i me champ e

2.2. LES ACTIONS

51

Op rateurs arithm tiques : Ce sont +,-,, , et ^ qui s'e ectuent uniquement e e sur des nombres. Toutes les op rations arithm tiques sont faites en pr cision maxie e e male. Si une variable sous forme de chaine constitue l'un des membres de l'op rateur, e elle est convertie en sa valeur qui doit ^tre un nombre. e Op rateurs logiques : Les op rateurs && ET, jj OU et j NON sont uitlis s e e e pour cr er des expressions logiques en combinant d'autres expressions. Une exprese sion logique a une valeur de 1 si elle est vraie ou de 0 dans le cas contraire. AWK value les op rations de gauche droite et ne fait pas de travaux super us. e e a Exemple : pour expr1 && expr2, expr2 n'est pas valu si expr1 est faux. e e Expressions de condition : Une expression de condition a la forme : expr1 ? expr2 : expr3 expr1 est valu e; si elle est vraie, c.a.d. non nulle ou non gale "", la valeur de e e e a l'expression est gale la valeur de expr2, sinon la valeur de l'expression est gale e a e a la valeur de l'expression expr3. Op rateurs d'a ectation : Il y a 7 types d'a ectations dont la plus simple est de e la forme variable = expression. Les 6 autres op rateurs d'a ectation sont +=,-=,=, =,= et ^= qui repr sentent e e une simpli cation d'utilisation du premier type d'op rateur d'a ectation pour cere tains cas particuliers. Exemple : age=age-10 peut s' crire plus simplement age-=10 ce qui fait rajeunir. e Op rateurs d'incr mentation et de d cr mentation : l'expression n=n+1 est plus e e e e commod ment repr sent e par n++ ou ++n. La forme pr x e ++n incr mente e e e e e e n avant de d livrer sa valeur alors que la forme post x e n++ incr mente n apr s e e e e avoir d livr sa valeur. e e Exemple:
BEGIN printf" t tParodie de n=0 i=n++; printf" t j'ai ++n j=++i; printf" t j'ai printf" t j'ai d ans la vie n"

d ans et je viens de naitre n",n*10^i d ans et je suis un jeune initie n",n*10^j et je suis parvenu a la sagesse n",j+n*10^n

Parodie de la vie j'ai 1 ans et je viens de naitre j'ai 20 ans et je suis un jeune initie j'ai 300 ans et je suis parvenu a la sagesse

52

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Op rateurs sur les chaines : il n'y a qu'un type d'op rateur sur les chaines : e e la concat nation. Cet op rateur n'est pas explicite; les expressions sont cr es en e e ee crivant des constantes, variables, champs, l ments de tableaux, r sultats de fonce ee e tion ou autres expressions les unes la suite des autres a
print NR ":" $0 1:Would you pay lifes pleasure 2:to see me 3:Does it heart for I want you to remain 4:I run your hair through, in another decade 5:Summerlands holds me in sumerian haze 6:Between the spaces, along the wall 7:appearing faces that disappear at dawn 8:Were getting closer, I can see the door 9:closer and closer 10:Kthulhu calls 11:forever remain, forever remain

Chaines en tant qu'expressions r guli res : Dans beaucoup de nos exemples pr c dents, e e ee le membre de droite de l'op rateur ~ ou !~ tait une expression r guli re entour e e e e e e de slashs. En fait, toute expression peut ^tre utilis e dans le membre de droite de e e ces deux op rateurs. AWK value l'expression, convertit la chaine si n cessaire et e e e interpr te la chaine comme une expression r guli re. e e e Exemple : imprime les lignes o apparaissent les mots see et closer. u
BEGIN a_trouver = "see|closer" $0 ~ a_trouver to see me Were getting closer, I can see the door closer and closer

Une expression r guli re peut ^tre pass e dans une expression de variable et ainsi e e e e peut aussi ^tre concat n e. e e e Exemple : reconnaissance d'un nombre r el e
BEGIN signe=" +- ?" decimal=" 0-9 + . ? 0-9 *" fraction=" . 0-9 +" exposant=" eE " signe " 0-9 +?" nombre="^" signe "" decimal "|" fraction "" exposant "$" $0 ~ nombre

2.2. LES ACTIONS

53

On peut donc construire une expression r guli re entre quotes comme on cone e struit une expression r guli re entre slashs pour les patterns; il y a une seule exe e ception pour les m tacaract res; lorsque l'on veut matcher le m tacaract re sous sa e e e e forme normale, on doit ajouter un extra slash dans la forme quot e : e
$0 ~  +|- 0-9 + $0 ~ " +|- 0-9 +"

54

CHAPTER 2. LE LANGAGE AWK EN DETAIL

La suite donne quelques exemples d'utilisation d'expressions r guli res. Pour e e cela, nous modi ons l g rement le chier " elds" en ins rant en d but et en n de ee e e ligne une s rie quelconque de blancs. Le chier elds a alors cette allure e
Would you pay lifes pleasure to see me Does it heart for I want you to remain I run your hair through, in another decade Summerlands holds me in sumerian haze Between the spaces, along the wall appearing faces that disappear at dawn Were getting closer, I can see the door closer and closer Kthulhu calls forever remain, forever remain

 PATTERNS qui teste si une chaine contient  une substring en utilisant les expressions regulieres. print " Les vers qui contiennent le mot 'see' et qui ne" print " contiennent pas le mot 'I'" $0 ~ see && $0 !~ I print NR ," " ,$0 Les vers qui contiennent le mot "see" et qui ne contiennent pas le mot "I" 2 to see me  Exemples en utilisant des metacaracteres On affiche les vers commencant par une majuscule BEGIN print " Les vers commencant par une majuscule :" $0~ ^ * A-Z  prise en compte des blancs  en debut de ligne Les vers commencant par une majuscule : 1 Would you pay lifes pleasure 3 Does it heart for I want you to remain 4 I run your hair through, in another decade 5 Summerlands holds me in sumerian haze 6 Between the spaces, along the wall 8 Were getting closer, I can see the door 10 Kthulhu calls print NR, " ",$0 BEGIN

2.2. LES ACTIONS


On affiche les vers se terminant par "e" BEGIN print " Les vers se terminant par un $0~ e *$ print NR," ",$0

55

"e " :"

 prise en compte des blancs  en fin de ligne Les vers se terminant par un "e" : 1 Would you pay lifes pleasure 2 to see me 4 I run your hair through, in another decade 5 Summerlands holds me in sumerian haze

On affiche les champs contenant la chaine "ces" BEGIN print " Les champs qui contiennent la chaine $0~ ces for i=1;i =NF;i++ if $i~ ces  print $i " n"

"ces " :"

Les champs qui contiennent la chaine "ces" : spaces, faces

56

CHAPTER 2. LE LANGAGE AWK EN DETAIL

On affiche les lignes ne commencant pas par les lettres B,A,D,b,a,d : BEGIN print "On affiche les lignes ne commencant pas" print "par les lettres B,A,D,b,a,d :" $0 !~ "^ * BAD |^ * bad " print On affiche les lignes ne commencant pas par les lettres B,A,D,b,a,d : Would you pay lifes pleasure to see me I run your hair through, in another decade Summerlands holds me in sumerian haze Were getting closer, I can see the door closer and closer Kthulhu calls forever remain, forever remain

2.2. LES ACTIONS

57

AWK a des fonctions d nies dans son propre langage qui sont les fonctions arithm tiques e e et les fonctions sur les chaines. les fonctions arithm tiques : ces fonctions peuvent ^tre utilis es en tant qu'expression e e e primaire dans toutes les expressions d nies dans cette partie. Elles sont list es dans e e le tableau ci-dessous : VALEUR RETOURNEE cosinus de x, avec x en radians sinus de x, avec x en radians arctangente de y x retourn e dans l'intervalle - et  e racine carr e de x e logarithme n p rien de x e e exponentielle de x partie enti re de x e nombre au hasard r, 0  r 1 x d nit le point de d part dans la g n ration au hasard rand e e e e srand fait d buter le g n rateur selon l'heure e e e atan20,-1 donne . exp1 donne e. le logarithme d cimal se d nit par logx= log10. e e La fonction rand retourne un nombre de pr cision maximale selon un pseudoe hasard. En e et, la fonction srandx d nit partir de x le d but de la g n ration e a e e e au hasard. Si on appelle srand sans param tre, alors la g n ration commencera e e e a partir de l'heure. Si on n'appelle pas srand, rand commencera toujours la m^me a e valeur, chaque fois que le programme est appel . e Exemple : faites tourner deux fois les deux programmes suivants :
BEGIN srand43 x=rand;print x=rand;print x=rand;print x=rand;print BEGIN int100*x int100*x int100*x int100*x srand x=rand;print x=rand;print x=rand;print x=rand;print int100*x int100*x int100*x int100*x

Les Fonctions pr -d nies en AWK e e

FONCTION cosx sinx atan2y,x sqrtx logx expx intx rand srandx

9 4 46 63 9 4 46 63

56 34 19 3 58 38 20 75

58

CHAPTER 2. LE LANGAGE AWK EN DETAIL

les fonctions AWK sur les chaines : AWK permet l'utilisation des fonctions pr d nies e e qui op rent sur les chaines. Ces fonctions sont list es dans le tableau ci-dessous. e e ROLE retourne le nombre de caract re de s e retourne la premi re position de la chaine t dans s e ou 0 si t n'est pas pr sent e matchs,r teste si s contient une substring match e par r e retourne l'index ou 0 valeurs dans RSTART et RLENGTH sprintffmt,list-expr retourne list-expr formatt e selon le format fmt e substrs,p retourne le su xe de s commenant la position p c a substrs,p,n retourne la substring de s de longueur n et commenant la position p c a splits,a clate s dans un tableau a selon le s parateur FS e e retourne le nombre d' l ments du tableau a ee splits,a,fs clate s dans un tableau a suivant le s parateur fs e e retourne le nombre d' l ments du tableau a ee subr,s substitue par s la plus gauche et la plus longue a substring dans $0 match e par r e retourne le nombre de substitutions faites subr,s,t substitue par s la plus gauche et la plus longue a substring dans t match e par r e retourne le nombre de substitutions faites gsubr,s substitue par s toutes les chaines match es par r dans $0 e retourne le nombre de substitutions faites gsubr,s,t substitue par s toutes les chaines match es par r dans t e retourne le nombre de substitutions faites r repr sente une expression r guli re; e e e s et t sont des strings; n et p sont des entiers. - La fonction lengths retourne la longueur de la chaine s en tenant compte des blancs. Exemple :
BEGIN 44 chaine="Tous ces vieux en longs habits print lengthchaine de Cours !?"

FONCTION lengths indexs,t

2.2. LES ACTIONS

59

- La fonction indexs,t retourne la position la plus gauche de la chaine t dans a la chaine s ou 0 si t n'apparait pas. Le premier caract re d'une chaine a la position e 1 et les blancs sont pris en compte. Exemple :
BEGIN 5 x=index"Les nana ben's", "na";print x

- La fonction matchs,r cherche la substring la plus longue et la plus gauche a qui est match e par l'expression r guli re r dans la chaine s. Elle retourne l'index e e e o la substring commence ou 0 si r ne matche rien. Elle impl mente aussi les deux u e variables RSTART la valeur de l'index et RLENGTH la longueur de la substring a a match e. e Exemple :
if match$0, ,  0 printf"la virgule apparait a la ligne d, a la position d n",NR,RSTART

la la la la

virgule virgule virgule virgule

apparait apparait apparait apparait

a a a a

la la la la

ligne ligne ligne ligne

4, a la position 24 6, a la position 19 8, a la position 20 11, a la position 15

- La fonction sprintffmt,expr1; expr2 ; :::; exprn  retourne sans l'imprimer une chaine contenant expr1; expr2; :::; exprn formatt e selon le format d ni par l'expression e e fmt et en se r f rant aux sp ci cations de la fonction "printf". ee e Exemple :
x=sprintf"11s 7s", $1, $2;print x Would you to see Does it I run Summerlands holds Between the appearing faces Were getting closer and Kthulhu calls forever remain,

60

CHAPTER 2. LE LANGAGE AWK EN DETAIL

- La fonction substrs,p retourne le su xe de s qui commence la position p. a Si substrs,p,n est utilis , alors seulement les n premiers caract res sont retourn s. e e e Si le su xe est de longueur inf rieure n, alors tout le su xe est retourn . e a e Exemple : supprime le "s" de "lifes" de la ligne 1 et concat ne le r sultat avec e e d'autres chaines.
NR==1 print substr$4,1,4, "is", $5 life is pleasure

- La fonction splits,a,fs clate la chaine s dans le tableau a selon le s parateur e e fs et retourne le nombre d' l ments ins r s dans le tableau a. Cette fonction sera ee ee mieux d crite dans la partie r serv e aux tableaux. e e e - La fonction subr,s,t cherche d'abord la substring la plus gauche et la plus a longue match e par r dans la chaine cible t; si une substring est trouv e, elle est e e alors substitu e par la string s. Elle retourne le nombre de substitutions e ectu es. e e La fonction subr,s est synonyme de subr,s,$0. La fonction gsubr,s,t est similaire sauf qu'elle e ectue toutes les substitutions sur la chaine t chaque fois qu'elle trouve une substring match e par r. a e Dans la string qui substitue, tout caract re apparait sous sa forme litt rale. e e Exemple :
comparez les deux fonctions sub et gsub : NR 5 sub .ou ,"OU";print OUld you pay lifes pleasure to see me Does it heart for I want OU to remain I run OUr hair through, in another decade NR 5 gsub .ou ,"OU";print OUld OU pay lifes pleasure to see me Does it heart for I want OU to remain I run OUr hair thOUgh, in another decade

2.2. LES ACTIONS


Le programme qui suit recupere les premiers champs des lignes tout en supprimant ceux qui apparaissent deux fois : on concatene tous les premiers champs pour creer une expression reguliere a chaque fois qu'un nouveau champ reapparait. Pour le test, on rajoutera la ligne suivante au fichier "fields" : to escape your body from this Funeral end NR==1 champ="" $1 "" NR!=1 && $1!~champ gsub END print champ

61

 ,"",champ;champ=champ "|" $1 ""

Would|to|Does|Funeral|I|Summerlands|Between|appearing| Were|closer|Kthulhu|forever

62

CHAPTER 2. LE LANGAGE AWK EN DETAIL

La syntaxe des tests et des boucles est la m^me que celle du langage C. e Nous regroupons tous les types d'actions de tests et les boucles dans la liste cidessous :
instruction g groupement d'instructions if expression instruction si expression est vraie, ex cution de instruction e if expression instruction1 else instruction2 si expression est vraie, ex cution de instruction1 e sinon ex cution de instruction2 e while expression instruction tant que expression est vraie, ex cution de instruction e do instruction while expression ex cute une fois instruction; apr s, idem que while e e for expression1; expression2; expression3 instruction quivalent : e a expression1; while expression2 finstruction; expression3g for variable in tableau instruction ex cute instruction avec la valeur de variable e gale chaque indice pris dans un ordre quelconque de tableau e a
f

Les actions de tests et les boucles

break

continue next

sort imm diatement d'une boucle while, for ou do e

force le commencement de la prochaine it ration e dans une boucle while, for ou do force le commencement de la prochaine it ration e dans le programme principal force le programme ex cuter les actions END s'il en existe a e sinon sort du programme retourne expression

exit exit expression

2.2. LES ACTIONS

63

Il y a donc deux instructions qui modi ent le cycle normal des boucles : break et continue. - l'instruction "break" provoque une sortie forc e d'une boucle while, for ou do. e - l'instruction "continue " provoque le commencement de l'it ration suivante : le e programme ex cute alors l'expression de test du while ou du do ou expression3 du e for. Les instructions next et exit controlent le d roulement d'un programme AWK e - l'instruction "next" provoque le passage a la prochaine ligne du programme et l'ex cution du programme reprend la prochaine instruction patternfactiong. e a - dans les actions END, l'instruction "exit" provoque la n du programme. Dans toute autre action, cela cause la n de toute lecture d'entr e et les actions END sont e alors ex cut es. e e

64

CHAPTER 2. LE LANGAGE AWK EN DETAIL

AWK permet la cr ation de tableaux qui n'ont pas besoin d'^tre d clar s et dont le e e e e nombre d' l ments n'a pas besoin d'^tre sp ci . ee e e e On peut ainsi cr er un tableau comme sous n'importe quel type de langage : tableau e de chaines ou de nombres indic par des nombres Ex : x NR = $0. e En fait, les indices d'un tableau sont d nis comme des chaines ce qui constitue e une grande di rence vis vis des langages usuels. On parle alors de TABLEAUX e a ASSOCIATIFS. Ainsi, puisque la valeur des chaines 1 et "1" est la m^me, il revient e au m^me d' crire tab 1 et tab "1" .On remarque par contre que tab 01 est di rent e e e de tab 1 et tab disappear est di rent de tab "disappear" ; dans le premier cas, e l'indice sera la valeur de la variable disappear et comme c'est une constante, les l ments associ s tab disappear seront accumul s dans l' tat disparu tab "" . ee e a e e Exemple : nombre d'occurence des mots commenant par une voyelle minuscule. c tri sur le r sultat. e
for i=1;i =NF;i++ gsub , ,"",$i ++tab $i  suppression de la virgule

Les Tableaux

END

printf"nombre d'occurence des mots n" printf"commencant par une voyelle minuscule n" for mot in tab  if mot~ ^ aeiouy  printf"s:d n",mot,tab mot |"sort" close"sort"

nombre d'occurence des mots commencant par une voyelle minuscule along:1 and:1 another:1 appearing:1 at:1 in:2 it:1 you:2 your:1

2.2. LES ACTIONS

65

Le programme pr c dent utilise une forme de l'instruction "for" qui boucle sur ee tous les indices du tableau : for variable  in tab instructions La boucle ex cute les instructions avec la variable prenant comme valeur chaque e indice du tableau. L'ordre dans lequel les variables prennent les valeurs des indices est al atoire. e Les r sultats sont impr visibles si de nouveaux l ments sont ajout s dans le tableau e e ee e par les instructions. On peut d terminer si un indice apparait dans un tableau ou non par l'expression e indice in tab Cette expression prend la valeur 1 si tab indice existe d j , et 0 sinon. ea Exemple : cherche si "Death" est dans le tableau tab cr pr c demment. ee e e
for i=1;i =NF;i++ gsub , ,"",$i ++tab $i

END if "Death" in tab printf" tO flammes du sommeil sur un visage d'ange n" printf" tEt sur toutes les nuits et sur tous les visages n" else printf" tSilence. Le silence eclatant de ses reves n" printf" tQui enivrent d'ouragans une ame delivree n"

Silence. Le silence eclatant de ses reves Qui enivrent d'ouragans une ame delivree

L'instruction delete d truit un tableau avec la syntaxe : e delete tab indice Exemple :
for i in zombi delete zombi i  le tableau zombi est mort

66

CHAPTER 2. LE LANGAGE AWK EN DETAIL

La fonction split str,tab,fs clate la valeur de la chaine str en champs selon le e s parateur fs et place chacun des champs dans le tableau tab. Le nombre de champs e produits ou le nombre d' l ments de tab est retourn par la fonction. ee e Exemple : clatement de la chaine "cheveux en petard" selon le s parateur e. e e
BEGIN chaine="cheveux en petard" max=splitchaine, tab, "e" for i=1;i =max;i++ print tab i

ch v ux n p tard

On peut aussi cr er des tableaux multidimensionels en AWK qui sont en fait des e simulations utilisant des tableaux une dimension. Bien que l'on puisse utiliser des a indices tels que i,j ou s,p,q,r, awk concat ne les indices en glissant un s parateur e e entre eux pour former un unique indice qui n'a plus rien voir avec l' criture de a e l'utilisateur. L'exemple :
for i=1;i =10;i++ for j=1;j =10;j++ tab i,j =0 1,1 1,2

cr e un tableau de 100 l ments dont les indices ont la forme : e ee


......

En fait, les indices sont stock s comme des chaines qui ont la forme : e
1 SUBSEP 1 1 SUBSEP 2

La valeur de la variable pr -construite SUBSEP est par d faut " e e


if i,j in tab ... for k in tab ...

......

034"

Pour tester si une entit appartient un tableau multidimensionel, on peut crire : e a e Pour r cup rer tous les l ments du tableau, il su t de faire : e e ee

2.2. LES ACTIONS


Exemple : BEGIN for i=1;i =2;i++ for j=1;j =2;j++ tab i,j =i+j for k in tab splitk,x,SUBSEP print "tab " k " =",tab k

67

"

tab " x 1

"," x 2

" =",tab k

tab tab tab tab

11 12 21 22

= = = =

2 3 3 4

tab tab tab tab

1,1 1,2 2,1 2,2

= = = =

2 3 3 4

68

CHAPTER 2. LE LANGAGE AWK EN DETAIL

2.2.2 Cr er une Fonction e

En plus des fonctions pr -d nies, AWK autorise l'utilisateur cr er ses propres e e a e fonctions. Une fonction se d nit de la faon suivante : e c

function nomliste de param tres e


f g

instructions

La forme g n rale d'un programme AWK devient maintenant une s quence de e e e pattern-action suivie des d nitions des fonctions cr s par l'utilisateur. e ee La liste des param tres est une s quence de variables s par es par des virgules; e e e e a l'int rieur du corps de la fonction, ces variables r f rent aux arguments pass s en e ee e param tre lors de l'appel de la fonction. e Le corps de la fonction peut contenir l'instruction return qui retourne la valeur d'une expression qui peut servir dans le niveau sup rieur appelant. L'expression est e optionnelle.

return expression
A l'int rieur d'une fonction, les param tres sont des variables locales; elles ne e e durent que le temps d'ex cution de la fonction et sont ensuite d pil es. Mais e e e toutes les autres variables sont globales; si une variable n'est pas dans la liste des param tres, elle peut r f rencer une variable existant dans le programme appelant e ee a et ainsi on peut en craser son contenu. e

2.2. LES ACTIONS

69

Exemple : valuation a l'aide du programme pr c dent des mots qui apparaissent e ee le plus de fois dans le chier " elds".
for i=1;i =NF;i++ gsub , ,"",$i ++tab $i

END for c in tab maxi=maxtab c ,maxi printf" Mots les plus frequents dans ce dedale obscur n t t "" for c in tab if tab c ==maxi printf"s ", c printf" b " n t C'est la parole des Fields n"

function maxa, b return a b ? a : b

Mots les plus frequents dans ce dedale obscur "the I closer remain" C'est la parole des Fields

70

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Les fonctions print et printf g n rent les sorties sous AWK. "print" est utilis e e e e comme nous l'avons d j vu pour des critures simples alors que "printf" demande ea e un format d' criture que nous d taillons dans cette partie. Les sorties peuvent aussi e e bien ^tre redirig es vers un chier, un pipe que vers le standard output. Nous listons e e dans le tableau qui suit toutes les faons possibles de g n rer des sorties. c e e

2.2.3 Les sorties

crit $0 sur le standard output. e print expression, expression ... crit les expressions s par es par OFS, termin es par ORS. e e e e print expression, expression ... chier crit dans le chier " chier" en l'ouvrant s'il n'existe pas e ou en l' crasant s'il existe d j . e ea print expression, expression ... chier crit a la suite du chier " chier". e print expression, expression ... j commande crit vers l'entr e de commande. e e

print

printfformat,expression, expression ... printfformat,expression, expression ... chier printfformat,expression, expression ... chier printfformat,expression, expression ... j commande close chier, closecommande systemcommande

idem que pour "print" en sp ci ant un format chaque fois. e a cl^ture la connection entre "print" et chier ou commande o fermeture des pipes. ex cute commande; la valeur retourn e est celle de commande. e e

2.2. LES ACTIONS


La fonction "print" a deux formes :
print expr1, expr2, ... , exprn printexpr1, expr2, ... , exprn

71

qui ont le m^me r^le : criture de chaque expression s par e par le s parateur de e o e e e e champ de sortie OFS : output eld separator et suivie du s parateur d'enregistrement e de sortie ORS : output record separator. L'instruction print est quivalente print $0 : elle crit l'enregistrement $0 en e a e sortie. L'instruction print "" crit une ligne blanche en sortie. e Les s parateurs de sortie : e Il existe deux s parateurs de sortie : OFS qui d nit le s parateur entre chaque e e e champ et ORS qui d nit le s parateur apr s un enregistrement un enregistrement e e e tant une ligne de champs. e Exemple :
BEGIN FS="faces" OFS=", " ORS=" nThat's the last exit for the lost .......... n" max=split$1,T21," " gsub ing ,"ed",T21 1  gsub"^a","A",T21 1  print "The seven keys"," nIn front of my " FS ," n" T21 1 The seven keys, In front of my faces, Appeared. That's the last exit for the lost ..........

$0 ~ FS

"."

La fonction "printf" est similaire celle du langage C. De m^me que "print", il y a e a deux formes d' criture de son expression : e
printf format, expr1, expr2, ... , exprn printfformat, expr1, expr2, ... , exprn

Le format est une expression qui contient la fois du texte normal et des sp ci cations a e sur le format de sortie des expressions pass es en arguments la fonction "printf". e a

72

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Chaque sp ci cation commence par un , se termine par un caract re qui e e d termine la conversion requise et peut inclure trois autres modi cateurs : e
largeur .nombre justifie a gauche l'expression. determine l'emplacement en nombre de cases ou sera placee la chaine ou le nombre. taille maximale de la chaine ou nombre de chiffres apres la virgule.

Nous donnons dans les tableaux qui suivent la liste des caract res qui interviennent e dans l' criture des formats et des exemples de leur utilisation. e CARACTERE c d e f g o s x 
c d 5d e f 7.2f g .6g o 06o x |s| |10s| |-10s| |.3s| |10.3s| |-10.3s| 

FORMAT D'ECRITURE caract re ASCII e partie enti re d'un nombre e - d.ddddddE +- dd - ddd.dddddd e ou f selon ce qui est le plus court; supprime les z ros en trop e nombre octal non sign e chaine nombre hexad cimal non sign e e crit un , aucun argument n' tant utilis . e e e
97 97.5 97.5 97.5 97.5 97.5 97.5 97.5 97 97 97 Death Death Death DEATH DEATH DEATH Death a 97 97 9.750000e+01 97.500000 97.50 97.5 97.5 141 000141 61 |Death| | Death| |Death | |DEA| | DEA| |DEA | 

FORMAT : fmt EXPRESSION : $1 printffmt, $1

2.2. LES ACTIONS


Les redirections dans les chiers s'e ectuent par les op rateurs et e Exemple :
BEGIN printf" t t "THE FIELDS OF THE NEPHILIM " n" printf" t t -------------------------- n n" "newfields" "newfields"

73 .

printf" * -43s * n", $0 "newfields" END printf" n t tLast song of "The Nephilim " n" "newfields" printf" t t--------------------------- n n" "newfields"

Resultat dans le fichier "newfields" "THE FIELDS OF THE NEPHILIM" -------------------------* * * * * * * * * * * Would you pay lifes pleasure to see me Does it heart for I want you to remain I run your hair through, in another decade Summerlands holds me in sumerian haze Between the spaces, along the wall appearing faces that disappear at dawn Were getting closer, I can see the door closer and closer Kthulhu calls forever remain, forever remain Last song of "The Nephilim" --------------------------* * * * * * * * * * *

On peut crire dans deux chiers la fois; on peut lire et crire dans deux chiers e a e di rents mais on ne peut crire et lire dans un m^me chier. e e e Exemple : print $1, $2 $3 Lors de la lecture du chier d'entr e, le premier e champ de chaque enregistrement est crit sur le standard output et le deuxi me e e champ est crit dans le chier dont le nom est la valeur du troisi me champ. e e

74

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Les sorties dans les pipes sont possibles uniquement si le syst me supporte les e pipes. L'instruction :
print | "commande"

redirige la sortie de "print" vers l'entr e du pipe associ e a "commande ". Les pipes e e sont similaires a ceux employ s sous Shell. La commande est mise sous quotes. e Exemple :
$1 ~ ai|os $NF ~ ai|os REMAIN CLOSER CLOSER REMAIN print $1 | "tr a-z print $NF | "tr a-z A-Z " A-Z "

Il est n cessaire de fermer les pipes ou les chiers que l'on a ouvert en lecture e ou en criture si on veut nouveau s'en servir dans le m^me programme ou dans e a e un programme di rent. Dans l'exemple pr c dent, on doit fermer le pipe de la e ee commande par :
close"tr a-z A-Z "

Si on veut crire dans un chier apr s l'avoir lu dans un programme, il est n cessaire e e e de fermer le chier en lecture par :
close"fichier"

Nous verrons quelques exemples dans la partie Int raction avec d'autres programmes. e

2.2. LES ACTIONS

75

2.2.4 Les entr es e

Il y a plusieurs faons d'invoquer des entr es vers un programme AWK. La plus c e courante est celle que nous avons employ e tout au d but du chapitre 1, c.a.d. e e utiliser "awk" en tant que commande UNIX ; s'il n'y a pas de chier en entr e, le e standard input est pris par d faut. e
awk 'programme' fichier_entree ou arguments awk 'programme' standard input

En tant que commande UNIX, l'entr e peut aussi ^tre un pipe. e e


Exemple : la commande "grep" recupere une ligne du fichier "fields" et un message s'affiche alors a l'ecran. grep 'forever' fields | awk ' print "Death will come" print "To cover all your sad wishes" $NF="in your faces" print $0 ' Death will come To cover all your sad wishes forever remain, forever in your faces

Les s parateurs sur l'entr e : e e Il y a deux s parateurs d'entr e comme il y a deux s parateurs de sortie : FS Field e e e Separator quivalent a OFS le s parateur de champs et RS Record Separator e e quivalent a ORS le s parateur d'enregistrements qui en g n ral est " n", aussi les e e e e termes de lignes et d'enregistrement sont synonymes. FS qui par d faut vaut " " peut ^tre modi en une expression r guli re toujours e e e e e mise entre quotes. Alors, la substring non nulle la plus gauche et la plus longue a match e par l'expression r guli re deviendra le s parateur de champ dans la ligne e e e e courante. A chaque fois que l'expression r guli re matche une substring, NF est e e increment et la substring devient la chaine nulle "". A chaque enregistrement, NF e est r initialis 1. e ea
Exemple : FS est initialise a "a" ou a la virgule suivi d'une suite de blancs BEGIN FS=", *|a" for i=1;i =NF;i++ printf"s ", $i printf"d n",NF Would you p y lifes ple sure 3 to see me 1 Does it he rt for I w nt you to rem in 4 I run your h ir through in nother dec de 5

76

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Summerl nds holds me in sumeri n h ze 4 Between the sp ces long the w ll 5 ppe ring f ces th t dis ppe r t d wn 9 Were getting closer I c n see the door 3 closer nd closer 2 Kthulhu c lls 2 forever rem in forever rem in 4

FS peut aussi ^tre modi directement dans la ligne de commande en ajoutant e e l'option -F. Sur l'exemple pr c dent, on peut donc ex cuter le programme contenu ee e de le chier " chierprog" en ayant pr alablement supprim l'action BEGIN : e e
Le fichierprog se presente donc maintenant comme : for i=1;i =NF;i++ printf"s ", $i printf"d n",NF Commande de lancement du programme : awk -F', *|a' -f fichierprog fields

Remarque : les di rentes versions de awk ne pr voient pas l'utilisation d'une e e expression r guli re apr s l'option -F; souvent il est seulement possible d' crire un e e e e seul caract re entre quotes apr s l'option -F Ex : -F'a' place FS="a". e e RS d nit la s paration entre chaque enregistrement et vaut par d faut " n" quivalant e e e e donc une ligne. Si on veut faire des enregistrements de plusieurs lignes, on peut a l'initialiser "" et par exemple d nir la ligne compl te comme un champ en prenant a e e FS=" n".

2.2. LES ACTIONS

77

La fonction getline : La fonction "getline " peut ^tre utilis e pour lire des enregistrements en entr e. Elle e e e cherche l'enregistrement suivant et remet a jour les di rentes valeurs de NR, NF e et FNR d pendant de l'enregistrement lu et du programme. Elle retourne 1 si un e enregistrement est e ectivement pr sent, 0 si la n de chier est rencontr e ou -1 si e e une erreur se produit. Nous explicitons dans le tableau suivant les possibilit s d'occurrence de la fonction e getline et leur signi cation : EXPRESSION SIGNIFICATION getline lit sur le standard input et remplit les variables $0,NR,NF et FNR getline variable lit l'enregistrement sur le standard input et le met dans variable tout en remettant a jour NR et FNR getline " chier" lit l'enregistrement suivant dans " chier" et le met dans $0 tout en remplissant NF getline variable " chier" lit l'enregistrement suivant dans " chier" et le met dans variable commande | getline lit la sortie de commande et le place dans $0 tout en remettant jour la valeur de NF a commande | getline variable lit la sortie de commande et le place dans variable L'expression getline "fichier" lit partir du chier " chier" la ligne courante a plut^t qu' partir du standard input. L'expression ne modi e pas NR et FNR mais o a installe la nouvelle valeur de NF. L'expression getline x "fichier" lit partir du chier " chier" le prochain enrega istrement et le place dans la variable x . L'expression ne modi e pas NF, NR et FNR. Exemple : quand on rencontre l'expression include "fields" dans un programme, on decide de remplacer include "fields" par le contenu du chier "fields".

78

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Le fichier programme "fichierprog" se presente de la facon suivante : ^include gsub " ,"",$2 while getline x $2 0 print x next print Le fichier "f" se presente de la facon suivante : include "fields" a world without end where no soul can descend there will be no sumertime how lost lifes been afraid of waking up so afraid to take the dream shapes of angels the night casts lie dead but dreaming in my past and their here they want to meet you they want to play with you so take the dream can't break free and I hear them call they want to plange you their here once more they want to take you to the shame of your past take the dream take me lead me far away take me there I'll fade away but I can't hide. On lance la commande awk -f fichierprog f et on obtient : Would you pay lifes pleasure to see me Does it heart for I want you to remain I run your hair through, in another decade Summerlands holds me in sumerian haze Between the spaces, along the wall appearing faces that disappear at dawn Were getting closer, I can see the door closer and closer Kthulhu calls forever remain, forever remain a world without end where no soul can descend there will be no sumertime how lost lifes been afraid of waking up so afraid to take the dream shapes of angels the night casts lie dead but dreaming in my past and their here they want to meet you they want to play with you so take the dream can't break free and I hear them call they want to plange you their here once more they want to take you to the shame of your past take the dream take me lead me far away take me there I'll fade away but I can't hide.

2.2. LES ACTIONS

79

L'exemple qui suit ex cute la commande UNIX "who" et pipe le r sultat vers e e getline. Chaque it ration du while lit une ligne de la liste des utilisateurs logg s et e e place la ligne dans la variable d. Puisque NF n'est pas modi , pour r cup rer le e e e nom des utilisateurs, nous sommes oblig s d' clater la ligne contenue dans la variable e e d selon le s parateur de champ habituel FS. Nous avons alors le nom de l'utilisateur e dans le premier l ment du tableau ainsi cr par l' clatement de d. Ce programme ee ee e se lance par la commande awk -f fichierprog
BEGIN while "who" | getline d splitd,a if a 1 ~ fredo  gsub f ,"F",a 1  printf" ts, Bozo et sa Basse n", a 1 

Fredo, Bozo et sa Basse

Voyez la di rence avec le programme suivant o nous n'utilisons plus la variable d; e u NF est cette fois remis jour. a
BEGIN while "who" | getline if $1~ fredo  gsub f ,"F",$1 printf" ts, Caro et ses gros lolos n", $1

Fredo, Caro et ses gros lolos

Remarque : dans tous les cas o "getline " est utilis e, il se peut qu'une erreur se prou e duise si le chier a acc der n'existe pas. Ainsi crire while getline "fichier" ... e e peut ^tre dangereux et peut tourner en rond ind niment si le chier " chier" e e n'existe pas. Nous conseillons d'utiliser while getline "fichier" 0 qui teste si aucune erreur se produit dans la lecture du chier.

80

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Les variables dans la ligne de commande : Comme nous l'avons d j vu, une ligne de commande AWK peut avoir plusieurs ea formes :
awk awk awk awk 'programme' f1 -f fichierprog -F'separateur' -F'separateur' f2 ... f1 f2 ... 'programme' f1 f2 ... -f fichierprog f1 f2 ...

Dans ces lignes de commande, f1, f2 ... repr sentent des arguments qui sont nore malement des chiers. Les arguments dans la ligne de commande : Les arguments d'une ligne de commande AWK sont accessibles via le tableau ARGV. La valeur de la variable ARGC est gale au nombre d'arguments plus un. e Ecrivant la ligne de commande :
awk -f fichierprog b bog=roumain d

ARGC a la valeur 4, ARGV 0 contient awk, ARGV 1 contient b, ARGV 2 contient bog=roumain et ARGV 3 contient d. ARGC est gal au nombre d'arguments plus e un car le nom de la commande awk est l'argument z ro. e
Exemple : awk -F'a' '$2=="ppe" print; print "ARGC=" ARGC; for i=0;i =ARGC-1;i++ print "ARGV " i " =" ARGV i ' fields appearing faces that disappear at dawn ARGC=2 ARGV 0 =awk --- les options et le programme ne sont pas prises en compte ARGV 1 =fields

Les arguments pass s dans la ligne de commande peuvent ^tre utilis s en tant que e e e variable uniquement dans les actions BEGIN, sinon ils sont trait s comme des noms e de chier et chaque argument est pass dans la variable FILENAME dont le contenu e est mis en entr e du programme. e Exemple : On place le programme qui suit dans " chierprog" et on le lance en passant deux fois le chier " elds" en entre . On utilise aussi le chier "f" pr c demment e ee cr . ee

2.2. LES ACTIONS


BEGIN print "Actions BEGIN :" print "ARGC=" ARGC for i=0;i =ARGC-1;i++ print "ARGV " i " =" ARGV i print "FILENAME=" FILENAME FILENAME="f" print "FILENAME=" FILENAME print " nActions sur les arguments en tant que fichier :" print "FILENAME reprend la valeur de ARGV 1 "

81

$0~ ^a END

print "FILENAME=" FILENAME;print

print " nActions END :" FILENAME="f" print "FILENAME=" FILENAME while getline "f" 0 if $0~ ^a  print Actions BEGIN : ARGC=3 ARGV 0 =awk ARGV 1 =fields ARGV 2 =fields FILENAME=fields FILENAME=f Actions sur les arguments en tant que fichier : FILENAME reprend la valeur de ARGV 1 FILENAME=fields appearing faces that disappear at dawn FILENAME=fields appearing faces that disappear at dawn Actions END : FILENAME=f a world without end where no soul can descend and I hear them call they want to plange you their here once more

82

CHAPTER 2. LE LANGAGE AWK EN DETAIL

2.2.5 Les Int ractions avec les autres programmes e


Exemple : On prend les deux chiers suivants :
FICHIER1 : Je suis le fichier 1 FICHIER2 : Je suis le fichier 2

La fonction AWK system expression ex cute la valeur de la chaine expression e prise comme commande. La valeur retourn e est celle de la commande ex cut e. e e e

Le programme qui suit int ragit avec la commande UNIX "cat" e


BEGIN while 1 printf" tFichier a lire n" printf" tQuitter : Q n" Reponse=convert print Reponse if Reponse!="Q" system"cat " Reponse else exit

function convert  getline chaine gsub ' ," '",chaine "echo "chaine" | tr ' a-z *' ' A-Z *'" | getline CHAINE return CHAINE

La fonction "convert" convertit tous les caract res en majuscules. e

2.2. LES ACTIONS


Ex cution : e
awk -f fichierprog Fichier a lire Quitter : Q fichier1 FICHIER1 Je suis le fichier 1 Fichier a lire Quitter : Q fichier2 FICHIER2 Je suis le fichier 2 Fichier a lire Quitter : Q fichier1 FICHIER2 Je suis le fichier 2

83

Attention, nous avons oubli de fermer le pipe de e Il est necessaire de le fermer par l'instruction : La fonction convert devient :

"echo "chaine" | tr ' a-z *' ' A-Z *'"

close"echo "chaine" | tr ' a-z *' ' A-Z *'"

function convert  getline chaine gsub ' ," '",chaine "echo "chaine" | tr ' a-z *' ' A-Z *'" | getline CHAINE close"echo "chaine" | tr ' a-z *' ' A-Z *'" return CHAINE

84

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Nous pouvons r aliser une commande Shell partir d'un programme AWK. Dans e a la plupart de nos exemples, nous avons utilis l'option -f ou nous avons plac le proe e gramme ex cuter entre quotes : awk ' print $1 ' ... a e Pour r duire le nombre d'instruction taper, nous pouvons mettre la ligne de come a mande et le programme dans un chier ex cutable que l'on invoquera en tapant e uniquement le nom du chier.
awk ' print $1 ' $* chmod +x champ1 champ1 est place dans le fichier "champ1" pour rendre "champ1" executable execute le programme sur la liste des fichiers

liste de fichiers

Supposons maintenant que l'on veuille cr er une commande champ qui crit une e e combinaison arbitraire de champs sur chacun des chiers en entr es : e
champ 2 5 7 ... fichier1 fichier2 ... qui ecrirait les 2eme, 5eme et 7eme champs de chaque enregistrement, pour chaque fichier en entree.

Comment reconnaitre les num ros de champ des chiers ? On peut le faire gr^ce e a a la variable ARGV :
awk ' BEGIN for i=1;ARGV i ~ ^ 0-9 +$ ;i++ champ ++nf =ARGV i ARGV i ="" if i =ARGC ARGV ARGC++ = "-"  pas de noms de fichier  donc force stdin .

for i=1;i =nf;i++ printf"ss", $champ i , i ' $*

nf ? " " : " n"

2.2. LES ACTIONS


champ 2 4 6 fields f you lifes see it for want run hair in holds in haze the along wall faces disappear dawn getting I see and calls remain, remain world end no will no how afraid take dream dreaming my and want play you I them they want take to the take lead fade but can't

85

86

CHAPTER 2. LE LANGAGE AWK EN DETAIL

Chapter 3 Applications

87

88

CHAPTER 3. APPLICATIONS

89 Ce chapitre contient quelques exemples d'applications en AWK et comment on peut utiliser le langage AWK. Les programmes sont des r sultats d' tudes prolong es e e e men es sur la nature qui nous environne. e AWK peut jouer un r^le non n gligeable dans plusieurs domaines tels que : o e Validation, transformation, traitement de donn es e Gestion de base de donn es e G n ration de texte, mise des formats sp ciaux e e a e Compilation, Interpr tation, Transformation de langages e Exp rimentation sur des algorithmes e ........

90

CHAPTER 3. APPLICATIONS

3.1 Base de donn es e


3.1.1 Introduction
Cette partie montre comment AWK peut ^tre utilis pour extraire des renseignee e ments et g n rer des r sultats a partir de donn es stock es dans des chiers. e e e e e Une certaine structure de donn es a t choisie dans notre exemple mais il est clair e ee que la technique peut ^tre appliqu e n'importe quelle structure partir du moment e e a a o elle est bien sp ci e et o elle ne varie pas al atoirement. u e e u e

Nous avons choisi un exemple r el d'interrogation d'une base de donn es qui pourrait e e ^tre pr sente dans n'importe quelle discoth que. Elle regroupe par style de musique, e e e les groupes, les titres des albums, le nombre de disques selon le type cassette, CD ou disque vinyl pr sent dans le magasin et les prix associ s. e e Le chier se pr sentera alors de la faon suivante : e c
STYLE : COLD THE FIELDS OF THE NEPHILIM THE NEPHILIM: ELIZIUM: DAWNRAZOR CD=568; K7=54: VINYL=21: K7=1365 87; 67: 34: 72 GROUPE : ALBUM : SUPPORT: PRIX : ...

3.1.2 Sp ci cations e

On classe dans la section SUPPORT la disponibilit pr sente en magasin par type : e e cassette, CD, disque vinyl et lorsqu'il n'y a plus de disque dans un certain type, le nombre et le prix seront ignor s : e
Exemple : Dans le cas precedent, la disponibilite pour chaque THE NEPHILIM : CD ---568 au prix de 87 K7 ---54 au prix de 67 ELIZIUM : VINYL ---21 au prix de 34 DAWNRAZOR : K7 ---- 1365 au prix de 72 album F par F par F par F par est de : unite unite unite unite

On e ectue une interrogation par style de musique liste de tous les groupes avec les renseignements associ s dans le style de musique demand , par groupe liste de e e tous les albums pr sents dans la base, le nombre disponible et leur prix et par titre e d'album prix, disponibilit , groupe et style : e
--------Style de musique Groupe Titre d'album Quitter

3.1. BASE DE DONNEES

91

Tant que le choix Quitter n'est pas choisie, le programme bouclera et chaque r sultat d'interrogation sera la fois a ch sur la sortie standard et mis dans un e a e chier "out.data" o tous les r sultats seront m moris s. u e e e Nous permettons aussi la modi cation de la base de donn es. e

Le chier de donn es est denomm musique. Nous avons choisi une structure de e e donn es avec les particularit s suivantes : e e - Tous les caract res doivent ^tre en majuscule. e e - Le champ s parateur entre les l ments virtuels est ": " e ee qui est initialis en d but de programme. e e - Le champ de d tection du style de musique est "". e - Le champ "; " est un sous-champ de d tection a l'int rieur e e d'un l ment virtuel qui permet de distinguer le type ee de support et le prix qui lui est associ . e Il se pr sente comme suit : e
* STYLE : COLD THE CURE BOYS DON'T CRY: SEVENTEEN SECONDS: PORNOGRAPHY: FAITH CD=23; VINYL=485; K7=354: VINYL=29; K7=45: K7=384: CD=543; K7=453 102; 46; 87: 34; 74: 70: 103; 75 THE FIELDS OF THE NEPHILIM THE NEPHILIM: ELIZIUM: DAWNRAZOR CD=568; K7=54: VINYL=21: K7=1365 87; 67: 34: 72 JOY DIVISION STILL: TO THE CENTER VINYL=365: CD=1356; VINYL=132; K7=827 43: 100; 65; 43 BAUHAUS BELLALUGO IS DEAD CD=5439; K7=324 74; 62

3.1.3 Le chier de donn es e

GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX :

GROUPE : THE SISTERS OF MERCY ALBUM : MARIAN: TEMPLE OF LOVE SUPPORT: CD=3565; VINYL=2356; K7=543: CD=453; VINYL=2341; K7=3545

92
PRIX : 86; 41; 72: 78; 43; 69 THIS MORTAIL COIL DEATH SHALL COME CD=654 83 DEAD CAN DANCE THIS NIGHT CD=654; K7=5643 92; 74 THE MISSION CARVENDISH CD=743; VINYL=764 84; 34 HARD GUN'S N WELCOME CD=653; 93; 31:

CHAPTER 3. APPLICATIONS

GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : * STYLE : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX :

ROSES TO THE JUNGLE: DON'T CRY VINYL=765: CD=931; VINYL=126; K7=43211 85; 29; 58

WHITE LION I DREAM OF YOU VINYL=439; K7=5742 42; 65 AC DC TOUCH TOO MUCH: FOR THOSE ABOUT TO ROCK: BACK IN BLACK CD=568; K7=54: VINYL=21: K7=1365 87; 67: 34: 72 TRUST MARCHE OU CREVE: MISSIONNAIRE: BON SCOTT CD=578; K7=84: VINYL=51: K7=7365 87; 62: 33: 76 TELEPHONE LA BOMBE HUMAINE: ARGENT TROP CHER CD=541; VINYL=877: CD=2346; VINYL=2346; K7=133 93; 31: 85; 29; 58

3.1. BASE DE DONNEES


GROUPE : ALBUM : SUPPORT: PRIX : * STYLE SCORPIONS I'M STILL LOVING YOU VINYL=432; K7=371 42; 65

93

: TECHNO FRONT 242 CRAZY VINYL=432; K7=371 42; 65 ALIEN SEX FIEND SEX IS BEAUTIFUL CD=5439; K7=324 74; 62

GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : * STYLE

: ROCK NEW MODEL ARMY IMPURITY: I'M PRIED OF YOU CD=3545; K7=466: VINYL=768; K7=254 86; 63: 31; 43 ALAN PARSON PROJECT EYE IN THE SKY: STEREOTOMY CD=3545; K7=466: VINYL=768; K7=254 86; 63: 31; 43

GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : GROUPE : ALBUM : SUPPORT: PRIX : *

PINK FLOYD THE WALL: THE DARK SIDE OF THE MOON: OBSCURED BY CLOUDS: ANIMALS: RELIC S CD=543; K7=543: VINYL=54; K7=320: CD=346; VINYL=3545: K7=32: CD=3456; K7 91; 62: 31; 68: 79; 39: 67: 68; 58: 81: 37; 52: 74: 41; 58: 62 BARCLAY JAMES HARVEST VICTIMS OF CIRCUMSTANCE CD=5439; K7=324 74; 62

94

CHAPTER 3. APPLICATIONS

3.1.4 Programme
BEGIN FS=" : " while Reponse !~

Ce programme fonctionne exclusivement sur un syst me tel que UNIX et montre e aussi ses limites. Le programme fnac est le suivant :
^ *Q *$  && decision !~ ^ *Q *$ 

printf" n tRecherche ou Mise a jour printf" t QUITTER getline decision if decision ~ ^ *R *$ 

----- R , M n" ----- Q n"

system"rm out.data" Reponse="" while Reponse !~ ^ *Q *$  && Reponse !~ printf" n n" printf" tRecherche printf" t printf" t printf" tRevenir a printf" t getline Reponse if Reponse ~ if Reponse ~ if Reponse ~

^ *P *$ 

par groupe par album par style de musique l'etat precedent QUITTER

---------------------

1 2 3 P Q

n" n" n n" n n" n"

^ *1 *$  groupe ^ *3 *$  style ^ *2 *$  album

close"out.data" print " tVotre choix se trouvent aussi dans le fichier else if decision ~ ^ *M *$ 

"out.data " n"

print " tVous allez modifier sous l'editeur "vi " d'UNIX la base" print " tMais ATTENTION a respecter la syntaxe." print " t Maintenant taper V n" getline vi if vi ~ ^ *V *$  system"vi musique"

function groupe

3.1. BASE DE DONNEES


printf"Nom du groupe? t" G=convert trouve=0 while getline "musique" 0 && trouve==0 if $1 ~ GROUPE && $2==G trouve=1 affichage if trouve==0 printf" n tLe groupe ne se trouve pas dans la base n n" close"musique" returntrouve

95

function style printf"Style de musique? t" ST=convert trouve=0 while getline "musique" 0 && trouve==0 if $1 ~ STYLE && $2==ST trouve=1 getline "musique" while $1!="*" getline "musique" affichage

if trouve==0 printf" n tCe style de musique n'existe pas n n" close"musique" return

function album printf"Titre de l'album recherche? t" A=convert trouve=0 while getline "musique" 0 && trouve==0

96
if $1 ~ if $1 ~ if $1 ~ STYLE  sty=$2 GROUPE  gr=$2 ALBUM 

CHAPTER 3. APPLICATIONS

i=2 while i =NF && trouve==0 if $i==A trouve=1 else i++

if trouve==0 printf" n tL'album n'est pas dans la base n n" else ind_cd = ind_v =ind_k7 = 0 decode_sup decode_prix printf" n tAlbum recherche : s n",A "o.data" printf" n tNom du groupe : s n",gr "o.data" printf" tStyle de musique : s n n",sty "o.data" printf" tLe nombre de CD disponibles : d au prix : d FF n",nb_cd ,prix ind_cd  "o.data" printf" tLe nombre de VINYL disponibles : d au prix : d FF n", nb_v,prix ind_v  "o.data" printf" tLe nombre de K7 disponibles : d au prix : d FF n",nb_k7 ,prix ind_k7  "o.data" print "********************************************************" "o.data" close"o.data" system"cat o.data" system"cat o.data out.data" system"rm o.data" close"musique" return

function affichage  if $1 ~ GROUPE 

printf" n tNom du groupe : s n",$2 "o.data" getline "musique" printf" tTitre des albums : n" "o.data"

3.1. BASE DE DONNEES

97

for i=2;i =NF;i++ printf" t t s n",$i "o.data" getline "musique" print "*********************************************************" "o.data" close"o.data" system"cat o.data" system"cat o.data out.data" system"rm o.data" print " n" return

function convert getline chaine gsub ' ," '",chaine "echo "chaine" | tr ' a-z *' ' A-Z *'" | getline C close"echo "chaine" | tr ' a-z *' ' A-Z *'" returnC

function decode_sup nb_cd = nb_v = nb_k7 = 0 split$i,sup,"; " for j in sup splitsup if nb 1 if nb 1 if nb 1 return j ,nb,"=" ~ CD  nb_cd = nb 2 ; ind_cd = j ~ VINYL  nb_v = nb 2 ; ind_v = j ~ K7  nb_k7 = nb 2 ; ind_k7 = j

function decode_prix getline "musique" split$i,prix,"; " returnprix

98

CHAPTER 3. APPLICATIONS

Le programme utilise la plupart des pouvoirs du langage AWK sur la gestion d'un chier de donn es. On y rencontre explicitement l'utilisation : e

1. des expressions r guli res par exemple dans l'acquisition des r ponses donn es e e e e
champs avec la fonction split.

par l'utilisateur sous toute leur forme : majuscule ou minuscule, s par es par e e des blancs.

2 . des fonctions pr -d nies AWK par exemple dans la construction des souse e
vertit toute chaine de caract res en majuscule tout en supprimant les blancs e et qui renvoie la chaine ainsi modi e. e 4 . la majorit des entr es-sorties en AWK : la fonction getline lisant le standard e e input acquisition de donn es de l'utilisateur ou le chier musique acc s e e a la base de donn es, les pipes, les fonctions print et printf redirig es vers un e e chier o.data ou out.data ou vers le standard output et en y associant la fonction close . fonction getline pour viter de construire des fonctions existant d j dans le e ea syst me UNIX. e Nous donnons un exemple d'ex cution du programme la page suivante. e a Nous lanons le programme par awk -f fnac c

3 . des fonctions cr es par l'utilisateur par exemple la fonction convert  qui conee

5 . des fonctions UNIX par la fonction system  ou directement en entr e de la e

3.1. BASE DE DONNEES


Recherche ou Mise a jour QUITTER R Recherche par groupe par album par style de musique Revenir a l'etat precedent QUITTER 1 Nom du groupe? The Cure --------------------1 2 3 P Q --------R , M Q

99

Nom du groupe : THE CURE Titre des albums : BOYS DON'T CRY SEVENTEEN SECONDS PORNOGRAPHY FAITH ********************************************************* Recherche par groupe par album par style de musique Revenir a l'etat precedent QUITTER 2 Titre de l'album recherche? Album recherche : DON'T CRY Nom du groupe : GUN'S N ROSES Style de musique : HARD Le nombre de CD disponibles : 931 au prix : 85 FF Le nombre de VINYL disponibles : 126 au prix : 29 FF Le nombre de K7 disponibles : 43211 au prix : 58 FF ******************************************************** Don't cry --------------------1 2 3 P Q

100
Recherche par groupe par album par style de musique Revenir a l'etat precedent QUITTER P

CHAPTER 3. APPLICATIONS
--------------------1 2 3 P Q

Votre choix se trouvent aussi dans le fichier "out.data"

Recherche ou Mise a jour QUITTER M

---------

R , M Q

Vous allez modifier sous l'editeur "vi" d'UNIX la base Mais ATTENTION a respecter la syntaxe. Maintenant taper V V ------MODIFICATIONS.........

3.2. DES MINI-LANGAGES

101

3.2 Des mini-langages


3.2.1 Introduction
AWK est souvent utilis pour d velopper des interpr teurs, des assembleurs et autres e e e exp rimentations sur la syntaxe ou la s mantique de mini-langages, c.a.d. des lane e gages destin s des applications sp ci ques. e a e Nous avons choisi dans cet exemple de g n rer un calculateur. e e

3.2.2 Sp ci cations e
expr ----

Les expressions arithm tiques avec les op rateurs +,-, et peuvent ^tre d crites e e e e par la grammaire :
terme expr + terme expr - terme fact terme * fact terme fact nombre  expr 

terme ----

fact ----

Nous pouvons alors crire des expressions du type 1 + 2  3 qui seront analys es de e e la faon suivante : c
1 + 2 * 3 -- nombre -- fact -- terme -- expr -------------------------------------------------- expr -- nombre -- fact -- terme -------------------------------- terme ------ nombre -- fact ------------

Pour r aliser le calculateur, nous avons besoin d'un "Parser" pour les expressions. e On crit une fonction pour chaque l ment non terminal de la grammaire expr pour e ee expr, terme pour terme et fact pour fact.

102

CHAPTER 3. APPLICATIONS

3.2.3 Programme
BEGIN print " tProgramme de la calculatrice" print " tLaissez un blanc entre les operateurs et les operandes. n" print " tPour QUITTER ------------------------ CTRL C n" NF 0 f = 1 e = expr if f = NF printf"erreur en s n",$f else printf" t.8g n",e +terme

function expr e  terme | terme e = terme while $f == "+" || $f == "-" e = $f++ == "+" ? e + terme : e - terme return e function terme e  fact | fact e = fact while $f == "*" || $f == " " || $f == "^" if $f++ == "*" e = e * fact else if $f-1 == " " e = e fact else e = e ^ fact return e

* ^

fact

function fact e  chiffre | expr if $f ~ ^ +- ? 0-9 + . ? 0-9 *| . 0-9 +$  return $f++ else if $f == "" f++ e = expr if $f++ != "" print"erreur : on atendt  en s n",$f return e else printf"erreur : on attend un numero ou  en s n",$f return 0

3.2. DES MINI-LANGAGES

103

Contents
1 Les principes essentiels de AWK
1.1 Introduction et d nitions : : : : : : : : : : : : : : : : : : : : : : : : e 1.1.1 structure d'un chier de donn es : : : : : : : : : : : : : : : : e 1.1.2 ex cution d'un programme AWK : : : : : : : : : : : : : : : : e 1.1.3 structure d'un programme AWK : : : : : : : : : : : : : : : : : 1.1.4 quelques exemples : : : : : : : : : : : : : : : : : : : : : : : : 1.2 D buter avec AWK : les fonctions et les variables usuelles : : : : : : : e 1.2.1 aucune d claration de variable et de type : : : : : : : : : : : : e 1.2.2 la s lection par les Patterns : le "Matching" : : : : : : : : : e 1.2.3 la programmation par les actions : les tests et les boucles : : : 1.2.4 les op rations AWK sur les chaines de caract res : : : : : : : : e e 1.2.5 les tableaux - la notion de tableaux associatifs : : : : : : : : : 1.2.6 cr er une fonction par "function" : : : : : : : : : : : : : : : e 1.2.7 les entr es : la fonction "getline " : : : : : : : : : : : : : : : e 1.2.8 les sorties et les int ractions avec d'autres programmes : la e fonction "system" : : : : : : : : : : : : : : : : : : : : : : : : 2.1 Les patterns : : : : : : : : : : : : : : : : : : : : : : 2.1.1 BEGIN et END : : : : : : : : : : : : : : : : 2.1.2 Les expressions : : : : : : : : : : : : : : : : 2.1.3 Les patterns sp ci ques aux chaines : : : : : e 2.1.4 Les expressions r guli res : : : : : : : : : : : e e 2.1.5 Les compos s de patterns : : : : : : : : : : e 2.1.6 Les intervalles : : : : : : : : : : : : : : : : : 2.2 Les actions : : : : : : : : : : : : : : : : : : : : : : : 2.2.1 Les Expressions : : : : : : : : : : : : : : : : 2.2.2 Cr er une Fonction : : : : : : : : : : : : : : e 2.2.3 Les sorties : : : : : : : : : : : : : : : : : : : 2.2.4 Les entr es : : : : : : : : : : : : : : : : : : e 2.2.5 Les Int ractions avec les autres programmes e 104
: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

10 10 12 14 15 16 16 16 19 20 23 24 26 27

2 Le langage AWK en d tail e

31
34 35 36 37 39 45 45 46 47 68 70 75 82

CONTENTS

105
: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

3 Applications

3.1 Base de donn es : : : : : : : e 3.1.1 Introduction : : : : : 3.1.2 Sp ci cations : : : : e 3.1.3 Le chier de donn es e 3.1.4 Programme : : : : : 3.2 Des mini-langages : : : : : : 3.2.1 Introduction : : : : : 3.2.2 Sp ci cations : : : : e 3.2.3 Programme : : : : :

90 90 90 91 94 101 101 101 102

87