Vous êtes sur la page 1sur 64

C.

Aperghis-Tramoni

Le Langage AWK
C'est un langage de gestion ligne ligne de fichiers. Pour tre trait par AWK, un fichier donnes doit, si possible, avoir une structure cohrente : <ligne 1> : "Champ 1" "Champ 2" ...... "Champ n" <ligne 2> : "Champ 1" "Champ 2" ...... "Champ n" <ligne 3> : "Champ 1" "Champ 2" ...... "Champ n" .......... .......... .......... .......... <ligne p> : "Champ 1" "Champ 2" ...... "Champ n" Il existe des exeptions qui, dpendant de la dfinition mme du type de donnes traiter, ne seront prises en compte que si elles sont parfaitement connues.

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Fichiers d'exemple.
Les exemples qui seront dvelopps porteront, en fonction des structures que nous voulons mettre en vidence, sur les fichier suivants: Un texte, enregistr sous le nom de sonnet, c'est un poeme de Ronsard, (Sur la mort de Marie, 1578) dont les lignes sont, par dfinition, non structures (nombre de champs variable, lignes blanches, ponctuation). Un fichier parfaitement structur sur lequel il sera possible de proceder des calculs et a des prsentations. Il est stock sous le nom Chauffeurs.

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Le chier sonnet.
Terre, ouvre-moi ton sein, et me laisse reprendre Mon tresor, que ta parque a cache dessous toi; Ou bien, si tu ne peux, o terre, cache moi Sous meme sepulture, avec sa belle cendre. Le trait qui la tua devait faire descendre Mon corps aupres du sien pour nir mon emoi; Aussi bien, vu le mal quen sa mort je recoit, Je ne saurais plus vivre, et me fache dattendre. Quand ses yeux meclairaient, et quen terre javais Le bonheur de les voir, a lheure je vivais, Ayant de leurs rayons mon ame gouvernee. Maintenant je suis mort : la Mort qui sen alla Loger dedans ses yeux, en parlant mappela, Et me t de ses pieds accomplir ma journee.

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Le chier Chaueurs.
Nom de Jean Claude Pierre Robert Alain Marc Michel Norbert Francois Serge Luc Albert Charles Marque de voiture carb. Peugeot Citroen Toyota Peugeot Renault Renault Citroen Toyota Peugeot Peugeot Toyota Peugeot Renault Consomm. 08 14 17 10 15 12 10 11 09 20 11 07 12 Kilomtres Prix du parcourus litre par jour 250 350 150 550 100 250 350 400 350 800 750 250 300 5.50 3.50 5.00 5.20 5.00 5.50 5.20 5.00 3.50 5.90 5.20 3.50 5.50

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Champs et Sparateurs (1).


Le caractre sparant les champs est dni dans une variable globale qui sappelle FS. Dans lexemple qui est dcrit le sparateur est lespace, (FS = ). Le compte des champs dune ligne courante est calcul il est indiqu par le positionnement dune variable globale NF. Dans notre exemple, le nombre de champs est constant et il est gal 5, (NF = 5) Le compte des lignes du chier dentre se trouve dans une variable globale NR. Notre chier comporte 12 lignes, (NR = 12).

Tous les types de donnes -> tiquettes, -> fonctions, -> chiers, -> rpertoires ont leur propre zone didentication.
Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemples de visualisation (1).


Impression ligne ligne du chier. $0 indique la totalit des champs.
/es2i/staff/chris Chauffeurs Jean Peugeot Claude Citroen Pierre Toyota Robert Peugeot Alain Renault Marc Renault Michel Citroen Norbert Toyota Francois Peugeot Serge Peugeot Luc Toyota Albert Peugeot Charles Renault /es2i/staff/chris : nawk '{print}' 10 8 14 11 9 17 10 15 20 11 12 7 12 : 250 350 150 550 100 250 350 400 350 800 750 250 300 5.50 3.50 5.00 5.20 5.00 5.50 5.20 5.00 3.50 5.90 5.20 3.50 5.50

/es2i/staff/chris Jean Peugeot Claude Citroen Pierre Toyota Robert Peugeot Alain Renault Marc Renault Michel Citroen Norbert Toyota Francois Peugeot Serge Peugeot Luc Toyota Albert Peugeot Charles Renault /es2i/staff/chris

: nawk '{print $0}' Chauffeurs 10 250 5.50 8 350 3.50 14 150 5.00 11 550 5.20 9 100 5.00 17 250 5.50 10 350 5.20 15 400 5.00 20 350 3.50 11 800 5.90 12 750 5.20 7 250 3.50 12 300 5.50 :

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemples de visualisation (2).


Imprimer chacun des champs en les sparant par des blancs (virgule) et en numrotant les lignes (NR).
/es2i/staff/chris : nawk '{print NR,$1,$2,$3,$4,$5}' Chauffeurs 1 Jean Peugeot 10 250 5.50 2 Claude Citroen 8 350 3.50 3 Pierre Toyota 14 150 5.00 4 Robert Peugeot 11 550 5.20 5 Alain Renault 9 100 5.00 6 Marc Renault 17 250 5.50 7 Michel Citroen 10 350 5.20 8 Norbert Toyota 15 400 5.00 9 Francois Peugeot 20 350 3.50 10 Serge Peugeot 11 800 5.90 11 Luc Toyota 12 750 5.20 12 Albert Peugeot 7 250 3.50 13 Charles Renault 12 300 5.50 /es2i/staff/chris : /es2i/staff/chris : nawk '{print NF,$1,$NF-1}' Chauffeurs 5 Jean 4.5 5 Claude 2.5 5 Pierre 4 5 Robert 4.2 5 Alain 4 5 Marc 4.5 5 Michel 4.2 5 Norbert 4 5 Francois 2.5 5 Serge 4.9 5 Luc 4.2 5 Albert 2.5 5 Charles 4.5 /es2i/staff/chris : 7
Universit de la Mditerranne

Imprimer pour chaque ligne, le nombre de champs, le premier puis lavant dernier champ.

Dpartement dInformatique

C. Aperghis-Tramoni

Programmes AWK.
Avant tout, awk (ou nawk) est une commande unix dont elle prsente toutes les caractristiques.

On peut la tuber (ls -al | awk ...), lutiliser dans un script etc ... Awk est aussi un langage de programmation.
Pour des applications simples :
awk 'Programme' Fichier-1 Fichier-2 ..... Fichier-n

Programme est une suite dinstructions dont la forme gnrale est :


Condition {Instr-1; Instr-2; ...; Instr-n}

La commande excute le programme chier par chier, ligne ligne, squenciellement. Pour une application plus complexe
awk -f Programme [Fichier-1 Fichier-2 ..... Fichier-n] Programme est dans ces conditions le nom dun chier contenant la suite dinstructions.

