Beruflich Dokumente
Kultur Dokumente
LE LANGAGE AWK
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 pre PNEC : il en bave a l'arm
e e e Le ptose : fournisseur o ciel pour le mois de juin La mre 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 premire 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 deuxime partie de ce livre d
taille chaque point du langage AWK. On pourra e e s'y r
f
rer aprs avoir bien compris chacun des exemples de la partie 1. ee e La dernire partie de ce livre donne quelques applications r
elles trait
es par AWK. e e e
10
Le langage de programmation AWK est trs 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
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.
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
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
'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 troisime 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
On ouvre un chier d'instructions awk et l'ex cution s'e ectue par la come mande :
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"
14
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
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 aprs 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
15
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 dernire 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
16
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.
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 caractre 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 profre au langage une trs 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
Les Patterns sont trs 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 succde, 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
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
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 caractre en utilisant des expressions r
gulires, similaires au expression e e e r
gulires 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
18
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 trs souvent o e employ
s. Lorsque BEGIN est utilis
respectivement END, les actions qui lui e e succdent sont e ectu
es avant respectivement aprs que la premire respece e e e tivement dernire 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
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 aprs 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
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
En AWK, on peut assembler des chaines de caractres sans que cela pose de e problmes en crivant les chaines les unes la suite des autres. e e a
Comme la plupart des langages, AWK permet l'utilisation de fonctions pr e construites admettant des paramtres 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 trs simple: e Exemple :
Les fonctions sur les chaines sont sp
ci ques au langage AWK puisque toutes e les variables sont d
nies comme des chaines de caractres. e e Nous donnons ici deux des fonctions les plus employ
es : split et gsub. e La fonction splits,a
clate la chaine s, caractre par caractre 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
22
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
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
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 paramtres f instructions g e La d nition des fonctions est entirement 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 entire d'une e e valeur num rique. e
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
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"
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
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
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"
peut aussi etre effectue par la commande Unix : who | awk ' n++;print END print "personnes loggees sur Arthur :", n '
30
31
32
33 Ce chapitre explique, l'aide d'exemples, tous les ingr
dients de programmation a e en AWK. La premire 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
35
Les patterns BEGIN et END ne matchent aucune ligne en entr
e. Les instructions e qui succdent le pattern BEGIN sont ex
cut
es avant toute lecture en entr
e. De e e e e faon similaire, les instructions qui succdent le pattern END sont ex
cut
es aprs 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
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 caractres. e Une string est une chaine de z
ro ou plus de z
ro caractres. 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 caractres 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 caractre par caractre 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
37
AWK permet de s lecter ou de matcher des chaines de caractres quelconques pare e a tir d'expressions sp ci ques appel es EXPRESSIONS REGULIERES qui sont e e trs 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 gulire. e e e Le tableau ci-dessous donne les 3 grands types de patterns sp ci ques a la recherche e de chaines de caractres : e SIGNIFICATION Matche la ligne courante quand une substring est match e par l'expression r gulire e e e expression=expr.reg.= Matche la ligne courante si la chaine "expression" contient une substring match e par l'expression r gulire 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 gulire e e e TYPE =expression r gulire= e e
L'expression r
gulire 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 :
$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
39
Une expression r
gulire 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 caractres n,^,$, ,j, ,,+,? sont a la base de toute construction d'expressions e r gulires; ils sont appel s "m tacaractres". Si on veut matcher l'un de ses symboles e e e e e dans une expression r gulire sous sa d nition naturelle, on doit placer un antislash e e e devant n$ matche le caractre $ par exemple. e
40
1. n,^,$,. :
Le m
tacaractre ^ matche le d
but d'une string. e e e Le m
tacaractre $ matche la n d'une string. e e Le m
tacaractre . matche un caractre 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.
41
2.
: Une expression r
gulire consistant en un groupe de caractres entour
de e e e e crochets est appel
e classe de caractres; elle matche chacun des caractres e e e a l'int
rieur des crochets. e Lorsqu'on veut matcher une s
rie de caractres qui se suivent d'aprs 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
tacaractre e e e e e ^ aprs 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 caractre, tout caractre admet sa signi cation e e e normale except
les caractres n , ^ plac
en d
but et - plac
entre 2 caractres. e e e e e e Ainsi :
. ^ ^^ matche le point ".". matche tout caractere en debut de chaine sauf l'accent ^.
42
3. ,j :
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
gulires. 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
Nous r
capitulons dans le tableau ci-dessous toutes les expressions r
gulires 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
MATCHE le non m tacaractre c e e s quence de tabulation ou le caractre litt ral c e e e d but de string e n de string tout caractre e tout caractre c1 , c2 .... e tout caractre sauf c1 , c2 .... e tout caractre de c1 c2 e a tout caractre 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 parenthses 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
45
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
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
47
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 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
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
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
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
OPERATION a ectation conditionnel logique OU logique ET l ment de tableau ee matching relationel concat nation e
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 ime champ e additionn de 1 e additionne 1 la valeur a du ime champ e
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 aprs 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
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
gulires : Dans beaucoup de nos exemples pr
c
dents, e e ee le membre de droite de l'op
rateur ~ ou !~
tait une expression r
gulire 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 interprte la chaine comme une expression r
gulire. 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
gulire 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
53
On peut donc construire une expression r
gulire entre quotes comme on cone e struit une expression r
gulire entre slashs pour les patterns; il y a une seule exe e ception pour les m
tacaractres; lorsque l'on veut matcher le mtacaractre 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
La suite donne quelques exemples d'utilisation d'expressions r
gulires. Pour e e cela, nous modi ons l
grement 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
55
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"
56
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
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 entire 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 paramtre, 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
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
les fonctions AWK sur les chaines : AWK permet l'utilisation des fonctions pr
d
nies e e qui oprent sur les chaines. Ces fonctions sont list
es dans le tableau ci-dessous. e e ROLE retourne le nombre de caractre de s e retourne la premire 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
gulire; 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 !?"
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 caractre 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
gulire 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
a a a a
la la la la
- 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
- 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 caractres 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 concatne 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 caractre 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
61
Would|to|Does|Funeral|I|Summerlands|Between|appearing| Were|closer|Kthulhu|forever
62
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; aprs, 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
break
continue next
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
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
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
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
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 concatne 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
En fait, les indices sont stock
s comme des chaines qui ont la forme : e
1 SUBSEP 1 1 SUBSEP 2
......
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
67
"
tab " x 1
"," x 2
" =",tab k
11 12 21 22
= = = =
2 3 3 4
= = = =
2 3 3 4
68
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
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 paramtres 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 frent aux arguments pass s en e ee e paramtre 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 paramtres 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 paramtres, elle peut r
f
rencer une variable existant dans le programme appelant e ee a et ainsi on peut en
craser son contenu. e
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"
Mots les plus frequents dans ce dedale obscur "the I closer remain" C'est la parole des Fields
70
Les fonctions print et printf g nrent 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
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
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
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 aprs 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
Chaque sp
ci cation commence par un , se termine par un caractre 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 caractres 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 caractre ASCII e partie entire 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 |
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 deuxime e e champ est crit dans le chier dont le nom est la valeur du troisime champ. e e
74
Les sorties dans les pipes sont possibles uniquement si le systme 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 aprs 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
75
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
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
gulire 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
gulire deviendra le s
parateur de champ dans la ligne e e e e courante. A chaque fois que l'expression r
gulire 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
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 gulire aprs l'option -F; souvent il est seulement possible d' crire un e e e e seul caractre entre quotes aprs 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 complte comme un champ en prenant a e e FS=" n".
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
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.
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
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
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
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
81
$0~ ^a END
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
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
function convert getline chaine gsub ' ," '",chaine "echo "chaine" | tr ' a-z *' ' A-Z *'" | getline CHAINE return CHAINE
83
Attention, nous avons oubli de fermer le pipe de e Il est necessaire de le fermer par l'instruction : La fonction convert devient :
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
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 .
85
86
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
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 discothque. 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
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 caractres 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
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
93
: TECHNO FRONT 242 CRAZY VINYL=432; K7=371 42; 65 ALIEN SEX FIEND SEX IS BEAUTIFUL CD=5439; K7=324 74; 62
: 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 systme 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 *$
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
close"out.data" print " tVotre choix se trouvent aussi dans le fichier else if decision ~ ^ *M *$
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
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
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
printf" n tNom du groupe : s n",$2 "o.data" getline "musique" printf" tTitre des albums : n" "o.data"
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
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
gulires 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 caractres 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 accs 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 systme 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
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
---------
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.........
101
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
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 caractres : : : : : : : : 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
gulires : : : : : : : : : : : 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
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 : : : : :
87