Professional Documents
Culture Documents
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
Tous les types de donnes
-> tiquettes,
-> fonctions,
-> chiers,
-> rpertoires
ont leur propre zone didentication.
Dpartement dInformatique
Universit de la Mditerranne
C. Aperghis-Tramoni
/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
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
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.
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
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
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
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
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
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
Dpartement dInformatique
23
Universit de la Mditerranne
C. Aperghis-Tramoni
Dpartement dInformatique
24
Universit de la Mditerranne
C. Aperghis-Tramoni
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
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
Dpartement dInformatique
28
Universit de la Mditerranne
C. Aperghis-Tramoni
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
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
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
Dpartement dInformatique
35
Universit de la Mditerranne
C. Aperghis-Tramoni
Dpartement dInformatique
36
Universit de la Mditerranne
C. Aperghis-Tramoni
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
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
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 :
/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.
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
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
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
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
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
Dpartement dInformatique
61
Universit de la Mditerranne
C. Aperghis-Tramoni
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
Dpartement dInformatique
64
Universit de la Mditerranne