Si aucun chier nest prcis, le chier dentre sera stdin.

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Applications simples.
Trouver tous les possesseurs de Renault.
/es2i/staff/chris Alain Renault Marc Renault Charles Renault /es2i/staff/chris Alain Renault Marc Renault Charles Renault Alain Renault Marc Renault Charles Renault /es2i/staff/chris : nawk '$2 == "Renault" {print}' Chauffeurs 9 100 5.00 17 250 5.50 12 300 5.50 : nawk '$2 == "Renault" {print}' Chauffeurs Chauffeurs 9 100 5.00 17 250 5.50 12 300 5.50 9 100 5.00 17 250 5.50 12 300 5.50 :

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Les chiers programme.

Pour une application plus complexe, il est prfrable que le programme soit contenu dans un chier dinstructions. Lexcution du chier en question se fera par la commande :
awk -f Programme [Fichier-1 Fichier-2 ... Fichier-n]

Comme prcdemment, les instructions contenues dans le chier seront excutes squentiellementsur les lignes des chiers donns en entre. De la mme manire, si aucun chier nest prcis, le chier dentre sera stdin.

Dpartement dInformatique

10

Universit de la Mditerranne

C. Aperghis-Tramoni

Un chier programme.
Ecrire un programme (verif) qui vrie la cohrence des donnes du chier Chauffeurs.
/es2i/staff/chris : cat verif NF !=5{print $0 "Nombre de champs different de 5"} $3 > 15 {print $1 " semble consommer beaucoup."} $4 > 500 {print $1 " roule beaucoup."} $4 < 200 {print $1 " roule peu."} $5 > 5.50 {print $1 " paye son essence un peu cher."} /es2i/staff/chris : nawk -f verif Chauffeurs Pierre roule peu. Robert roule beaucoup. Alain roule peu. Marc semble consommer beaucoup. Francois semble consommer beaucoup. Serge roule beaucoup. Serge paye son essence un peu cher. Luc roule beaucoup. /es2i/staff/chris :

Dpartement dInformatique

11

Universit de la Mditerranne

C. Aperghis-Tramoni

Le programme AWK.
Un programme awk se prsente toujours comme nous venons de le dnir :
CONDITION CONDITION
..........

{ACTION} {ACTION}

Une condition porte exclusivement sur une ligne du chier dentre si il en est prcis un ou sur lentre standard (stdin) si aucun chier nest indiqu. Une action ne sexcutera que si la condition est valide. Quels sont les noms possesseurs de Toyotas ?
awk '$2 == "Toyota" {print $1}' Chauffeurs Condition Action Fichier

/es2i/staff/chris : nawk '$2 == "Toyota" Pierre Norbert Luc /es2i/staff/chris :

{print $1}' Chauffeurs

Dpartement dInformatique

12

Universit de la Mditerranne

C. Aperghis-Tramoni

Condition et Action.
La prsence des champs condition ou action est facultative. Si la condition est absente, laction est excute systmatiquement.
awk '{print}' Chauffeurs

Si laction est absente on imprimera la ligne, en fait, laction standard est {print} Imprimer les informations relatives aux possesseurs de Peugeots : ou bien :
awk '$2 == "Peugeot" ' Chauffeurs awk '{if ($2 == "Peugeot") print}' Chauffeurs
: nawk '$2 == "Peugeot" ' Chauffeurs 10 250 5.50 11 550 5.20 20 350 3.50 11 800 5.90 7 250 3.50 : nawk '{if ($2 == "Peugeot") print}' Chauffeurs 10 250 5.50 11 550 5.20 20 350 3.50 11 800 5.90 7 250 3.50 :

/es2i/staff/chris Jean Peugeot Robert Peugeot Francois Peugeot Serge Peugeot Albert Peugeot /es2i/staff/chris Jean Peugeot Robert Peugeot Francois Peugeot Serge Peugeot Albert Peugeot /es2i/staff/chris

Dpartement dInformatique

13

Universit de la Mditerranne

C. Aperghis-Tramoni

Quelques exemples (1).


Calcul de consommation hebdomadaire.
/es2i/staff/chris : nawk '{print $1,$4*7}' Chauffeurs Jean 1750 Claude 2450 Pierre 1050 Robert 3850 Alain 700 Marc 1750 Michel 2450 Norbert 2800 Francois 2450 Serge 5600 Luc 5250 Albert 1750 Charles 2100 /es2i/staff/chris :

Dpartement dInformatique

14

Universit de la Mditerranne

C. Aperghis-Tramoni

les formats.
Il est possiblede formater les donnes de sortie an dobtenir une prsentation agrable :
printf (format, valeur-1, valeur-2, ....., valeur-n) Format

Le format est une chaine contenant entre autre des % A chaque valeur est associ un %, Il y a autant de % que de valeurs
nawk '{printf ("%s consomme %d litres aux 100, cout hebdomadaire %.2f francs.\n", $1, $3, $4*7*$5/100)}' Chauffeurs

Valeurs

%s %d %.2f \n \t

: Format dune chaine de caractres $1, le nom. : Format dun nombre entier tel quel $3, la consommation. : Format dun nombre rel prsent avec 2 chiffres aprs la virgule $4*7*$5/100, le cout hebdomadaire. : Passage la ligne. : Tabulation.
15
Universit de la Mditerranne

Dpartement dInformatique

C. Aperghis-Tramoni

Exemple de format.
Calcul de dpense hebdomadaire.
/es2i/staff/chris : nawk '{printf ("%s consomme %d litres aux 100, cout hebdomadaire %.2f francs.\n", $1, $3, $4*7*$5/100)}' Chauffeurs Jean consomme 10 litres aux 100, cout hebdomadaire 96.25 francs. Claude consomme 8 litres aux 100, cout hebdomadaire 85.75 francs. Pierre consomme 14 litres aux 100, cout hebdomadaire 52.50 francs. Robert consomme 11 litres aux 100, cout hebdomadaire 200.20 francs. Alain consomme 9 litres aux 100, cout hebdomadaire 35.00 francs. Marc consomme 17 litres aux 100, cout hebdomadaire 96.25 francs. Michel consomme 10 litres aux 100, cout hebdomadaire 127.40 francs. Norbert consomme 15 litres aux 100, cout hebdomadaire 140.00 francs. Francois consomme 20 litres aux 100, cout hebdomadaire 85.75 francs. Serge consomme 11 litres aux 100, cout hebdomadaire 330.40 francs. Luc consomme 12 litres aux 100, cout hebdomadaire 273.00 francs. Albert consomme 7 litres aux 100, cout hebdomadaire 61.25 francs. Charles consomme 12 litres aux 100, cout hebdomadaire 115.50 francs. /es2i/staff/chris :

Dpartement dInformatique

16

Universit de la Mditerranne

C. Aperghis-Tramoni

Les entres sorties.


Dtail des fonctions print, printf. Ecriture de *0 sur stdout.
print expression, expression, ... printf (format,expression, expression, ...) print expression, expression, ... > fichier printf (format,expression, expression, ...) >fichier print expression, expression, ... >> fichier printf (format,expression, expression, ...) >> fichier print expression, expression, ... | commande printf (format,expression, expression, ...) | commande print

Ecriture des expressions spares par OFS et termines par ORS.

Ecriture dans le chier des expressions spares par OFS et termines par ORS.

Ecriture dans le chier des expressions spares par OFS et termines par ORS.

Ecriture des expressions spares par OFS et termines par ORS sur lentre de la commande.

Dpartement dInformatique

17

Universit de la Mditerranne

C. Aperghis-Tramoni

Les formats.
La fonction printf implique la dnition dun format.
Caractre Format de Sortie
Tout caractre ASCII. La partie entire d'un nombre. Nombre rel sous la forme [-]d.ddddddE[+/-]dd. Nombre rel sous la forme [-]ddd.dddddd. Le plus court entre e et f avec suppression des zros. Nombre octal non sign. Toute chaine de caractres. Nombre hexadecimal non sign. Ecriture d'un % si aucun argument n'est prsent.

c d e f g o s x %

Dpartement dInformatique

18

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemples de formats.
Format "'%c'\n" "'%d'\n" "'%5d'\n" "'%e'\n" "'%f'\n" "'%g'\n" "'%6g'\n" "'%o'\n" "'%x'\n" "'%s'\n" Contenu de var 83 83.5 83.5 83.5 83.5 83.5 83.5 83 83 "ecole" printf ("Format";var) 's' '83' ' 83' '8.350000e+01' '83.500000' ' 83.50' '83.5' ' 83.5' '123' '000123' '53' 'ecole' ' 'ecole 'eco' ' 'eco
19

"'%7.2f'\n" 83.5

"'%06o'\n" 83.5

"'%10s'\n" "ecole" "'%-10s'\n" "ecole" "'%.3s'\n" "ecole" "'%10.3s'\n" "ecole" "'%-10.3s'\n" "ecole"
Dpartement dInformatique

ecole' ' eco' '


Universit de la Mditerranne

C. Aperghis-Tramoni

Les dclarations.
Lun des principaux attraits de awk, et ce qui en fait sa puissance, est quil ny a ni dclaration de variable ni dclaration de type. Ainsi une variable peut avoir le type chaine de caractres ou nombre. Elle peut mme avoir simultanment les deux types. Ainsi, awk convertira la valeur dune chaine en un nombre ou inversement au moment de lexcution du programme. Exemple :
Ici "Marc" est une variable qui reoit la valeur numrique 17.

/es2i/staff/chris : cat declare On change le contenu du champ 3 (consommation) $1 == "Marc" { pour le remplacer par la somme du champ 3 et de Marc = 17 la variable Marc. $3 = $3 + Marc Ici "Marc" est chaine = $1 " : ceci ne veut rien dire, " le critre de print chaine, $3 slection ($1). } /es2i/staff/chris : nawk -f declare Chauffeurs Marc : ceci ne veut rien dire, 34 /es2i/staff/chris :

Dpartement dInformatique

20

Universit de la Mditerranne

C. Aperghis-Tramoni

Expressions, Collisions.
Le systme appelle Pattern que nous traduirons par modle, les expressions utilises pour slectionner les diverses lignes dun chier. Lorsquune forme est reconnue (Matche), laction crite est alors excute. Il existe plusieurs faons de slectionner un modle. -> Comparaison. -> Calcul. -> Texte. -> Combinaison de diverses slections par des oprateurs logiques.

Dpartement dInformatique

21

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemples de slections.
Forme de slection. Exemples. BEGIN END BEGIN END Slection ralise. Excution du programme inclus avant toute lecture du fichier. Excution du programme inclus aprs lecture de la fin de fichier. Excution du programme inclus si le nombre de champs de la ligne est suprieur 5. Excution du programme inclus si la ligne contient la chaine /Renault/. Excution du programme inclus si la ligne contient plus de 5 champs et la chaine /To/. Excution du programme inclus sur les lignes 5 20 du fichier.

Expression logique. NF > 5 Comparaison de chaines de caractres. Compositions de slections. Intervalle. /Renault/ NF > 5 && /To/ NR == 10,NR == 20

Dpartement dInformatique

22

Universit de la Mditerranne

C. Aperghis-Tramoni

Slection par comparaison.


Les symboles utiliss sont les comparateurs usuels : <, <=, ==, !=, >=, > Ils peuvent tre utiliss la fois sur les nombres et sur les chaines. Soit par exemple imprimer la liste de ceux qui parcourent plus de 500 KM par jour en les faisant suivre de la mention roule beaucoup.
/es2i/staff/chris : nawk '$4 >= 500 {print $1," roule beaucoup"} ' Chauffeurs Robert roule beaucoup Serge roule beaucoup Luc roule beaucoup /es2i/staff/chris :

Dpartement dInformatique

23

Universit de la Mditerranne

C. Aperghis-Tramoni

Slection par calcul.


Selectionner ceux qui coutent plus de 250 francspar semaine et limprimer ainsi que le nom.
/es2i/staff/chris : nawk '$3*$4*$5/100 >= 250 {print $1," coute ", $3*$4*$5/100, "francs par semaine."} ' Chauffeurs Robert coute 314.6 francs par semaine. Norbert coute 300 francs par semaine. Serge coute 519.2 francs par semaine. Luc coute 468 francs par semaine. /es2i/staff/chris :

Dpartement dInformatique

24

Universit de la Mditerranne

C. Aperghis-Tramoni

Slection par texte.


Slectionner tous ceux qui sont alphabetiquement avant Jean.
/es2i/staff/chris Claude Citroen Alain Renault Francois Peugeot Albert Peugeot Charles Renault /es2i/staff/chris : nawk '$1 < "Jean" {print} ' Chauffeurs 8 350 3.50 9 100 5.00 20 350 3.50 7 250 3.50 12 300 5.50 :

Recherche par lintermdiaire dexpressions rgulires. Slectionner toutes les lignes contenant la chaine au.
/es2i/staff/chris Claude Citroen Alain Renault Marc Renault Charles Renault /es2i/staff/chris : nawk '/au/ {print} ' Chauffeurs 8 350 3.50 9 100 5.00 17 250 5.50 12 300 5.50 :

Dpartement dInformatique

25

Universit de la Mditerranne

C. Aperghis-Tramoni

Combinaisons de conditions.
Les oprateurs logiques sont les mmes quen C : && -> Et || -> Ou ! -> Non Slectionner ceux qui conduisent des Peugeots et dont la consommation est suprieure 10 litres aux 100.
/es2i/staff/chris Robert Peugeot Francois Peugeot Serge Peugeot /es2i/staff/chris : nawk '$3 > 10 && $2 == "Peugeot" 11 550 5.20 20 350 3.50 11 800 5.90 : {print} ' Chauffeurs

Qui conformment au thorme de de Morgan, aurait pu scrire en utilisant les ngations :


/es2i/staff/chris Robert Peugeot Francois Peugeot Serge Peugeot /es2i/staff/chris : nawk '!($3 <= 10 || $2 != "Peugeot") 11 550 5.20 20 350 3.50 11 800 5.90 : {print} ' Chauffeurs

Dpartement dInformatique

26

Universit de la Mditerranne

C. Aperghis-Tramoni

BEGIN et END.
Lorsque BEGIN est utilise, les actions qui lui succdent sont effectues avant que la premire ligne du chier ne soit lue. Lorsque END est utilise, les actions qui lui succdent sont effectues aprs que la dernire ligne du chier soit lue.

Il est possible decrire des programmes AWK sans avoir ncessairement de chier en entre.
BEGIN et END ne supportent pas de combinaison.
Attention aux diverses implmentations. Certaines supportent plusieurs BEGIN (END). Dans ce cas, ils sont excuts dans lordre dans lequel ils se prsentent. Dautres exigent de ne rencontrer quun BEGIN (END)

Dpartement dInformatique

27

Universit de la Mditerranne

C. Aperghis-Tramoni

Un exemple de prsentation.
/es2i/staff/chris : cat edition BEGIN { print; print "Nom Marque Cons KM Carb"; print } {print} END { print; print "Nombre de lignes lues : ", NR; print "Edition Termine."; print } /es2i/staff/chris : /es2i/staff/chris : nawk -f edition Chauffeurs Nom Marque Cons KM Carb 5.50 350 5.00 5.20 100 250 350 5.00 20 800 5.20 250 300

Jean Peugeot 10 250 Claude Citroen 8 Pierre Toyota 14 150 Robert Peugeot 11 550 Alain Renault 9 Marc Renault 17 Michel Citroen 10 Norbert Toyota 15 400 Francois Peugeot 3.50 Serge Peugeot 11 Luc Toyota 12 750 Albert Peugeot 7 Charles Renault 12 Nombre de lignes lues : Edition Termine. /es2i/staff/chris : 13

3.50

5.00 5.50 5.20 350 5.90 3.50 5.50

Dpartement dInformatique

28

Universit de la Mditerranne

C. Aperghis-Tramoni

Les manipulations de chaine.


En plus des expressions de traitement des expressions arithmtiques, awk propose nombre des facilits pour manipuler les chaines de caractre. Une chaine est constitue de zro ou n caractres. Elles peuvent tre stockes dans des variabes ou apparaitre in extenso. Toute expression peut tre utilise en tant quoprande de tout oprateur. Si une expression qui a une valeur numrique est utilise par un oprateur qui requiert une chaine, alors elle est automatiquement transforme et rciproquement.
Oprateur < <= == != >= > ~ !~ Signification. Infrieur . Infrieur ou gal . gal . Diffrent de. Suprieur ou gal . Suprieur . Reconnu par. non reconnu par.

Dpartement dInformatique

29

Universit de la Mditerranne

C. Aperghis-Tramoni

Les actions.
Les actions peuvent tre de simples impressions {print}, des affectations ou des ensembles de lignes comportant des lments du vocabulaire non terminal du langage, des dnitions de fonctions etc ... Les Expressions comportent des constantes, des variables, des affectations, des appels de fonctions prdnies ou non.
print(f) (format, liste d'expressions) if (expression) instructions if (expression) instructions else instructions while (expression) instructions for (expression;expression;expression) instructions for (variable in tableau) instructions do (instructions) while (expression) break continue next exit exit expression {expression}

Dpartement dInformatique

30

Universit de la Mditerranne

C. Aperghis-Tramoni

Les expressions.
Les expressions les plus simples sont des blocs primaires constitus de constantes, de variables, de sparateurs.

5 grandes catgories se combinent entre elles : -> Arithmtiques -> Comparaisons -> Logiques -> Conditionnelles -> Affectations A quoi il faut ajouter : Les fonctions prdnies. Les fonctions dnies par lutilisateur.

Dpartement dInformatique

31

Universit de la Mditerranne

C. Aperghis-Tramoni

Les constantes.
Chaines de caractres : Francois Christian Aperghis Constantes numriques entires : 5000 Constantes numriques relle : 1000,5 0.55E-3 1e6

La prcision maximale dpend de la machine.

Dpartement dInformatique

32

Universit de la Mditerranne

C. Aperghis-Tramoni

Les Variables.
Les variables peuvent tre prdnies ou appartenir lusager.

Une variable nest pas dclare et ne comporte pas de type. Le type est dtermin en fonction du contexte. Le nom dune variable est constitu de lettres, de chiffres et de souligns. Le premier caractre ne doit pas tre un chiffre. Une variable prdnie est globale et ne peut tre modie.

Dpartement dInformatique

33

Universit de la Mditerranne

C. Aperghis-Tramoni

Les variables prdnies.


A chaque variable prdne est associe une valeur par dfaut.
Variable. ARGC ARGV FILENAME FNR FS NF NR OFMT OFS ORS RLENGTH RS RSTART SUBSEP Signification.
Nombre d'arguments de la ligne de commande. Liste des arguments de la ligne de commande (Tableau). Nom du fichier courant. Nombre d'enregistrements du fichier courant. Contrle du sparateur de champ du fichier courant. Nombre de champs de l'enregistrement courant. Nombre d'enregistrements lus depuis le dbut. Format de sortie pour les nombres. Sparateur de sortie. Sparateur d'enregistrements. Longueur d'une chaine valide par la fonction "match". Contrle du sparateur d'enregistrements en entre.. Dbut de la chaine valide par la fonction "match". Sparateur d'indice.

Dfaut.
n.a. n.a. n.a. n.a. " " n.a. n.a. "%.6g" " " "\n" n.a. "\n" n.a. "\034"

Dpartement dInformatique

34

Universit de la Mditerranne

C. Aperghis-Tramoni

Test de variables (1).


/es2i/staff/chris : cat variables 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 fichier d'entree : %s\n\n",FILENAME) } {printf "FNR :%3d NR :%3d Debut ligne : %s %s \n", FNR, NR, $1, $2} END{ printf ("\nNom du fichier d'entree : %s\n",FILENAME) } /es2i/staff/chris :

Dpartement dInformatique

35

Universit de la Mditerranne

C. Aperghis-Tramoni

Test de variables (2).


Excution du programme prcdent.
/es2i/staff/chris :nawk -f variables sonnet sonnet FNR : 14 NR : 14 Debut ligne : Nombre d'arguments : 3 FNR : 15 NR : 15 Debut ligne : Maintenant je FNR : 16 NR : 16 Debut ligne : Loger dedans 2 sonnet FNR : 17 NR : 17 Debut ligne : Et me 0 nawk FNR : 1 NR : 18 Debut ligne : Terre, ouvre-moi 1 sonnet FNR : 2 NR : 19 Debut ligne : Mon tresor, FNR : 3 NR : 20 Debut ligne : Ou bien, nawk sonnet sonnet FNR : 4 NR : 21 Debut ligne : Sous meme FNR : 5 NR : 22 Debut ligne : Nom du fichier d'entree : sonnet FNR : 6 NR : 23 Debut ligne : Le trait FNR : 7 NR : 24 Debut ligne : Mon corps FNR : 1 NR : 1 Debut ligne : Terre, ouvre-moi FNR : 8 NR : 25 Debut ligne : Aussi bien, FNR : 2 NR : 2 Debut ligne : Mon tresor, FNR : 9 NR : 26 Debut ligne : Je ne FNR : 3 NR : 3 Debut ligne : Ou bien, FNR : 10 NR : 27 Debut ligne : FNR : 4 NR : 4 Debut ligne : Sous meme FNR : 11 NR : 28 Debut ligne : Quand ses FNR : 5 NR : 5 Debut ligne : FNR : 12 NR : 29 Debut ligne : Le bonheur FNR : 6 NR : 6 Debut ligne : Le trait FNR : 13 NR : 30 Debut ligne : Ayant de FNR : 7 NR : 7 Debut ligne : Mon corps FNR : 14 NR : 31 Debut ligne : FNR : 8 NR : 8 Debut ligne : Aussi bien, FNR : 15 NR : 32 Debut ligne : Maintenant je FNR : 9 NR : 9 Debut ligne : Je ne FNR : 16 NR : 33 Debut ligne : Loger dedans FNR : 10 NR : 10 Debut ligne : FNR : 17 NR : 34 Debut ligne : Et me FNR : 11 NR : 11 Debut ligne : Quand ses FNR : 12 NR : 12 Debut ligne : Le bonheur Nom du fichier d'entree : sonnet FNR : 13 NR : 13 Debut ligne : Ayant de /es2i/staff/chris :

Dpartement dInformatique

36

Universit de la Mditerranne

C. Aperghis-Tramoni

Le test if ... else.


On touvera une syntaxe proche de celle du C, la diffrence rsidant dans le fait quil ny a pas de dclaration de variable. if ... else : Contrairement une condition qui agit exclusivement sur la ligne courante du chier, un test peut agir sur toute variable globale ou de ligne et contrler lexcution du programme. Soit calculer le cot moyen du kilomtre des Peugeots.
/es2i/staff/chris : cat cout.peugeot $2 == "Peugeot" {n=n+1; cout = $3*$5/100 + cout} END { if (n>0) { print ("Cout moyen du kilometre parcouru en Peugeot :") printf ("%4.2f francs calcule sur %d voitures.\n", cout/n,n) } else print "Il n'y a pas de Peugeots parmis les ", NR, " voitures" } /es2i/staff/chris : nawk -f cout.peugeot Chauffeurs Cout moyen du kilometre parcouru en Peugeot : 0.54 francs calcule sur 5 voitures. /es2i/staff/chris :
Dpartement dInformatique

37

Universit de la Mditerranne

C. Aperghis-Tramoni

La boucle while.
Sachant que le prix du carburant augmente de 3% tous les six mois, calculez le prix de revient du kilomtre de chaque voiture pour les deux ans qui viennent.
/es2i/staff/chris : cat prospect BEGIN {printf ("\nMarque\tMaintenant\t6 mois \t12 mois\t18 mois\t24 mois\n")} $2 == "Peugeot" { np = np+1; cp = $3*$5/100 + cp} $2 == "Citroen" { nc = nc+1; cc = $3*$5/100 + cc} $2 == "Renault" { nr = nr+1; cr = $3*$5/100 + cr} $2 == "Toyota" { nt = nt+1; ct = $3*$5/100 + ct} i = 1; printf ("\nCitroen") END { i = 1; printf ("\nPeugeot") printf ("\t%7.2f\t",cc) printf ("\t%7.2f\t",cp) while (i<=4) { cc = cc * 1.03 while (i<=4) { cp = cp * 1.03 printf ("\t%6.2f",cc) i = 1; printf ("\nRenault") i = i + 1} printf ("\t%7.2f\t",cr) i = 1; printf ("\nRenault") while (i<=4) { cr = cr * 1.03 printf ("\t%7.2f\t",cr) printf ("\t%6.2f",cr) while (i<=4) { cr = cr * 1.03 i = i + 1} printf ("\t%6.2f",cr) i = 1; printf ("\nToyota") i = i + 1} printf ("\t%7.2f\t",ct) i = 1; printf ("\nToyota") while (i<=4) { ct = ct * 1.03 printf ("\t%7.2f\t",ct) printf ("\t%6.2f",ct) while (i<=4) { ct = ct * 1.03 i = i + 1} printf ("\t%6.2f",ct) printf ("\n\n") i = i + 1} } printf ("\n\n") printf ("\t%6.2f",cp) } i = i + 1}

Dpartement dInformatique

38

Universit de la Mditerranne

C. Aperghis-Tramoni

Excution du programme.
/es2i/staff/chris : nawk -f prospect Chauffeurs Marque Peugeot Citroen Renault Toyota 0 mois 2.72 0.80 2.04 2.07 6mois 2.80 0.82 2.11 2.14 12mois 2.88 0.85 2.17 2.20 18mois 2.97 0.87 2.23 2.27 24mois 3.06 0.90 2.30 2.33

/es2i/staff/chris :

Dpartement dInformatique

39

Universit de la Mditerranne

C. Aperghis-Tramoni

La boucle for.
Imprimer les donnes du chier Chauffeurs en sparant les champs par une tabulation.
/es2i/staff/chris : cat edite {for (i = 1;i <= NF; i++) printf ("%10s\t",$i) printf ("\n") } /es2i/staff/chris : nawk -f edite Chauffeurs Jean Peugeot 10 250 5.50 Claude Citroen 8 350 3.50 Pierre Toyota 14 150 5.00 Robert Peugeot 11 550 5.20 Alain Renault 9 100 5.00 Marc Renault 17 250 5.50 Michel Citroen 10 350 5.20 Norbert Toyota 15 400 5.00 Francois Peugeot 20 350 3.50 Serge Peugeot 11 800 5.90 Luc Toyota 12 750 5.20 Albert Peugeot 7 250 3.50 Charles Renault 12 300 5.50 /es2i/staff/chris :
Dpartement dInformatique

40

Universit de la Mditerranne

C. Aperghis-Tramoni

Fonctions sur les chaines.


AWK permet de travailler sur les chaines de caractre et comporte en outre quelques fonctions prdnies.

Lopration de concatnation est implicite,


/es2i/staff/chris : cat conc {noms = noms $1 " - "} END {print noms} /es2i/staff/chris : nawk -f conc Chauffeurs Jean - Claude - Pierre - Robert - Alain - Marc - Michel - Norbert - Francois - Serge - Luc - Albert - Charles - /es2i/staff/chris :

Dpartement dInformatique

41

Universit de la Mditerranne

C. Aperghis-Tramoni

La fonction split().
split(s,a) permet lclatement de la chaine s en fonction du caractre sparateur (FS). Chaque lment ainsi dni est positionn dans le tableau a. La valeur de retour de la fonction est la taille du tableau ainsi construit. Eclatement de la chaine dont le prenier champ est Francois.
/es2i/staff/chris : cat split /Francois/ {taille=split($0,tab) for (i=1;i<=taille;i++) printf "L'element %d du tableau est %s\n",i,tab[i] } /es2i/staff/chris : nawk -f split Chauffeurs L'element 1 du tableau est Francois L'element 2 du tableau est Peugeot L'element 3 du tableau est 20 L'element 4 du tableau est 350 L'element 5 du tableau est 3.50 /es2i/staff/chris :

Dpartement dInformatique

42

Universit de la Mditerranne

C. Aperghis-Tramoni

La fonction gsub().
gsub(motif,remplacement,chaine) permet de remplacer dans la chaine la forme dnie par le motif.
/es2i/staff/chris : cat gsub BEGIN {print "De la deliquescence du couple Automobile-Automobiliste.} /es2i/staff/chris : cat gsub BEGIN {print "Deliquescence du couple Automobile-Automobiliste."} $1 == "Francois" {chaine =$1 $2} END {while (chaine != "") { print chaine x=gsub(/[a-zA-Z]$/,"",chaine) /es2i/staff/chris : nawk -f gsub Chauffeurs } Deliquescence du couple Automobile-Automobiliste. exit FrancoisPeugeot } FrancoisPeugeo /es2i/staff/chris : FrancoisPeuge FrancoisPeug FrancoisPeu FrancoisPe FrancoisP Francois Francoi Franco Franc Fran Fra Fr F /es2i/staff/chris : 43

Dpartement dInformatique

Universit de la Mditerranne

C. Aperghis-Tramoni

Les tableaux.
Les tableaux serviront au stockage de toutes les donnes (chaines ou valeurs). Ils ne sont pas dclars. Crer le tableau contenant les noms de tous les chauffeurs et les trier.
/es2i/staff/chris : cat tri {Chauffeurs[NR] = $1} END {for (i=NR;i>=1;i--) for (j=2;j<=i-1;j++) if (Chauffeurs[j] > Chauffeurs[j+1]) { Temp=Chauffeurs[j] Chauffeurs[j]=Chauffeurs[j+1] Chauffeurs[j+1]=Temp } /es2i/staff/chris : nawk -f tri Chauffeurs for (i=1;i<=NR;i++) print Chauffeurs[i] Jean } Alain /es2i/staff/chris : Albert Charles Claude Francois Luc Marc Michel Norbert Pierre Robert Serge /es2i/staff/chris :

Dpartement dInformatique

44

Universit de la Mditerranne

C. Aperghis-Tramoni

Les indices de tableaux.


La caractristique principale des tableaux utiliss en awk, est que les indices ne sont pas des uniquement des valeurs entires, mais peuvent tre des chaines de caractres. On les appelle ces structures des tableaux associatifs. Compter le nombre de voitures de chaque marque.
es2i/staff/chris : cat tableau /Peugeot/ {Nombre["Peugeot"] +=1} /Renault/ {Nombre["Renault"] +=1} /Citroen/ {Nombre["Citroen"] +=1} /Toyota/ {Nombre["Toyota"] +=1} END { print "Nombre de Peugeots : ", Nombre["Peugeot"] print "Nombre de Renaults : ", Nombre["Renault"] print "Nombre de Citroens : ", Nombre["Citroen"] print "Nombre de Toyotas : ", Nombre["Toyota"] } /es2i/staff/chris : nawk -f tableau Chauffeurs Nombre de Peugeots : 5 Nombre de Renaults : 3 Nombre de Citroens : 2 Nombre de Toyotas : 3 /es2i/staff/chris :
Dpartement dInformatique

45

Universit de la Mditerranne

C. Aperghis-Tramoni

Les fonctions.
Comme dans la majorit des langages, il est possible lusager de dnir ses propres fonctions.

function nom (liste-de-paramtres) {Liste-dinstructions} La dnition du corps des fonctions est entirement spare du corps du programme de base. Le corps de la fonction peut comporter linstruction return qui a pour effet de renvoyer une valeur ou un tat vers linstruction appelante.

Dpartement dInformatique

46

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemple de fonction.
/es2i/staff/chris : cat fonction {printf ("%s roule au %s\n",$1,carburant($5))} function carburant(prix) { if (prix < 4.00) { return "Diesel"} if (prix <= 5.30) { return "Super sans plomb"} if (prix > 5.30) { return "Super"} } /es2i/staff/chris :

Dterminer le carburant utilis en fonction du prix.

/es2i/staff/chris : nawk -f fonction Chauffeurs Jean roule au Super Claude roule au Diesel Pierre roule au Super sans plomb Robert roule au Super sans plomb Alain roule au Super sans plomb Marc roule au Super Michel roule au Super sans plomb Norbert roule au Super sans plomb Francois roule au Diesel Serge roule au Super Luc roule au Super sans plomb Albert roule au Diesel Charles roule au Super /es2i/staff/chris :
Dpartement dInformatique

47

Universit de la Mditerranne

C. Aperghis-Tramoni

Les entres
Nous avons dj vu une possibilit de fournir des donnes la commande awk, cest dutiliser un chier qui contient les donnes et de soummettre ce chier au traitement dun programme qui peut tre soit explicit dans la commande ou stock lui aussi dans un chier programme.

awk programme chier-de-donnes awk -f chier-de-programme chier-de-donnes

Il aurait t possible dutiliser les tubes.


/es2i/staff/chris : grep Peugeot Chauffeurs | nawk $4>=500 {print $1, roule beaucoup} Robert roule beaucoup Serge roule beaucoup /es2i/staff/chris :

Dpartement dInformatique

48

Universit de la Mditerranne

C. Aperghis-Tramoni

La fonction getline.
La fonction getline lit lenregistrement suivant sur lentre et incrmente NR. Si il ny a pas derreur, elle retourne la valeur 1. Si cest la n de chier, elle retourne la valeur 0. Si il y a un problme, elle retourne la valeur -1. Lecture de la ligne courante du chier Chauffeurs : getline < Chauffeurs Placer dans la variable enr la ligne courante du chier Chauffeurs : getline x < Chauffeurs Ainsi, tous les programmes vus jusquici peuvent tre rcrits placs dans BEGIN en utilisant la fonction getline. Lexcution est alors ralise par la commande : awk -f chier-de-programme

Dpartement dInformatique

49

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemple de fonction getline.


/es2i/staff/chris : cat getline BEGIN { while (getline < "Chauffeurs" > 0) { if (NF != 5) {print $0 "Nombre de champs different de 5"} if ($3 > 15) {print $1 " semble consommer beaucoup."} if ($4 > 500) {print $1 " roule beaucoup."} if ($4 < 200) {print $1 " roule peu."} if ($5 > 5.50) {print $1 " paye son essence un peu cher."} } } /es2i/staff/chris : nawk -f getline Chauffeurs Pierre roule peu. Robert roule beaucoup. Alain roule peu. Marc semble consommer beaucoup. Francois semble consommer beaucoup. Serge roule beaucoup. Serge paye son essence un peu cher. Luc roule beaucoup. /es2i/staff/chris :

Dpartement dInformatique

50

Universit de la Mditerranne

C. Aperghis-Tramoni

Interactions.
Comme pour toute commande unix, la sortie dirige de manire standard dur stdout par print ou printf, peut tre redirige au moyen de la redirection (>) vers tout chier ou pipe (|) vers une autre commande. awk {print $1} Chauffeurs > noms awk {print $2} Chauffeurs >> noms awk {print $1} Chauffeurs| cat cat Chauffeurs | awk {print $1}

Dpartement dInformatique

51

Universit de la Mditerranne

C. Aperghis-Tramoni

La fonction system.
La commande system (expresion) excute la commande expression donne sous forme de chaine de caractres.
/es2i/staff/chris : cat system BEGIN { system("ps") } /es2i/staff/chris : nawk -f system PID TTY TIME COMMAND 2841 ttyq0 0:00 ps 2840 ttyq0 0:00 sh 2648 ttyq0 0:00 csh 2839 ttyq0 0:00 nawk /es2i/staff/chris :

Dpartement dInformatique

52

Universit de la Mditerranne

C. Aperghis-Tramoni

Les modles de recherche sur les chaines.


Type /expression rgulire/ Signication.
Slectionne la ligne courante lorsquune sous chaine est valide en fonction de lexpression rgulire. Slectionne la ligne courante si la chaine expression contient une sous chaine valide en fonction de lexpression rgulire. Slectionne la ligne courante si la chaine expression ne contient pas une sous chaine valide en fonction de lexpression rgulire.

expression~/expression rgulire/

expression!~/expression rgulire/

Dpartement dInformatique

53

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemples
Quelles sont toutes les lignes qui contiennent le modle ne.
/es2i/staff/chris : nawk '/ne/' sonnet Ou bien, si tu ne peux, o terre, cache moi Je ne saurais plus vivre, et me fache d'attendre. Ayant de leurs rayons mon ame gouvernee. Et me fit de ses pieds accomplir ma journee. /es2i/staff/chris :

Quelles sont toutes les lignes qui contiennent le modle ne en fait, le mot ne..
/es2i/staff/chris : nawk '/ ne /' sonnet Ou bien, si tu ne peux, o terre, cache moi Je ne saurais plus vivre, et me fache d'attendre. /es2i/staff/chris :

Dpartement dInformatique

54

Universit de la Mditerranne

C. Aperghis-Tramoni

L'oprateur ~ (tilda).

Si la chaine laquelle on dsire soumettre lexpression rgulire nest pas dans la variable prdnie $_ loprateur =~ va nous permettre de soumettre lexpression rgulire qui se trouve sa droite la variable qui se trouve sa gauche. Le rsultat de cette opration est vrai si une concordance est trouve, faux sinon.

Dpartement dInformatique

55

Universit de la Mditerranne

C. Aperghis-Tramoni

Application.
Trouver toutes les lignes dans /es2i/staff/chris : nawk '$1 ~/e/' sonnet lesquelles le premier champ Terre, ouvre-moi ton sein, et me laisse reprendre Le trait qui la tua devait faire descendre contient au moins un e.
Je ne saurais plus vivre, Le bonheur de les voir, a Maintenant je suis mort : Loger dedans ses yeux, en /es2i/staff/chris : et me fache d'attendre. l'heure je vivais, la Mort qui s'en alla parlant m'appela,

Trouver toutes les lignes dans /es2i/staff/chris : nawk '$1 !~/e/' sonnet lesquelles le premier champ Mon tresor, que ta parque a cache dessous toi; Ou bien, si tu ne peux, o terre, cache moi ne contient pas de e.
Sous meme sepulture, avec sa belle cendre. Remarques : Le premier champ dune ligne vide ne contient pas de e. Le premier champ de la ligne ne contient pas un e, il contient un E. Mon corps aupres du sien pour finir mon emoi; Aussi bien, vu le mal qu'en sa mort je recoit, Quand ses yeux m'eclairaient, et qu'en terre j'avais Ayant de leurs rayons mon ame gouvernee. Et me fit de ses pieds accomplir ma journee. /es2i/staff/chris :

Dpartement dInformatique

56

Universit de la Mditerranne

C. Aperghis-Tramoni

Les expressions rgulires.


Ce sont des expressions spciques contenant des symboles particuliers permettant la slection de nimporte quelle sous chaine.
Une expression rgulire est toujours place entre deux slash. (/expression rgulire/). Mtacaractres. Ce sont des aractres rservs : \ ^ $ [ ] | ( ) * + ? Si lon veut exprimer un de ces caractres, il est indispensable de le faire prcder dun antislash \ \$ pour le caractre $ \\ pour le caractre \ De plus ^ permet de slectionner un dbut de chaine. $ permet de slectionner une n de chaine. . permet de slectionner un caractre.

Dpartement dInformatique

57

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemples.
^F e$ ^le$ ^.$ ... \.$ : Recherche dun F au dbut de la chaine. : Recherche dun e en n de chaine. : Recherche de la chaine compose des deux caractres le. : Recherche de la chaine compose dun seul caractre. : Recherche de toute chaine compose de trois caractres. : Recherche dun point . en n de chaine.

Quelles sont les lignes qui commencent par un L. /es2i/staff/chris : nawk '/^L/' sonnet Le trait qui la tua devait faire descendre Le bonheur de les voir, a l'heure je vivais, Loger dedans ses yeux, en parlant m'appela, /es2i/staff/chris :

Dpartement dInformatique

58

Universit de la Mditerranne

C. Aperghis-Tramoni

Exemples.
Quelles sont les lignes qui se terminent par un e. /es2i/staff/chris : nawk '/e$/' sonnet Terre, ouvre-moi ton sein, et me laisse reprendre Le trait qui la tua devait faire descendre /es2i/staff/chris : Imprimer les lignes blanches !!! /es2i/staff/chris : nawk '/^$/' sonnet

/es2i/staff/chris : Quelles sont les lignes qui se terminent par un ;. /es2i/staff/chris : nawk '/\;$/' sonnet Mon tresor, que ta parque a cache dessous toi; Mon corps aupres du sien pour finir mon emoi; /es2i/staff/chris :

Dpartement dInformatique

59

Universit de la Mditerranne

C. Aperghis-Tramoni

Les classes de caractres.


Une expression rgulire consistant en un groupe de caractres entre crochets est appele classe de caractres. Si le caractre ^ prcde la classe ( lintrieur des crochets) alors il sagit de la classe complmentaire.
[AEIOU] [^AEIOU] ^[^AEIOU] ^[^a-z-] [a-zA-Z][0-9] : Slection des caractres A, E, I, O, U. : Slection de tous les caractres sauf A, E, I, O, U. : Slection de tous les caractres en dbut de chaine sauf A, E, I, O, U. : Slection de toute chaine de un caractre ntant ni une minuscule ni un -. : Slection de toute chaine de deux caractres, une lettre majuscule ou minuscule suivie dun chiffre.

Remarque : A litrieur dune classe de caractres, tout caractre admet sa signication propre, sauf \ et ^plac au dbut et - entre deux caractres. [.] : Slection du caractre . ^[^^] : Slection de tout caractre en dbut de chaine sauf ^.

Dpartement dInformatique

60

Universit de la Mditerranne

C. Aperghis-Tramoni

Les oprateurs binaires.


Il y a deux oprateurs binaires sur les expressions rgulires : lintersection (et) lunion (ou) Si r1 et r2 sont deux expressions rgulires, alors : r1 | r2 slectionne toute chaine valide par r1 ou par r2. (r1)(r2) slectionne toute chaine de la forme AB, ou r1 valide A et r2 valide B. Trouver toutes les lignes contenant deux caractres quelconques suivis de la chaine ai /es2i/staff/chris : nawk '/([a-zA-Z][a-zA-Z])(ai)/' sonnet Terre, ouvre-moi ton sein, et me laisse reprendre Le trait qui la tua devait faire descendre Je ne saurais plus vivre, et me fache d'attendre. Quand ses yeux m'eclairaient, et qu'en terre j'avais Le bonheur de les voir, a l'heure je vivais, /es2i/staff/chris :

Dpartement dInformatique

61

Universit de la Mditerranne

C. Aperghis-Tramoni

Les oprateurs unaires.


Les oprateurs + * et ? sont utiliss pour spcier des rptitions dans les expressions rgulires. (r)* (r)+ (r)? : Toute chaine consistant en zro ou n sous chaines conscutives de modle r. : Toute chaine consistant en une ou n sous chaines conscutives de modle r. : Toute chaine de modle r ou la chaine nulle..

A* : La chaine nulle ou A ou AA ou AAA .... Ab*A : La chaine AA ou AbA ou AbbA .... Ab?A : La chaine AA ou AbA Ab+A : La chaine AbA ou AbbA .... Abb*A : La chaine AbA ou AbbA .... [A-Z]+ : Toute chaine de une ou plusieurs lettres majuscules. (AA)+e : La chaine AAe ou AAAAe ou AAAAAAe .... Reconnaissance dun nombre rel comportant un signe optionnel et un exposant optionnel : ^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$
Dpartement dInformatique

62

Universit de la Mditerranne

C. Aperghis-Tramoni

Rcapitulatif.
EXPRESSION c \m ^ $ . [c1c2...] [^c1c2...] [c1-c2] r1|r2 (r1)(r2) (r)* (r)+ (r)? (r) MODELE RECONNU Tout non mtacaractre c. Une squence de tabulation ou tout mtacaractre m pris au sens litral. Test effectu au dbut de la chaine. Test effectu la n de la chaine. Tout caractre sauf une n de ligne. Tout caractre expressment list entre les crochets. Tout caractre exept ceux qui sont expressment lists entre les crochets. Tout caractre appartenant lintervalle c1 c2, bornes comprises. Toute chaine de caractres valide soit par r1 soit par r2. Toute chaine de caractres de type AB, dans laquelle lexpression rgulire r1 valide A et lexpression rgulire r2 valide B. Zro n chaines conscutives valides par lexpression rgulire r. Une n chaines conscutives valides par lexpression rgulire r. Toute chaine valide par lexpression r, chaine vide incluse. Toute chaine valide par lexpression r, chaine vide exclue.

Dpartement dInformatique

63

Universit de la Mditerranne

C. Aperghis-Tramoni

Les compositions de modles.


&& -> Et || -> Ou Nous avons dja voqu les compositions de modles. ! -> Non Un intervale de modles est un doublet Mod1,Mod2 de modles spars par une virgule. Un intervalle de modles valide toutes les lignes comprises entre la premire occurence de Mod1 et loccurence suivante de Mod2. Si Mod1 et Mod2 font partie de la mme ligne alors (en thorie) cette ligne et cette ligne seulement est slectionne. Editer toutes les lignes comprises entre celle qui contient le mot bien et celle qui contient le mot mal.
/es2i/staff/chris : nawk '/bien/,/mal/' sonnet Ou bien, si tu ne peux, o terre, cache moi Sous meme sepulture, avec sa belle cendre. Le trait qui la tua devait faire descendre Mon corps aupres du sien pour finir mon emoi; Aussi bien, vu le mal qu'en sa mort je recoit, /es2i/staff/chris :

Dpartement dInformatique

64

Universit de la Mditerranne