1 |
cam 08/10/10 23:54:55 |
2 |
|
3 |
Added: l-awk1.xml |
4 |
Log: |
5 |
#240558 New translation: articles/l-awk1.xml -- Thanks to Christophe Lefebvre |
6 |
|
7 |
Revision Changes Path |
8 |
1.1 xml/htdocs/doc/fr/articles/l-awk1.xml |
9 |
|
10 |
file : http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/fr/articles/l-awk1.xml?rev=1.1&view=markup |
11 |
plain: http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/fr/articles/l-awk1.xml?rev=1.1&content-type=text/plain |
12 |
|
13 |
Index: l-awk1.xml |
14 |
=================================================================== |
15 |
<?xml version="1.0" encoding="UTF-8"?> |
16 |
<!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/fr/articles/l-awk1.xml,v 1.1 2008/10/10 23:54:55 cam Exp $ --> |
17 |
<!DOCTYPE guide SYSTEM "/dtd/guide.dtd"> |
18 |
|
19 |
<guide link="/doc/fr/articles/l-awk1.xml" lang="fr" disclaimer="articles"> |
20 |
<title>Awk par l'exemple, 1re partie</title> |
21 |
|
22 |
<author title="Auteur"> |
23 |
<mail link="drobbins@g.o">Daniel Robbins</mail> |
24 |
</author> |
25 |
<author title="Traducteur"> |
26 |
<mail link="clefebvre.62@××××.fr">Christophe Lefebvre</mail> |
27 |
</author> |
28 |
|
29 |
<abstract> |
30 |
Awk est un langage très intéressant avec un nom étrange. Dans ce premier |
31 |
article d'une série en 3 parties, Daniel Robbins va rapidement améliorer votre |
32 |
niveau en programmation Awk. Au fur et à mesure que nous progresserons, des |
33 |
sujets plus avancés seront abordés, avec en conclusion une démonstration |
34 |
avancée d'une application Awk dans le monde réel. |
35 |
</abstract> |
36 |
|
37 |
<!-- The original version of this article was published on IBM developerWorks, |
38 |
and is property of Westtech Information Services. This document is an updated |
39 |
version of the original article, and contains various improvements made by the |
40 |
Gentoo Linux Documentation team --> |
41 |
|
42 |
<version>1.4</version> |
43 |
<date>2008-01-08</date> |
44 |
|
45 |
<chapter> |
46 |
<title>Une introduction au grand langage au nom étrange</title> |
47 |
<section> |
48 |
<title>Pour la défense d'Awk</title> |
49 |
<body> |
50 |
|
51 |
<p> |
52 |
Dans cette série d'articles, je vais vous aider à devenir un codeur Awk |
53 |
compétent. Je l'admets, Awk n'a un nom ni très élégant, ni « cool », |
54 |
et la version GNU d'Awk, appelée gawk, a un nom complètement surnaturel. Ceux |
55 |
qui ne sont pas familiers avec ce langage peuvent entendre « awk » et |
56 |
penser à un langage compliqué et archaïque, capable de conduire le gourou Unix |
57 |
le plus compétent au bord de la folie ! |
58 |
</p> |
59 |
|
60 |
<p> |
61 |
D'accord, Awk n'a pas un grand nom. Mais c'est un grand langage. Awk est |
62 |
destiné au traitement de texte et à la génération de rapports, bien qu'il |
63 |
présente de nombreuses fonctionnalités bien conçues pour programmer |
64 |
sérieusement. Et à la différence de quelques langages, Awk a une syntaxe |
65 |
familière et emprunte certaines des meilleures parties des langages tels que le |
66 |
C, Python et Bash (bien que techniquement, Awk ait été créé avant Python et |
67 |
Bash). Awk est l'un de ces langages qui, une fois appris, deviendra un outil |
68 |
majeur de vos stratégies de développement. |
69 |
</p> |
70 |
|
71 |
</body> |
72 |
</section> |
73 |
<section> |
74 |
<title>Le premier awk</title> |
75 |
<body> |
76 |
|
77 |
<pre caption="Le premier awk"> |
78 |
$ <i>awk '{ print }' /etc/passwd</i> |
79 |
</pre> |
80 |
|
81 |
<p> |
82 |
Vous devez voir le contenu de votre fichier <path>/etc/passwd</path> apparaître |
83 |
devant vos yeux. Maintenant, une explication de ce qu'awk fait. Quand nous |
84 |
avons lancé awk, nous avons spécifié <path>/etc/passwd</path> comme fichier en |
85 |
entrée. Quand nous avons exécuté awk, il a traité la commande print pour chaque |
86 |
ligne de <path>/etc/passwd</path>, dans l'ordre. Tous les résultats ont été |
87 |
envoyés vers stdout et nous obtenons un résultat identique à <c>cat</c> |
88 |
<path>/etc/passwd</path>. |
89 |
</p> |
90 |
|
91 |
<p> |
92 |
Maintenant, une explication du bloc de code { print }. Dans awk, les accolades |
93 |
sont utilisées pour grouper des blocs de code ensemble, comme en C. À |
94 |
l'intérieur de notre bloc de code, nous avons une simple commande |
95 |
« print ». Dans awk, quand une commande « print » apparaît |
96 |
seule, le contenu complet de la ligne courante est affiché. |
97 |
</p> |
98 |
|
99 |
<pre caption="Afficher la ligne courante"> |
100 |
$ <i>awk '{ print $0 }' /etc/passwd</i> |
101 |
$ <i>awk '{ print "" }' /etc/passwd</i> |
102 |
</pre> |
103 |
|
104 |
<p> |
105 |
Dans awk, la variable $0 représente la ligne courante entière, donc |
106 |
« print » et « print $0 » donnent exactement la même chose. |
107 |
</p> |
108 |
|
109 |
<pre caption="Remplir l'écran avec du texte"> |
110 |
$ <i>awk '{ print "hiya" }' /etc/passwd</i> |
111 |
</pre> |
112 |
|
113 |
</body> |
114 |
</section> |
115 |
<section> |
116 |
<title>Plusieurs champs</title> |
117 |
<body> |
118 |
|
119 |
<pre caption="print $1"> |
120 |
$ <i>awk -F":" '{ print $1 $3 }' /etc/passwd</i> |
121 |
halt7 |
122 |
operator11 |
123 |
root0 |
124 |
shutdown6 |
125 |
sync5 |
126 |
bin1 |
127 |
<comment>etc.</comment> |
128 |
</pre> |
129 |
|
130 |
<pre caption="print $1 $3"> |
131 |
$ <i>awk -F":" '{ print $1 " " $3 }' /etc/passwd</i> |
132 |
</pre> |
133 |
|
134 |
<pre caption="$1$3"> |
135 |
$ <i>awk -F":" '{ print "username: " $1 "\t\tuid:" $3 }' /etc/passwd</i> |
136 |
username: halt uid:7 |
137 |
username: operator uid:11 |
138 |
username: root uid:0 |
139 |
username: shutdown uid:6 |
140 |
username: sync uid:5 |
141 |
username: bin uid:1 |
142 |
<comment>etc.</comment> |
143 |
</pre> |
144 |
|
145 |
</body> |
146 |
</section> |
147 |
<section> |
148 |
<title>Les scripts externes</title> |
149 |
<body> |
150 |
|
151 |
<pre caption="Exemple de script"> |
152 |
BEGIN { FS=":" } |
153 |
{ print $1 } |
154 |
</pre> |
155 |
|
156 |
<p> |
157 |
La différence entre ces deux méthodes est la façon dont nous avons précisé le |
158 |
séparateur de champs « : ». Dans ce script, le séparateur de champs |
159 |
est spécifié à l'intérieur même du code (en renseignant la variable FS |
160 |
« Field Separator »), alors que notre exemple précédent renseigne la |
161 |
variable FS en utilisant l'option -F":" d'awk sur la ligne de commande. Il est |
162 |
en général plus judicieux de renseigner le séparateur de champs à l'intérieur |
163 |
du script même, simplement parce que vous avez ainsi un argument en ligne de |
164 |
commande en moins à vous rappeler de taper. Nous aborderons la variable FS plus |
165 |
en détail, ultérieurement dans cet article. |
166 |
</p> |
167 |
|
168 |
</body> |
169 |
</section> |
170 |
<section> |
171 |
<title>Les blocs BEGIN et END</title> |
172 |
<body> |
173 |
|
174 |
<p> |
175 |
Normalement, awk exécute chaque bloc du code de votre script une fois pour |
176 |
chaque ligne en entrée. Cependant, dans de nombreuses situations en |
177 |
programmation, vous pouvez avoir besoin d'exécuter du code d'initialisation |
178 |
avant qu'awk ne commence à traiter le texte à partir du fichier en entrée. Pour |
179 |
ces situations, awk permet de définir un bloc BEGIN. Nous avons utilisé un bloc |
180 |
BEGIN dans l'exemple précédent. Parce que le bloc BEGIN est évalué avant qu'awk |
181 |
ne commence à traiter le fichier d'entrée, c'est le meilleur endroit pour |
182 |
initialiser la variable FS (séparateur de champs), afficher un en-tête, ou |
183 |
initialiser d'autres variables globales que vous réutiliserez plus tard dans le |
184 |
programme. |
185 |
</p> |
186 |
|
187 |
<p> |
188 |
Awk fournit aussi un autre bloc spécial, appelé le bloc END. Awk exécute ce |
189 |
bloc après que toutes les lignes du fichier d'entrée aient été traitées. |
190 |
Généralement, le bloc END est utilisé pour réaliser des calculs finaux ou pour |
191 |
afficher des résumés qui doivent apparaître à la fin du flux de sortie. |
192 |
</p> |
193 |
|
194 |
</body> |
195 |
</section> |
196 |
<section> |
197 |
<title>Expressions rationnelles et blocs</title> |
198 |
<body> |
199 |
|
200 |
<pre caption="Expressions rationnelles et blocs"> |
201 |
/foo/ { print } |
202 |
/[0-9]+\.[0-9]*/ { print } |
203 |
</pre> |
204 |
|
205 |
</body> |
206 |
</section> |
207 |
<section> |
208 |
<title>Expressions et blocs</title> |
209 |
<body> |
210 |
|
211 |
<pre caption="fredprint"> |
212 |
$1 == "fred" { print $3 } |
213 |
</pre> |
214 |
|
215 |
<pre caption="root"> |
216 |
$5 ~ /root/ { print $3 } |
217 |
</pre> |
218 |
|
219 |
</body> |
220 |
</section> |
221 |
<section> |
222 |
<title>Tests conditionnels</title> |
223 |
<body> |
224 |
|
225 |
<pre caption="if"> |
226 |
{ |
227 |
if ( $5 ~ /root/ ) { |
228 |
print $3 |
229 |
} |
230 |
} |
231 |
</pre> |
232 |
|
233 |
<p> |
234 |
Les deux scripts fonctionnent de la même façon. Dans le premier exemple, |
235 |
l'expression booléenne est placée en dehors du bloc, alors que dans le second |
236 |
exemple, le bloc est exécuté pour chaque ligne en entrée et nous avons |
237 |
sélectivement réalisé la commande « print » en utilisant un test |
238 |
« if ». Les deux méthodes sont valables et vous pouvez choisir celle |
239 |
qui est le plus en adéquation avec les autres parties de votre script. |
240 |
</p> |
241 |
|
242 |
<pre caption="if if"> |
243 |
{ |
244 |
if ( $1 == "foo" ) { |
245 |
if ( $2 == "foo" ) { |
246 |
print "uno" |
247 |
} else { |
248 |
print "one" |
249 |
} |
250 |
} else if ($1 == "bar" ) { |
251 |
print "two" |
252 |
} else { |
253 |
print "three" |
254 |
} |
255 |
} |
256 |
</pre> |
257 |
|
258 |
<pre caption="if"> |
259 |
! /matchme/ { print $1 $3 $4 } |
260 |
</pre> |
261 |
|
262 |
<pre caption="if"> |
263 |
{ |
264 |
if ( $0 !~ /matchme/ ) { |
265 |
print $1 $3 $4 |
266 |
} |
267 |
} |
268 |
</pre> |
269 |
|
270 |
<p> |
271 |
Les deux scripts n'affichent que les lignes ne contenant pas une séquence de de |
272 |
caractères qui corresponde à « matchme ». Ici encore, vous pouvez |
273 |
choisir la méthode qui convient le mieux pour votre code. Les deux scripts font |
274 |
la même chose : |
275 |
</p> |
276 |
|
277 |
<pre caption="Afficher les champs correspondant à foo et à bar"> |
278 |
( $1 == "foo" ) && ( $2 == "bar" ) { print } |
279 |
</pre> |
280 |
|
281 |
<p> |
282 |
Cet exemple affiche seulement les lignes dont le premier champ vaut |
283 |
« foo » et dont le deuxième champ vaut « bar ». |
284 |
</p> |
285 |
|
286 |
</body> |
287 |
</section> |
288 |
<section> |
289 |
<title>Variables numériques !</title> |
290 |
<body> |
291 |
|
292 |
<p> |
293 |
Dans le bloc BEGIN, nous initialiserions une variable x à zéro. Alors, chaque |
294 |
fois qu'awk rencontrerait une ligne vide, il exécuterait x=x+1, incrémentant x. |
295 |
Après que toutes les lignes aient été traitées, le bloc END serait exécuté et |
296 |
awk afficherait un résumé final spécifiant le nombre de lignes vides trouvées. |
297 |
</p> |
298 |
|
299 |
</body> |
300 |
</section> |
301 |
<section> |
302 |
<title>Variables avec des caractères</title> |
303 |
<body> |
304 |
|
305 |
<pre caption="Exemple"> |
306 |
2.01 |
307 |
</pre> |
308 |
|
309 |
<pre caption="1.01x$( )1.01"> |
310 |
{ print ($1^2)+1 } |
311 |
</pre> |
312 |
|
313 |
<p> |
314 |
Si vous expérimentez un peu, vous verrez que si une variable ne contient pas un |
315 |
nombre valide, awk traitera cette variable comme un zéro numérique quand il |
316 |
évaluera votre expression mathématique. |
317 |
</p> |
318 |
|
319 |
</body> |
320 |
</section> |
321 |
<section> |
322 |
<title>Plein d'opérateurs</title> |
323 |
<body> |
324 |
|
325 |
<p> |
326 |
Une autre chose intéressante d'awk est son complément d'opérateurs |
327 |
mathématiques. En plus de l'addition, soustraction, multiplication et |
328 |
division, awk nous permet d'utiliser l'opérateur exposant « ^ » |
329 |
utilisé précédemmment, l'opérateur modulo « % » (reste de division) |
330 |
et d'autres opérateurs empruntés au C. |
331 |
</p> |
332 |
|
333 |
<p> |
334 |
Cela inclut la pré et la post-incrémentation/decrémentation (i++, --foo), des |
335 |
opérateurs d'assignation add/sub/mult/div (a+=3, b*=2, c/=2.2, d-=6.2). Mais ce |
336 |
n'est pas tout : nous avons aussi les opérateurs d'assignation |
337 |
modulo/exposant (a^=2, b%=4). |
338 |
</p> |
339 |
|
340 |
</body> |
341 |
</section> |
342 |
<section> |
343 |
<title>Les séparateurs de champs</title> |
344 |
<body> |
345 |
|
346 |
<p> |
347 |
Awk a son propre complément de variables spéciales. Certaines d'entre elles |
348 |
vous permettent de bien peaufiner vos fonctions awk, alors que d'autres peuvent |
349 |
être utilisées pour récupérer de l'information pertinente sur les données en |
350 |
entrée. Nous avons déjà abordé une de ces variables spéciales, FS. Comme |
351 |
mentionné précédemment, cette variable vous permet de préciser une séquence de |
352 |
caractères qu'awk vise à trouver entre les champs. Quand nous utilisions |
353 |
<path>/etc/passwd</path> en entrée, FS était à « : ». Bien qu'il ait |
354 |
fait son travail, FS nous permet encore plus de flexibilité. |
355 |
</p> |
356 |
|
357 |
<pre caption="Un autre séparateur de champ"> |
358 |
FS="\t+" |
359 |
</pre> |
360 |
|
361 |
<p> |
362 |
Ci-dessus, nous utilisons le caractère spécial d'expression rationnelle |
363 |
« + », qui signifie « une ou plusieurs occurrences du caractère |
364 |
précédent ». |
365 |
</p> |
366 |
|
367 |
<pre caption="Mettre une espace comme FS"> |
368 |
FS="[[:space:]+]" |
369 |
</pre> |
370 |
|
371 |
<p> |
372 |
Bien que cet assignement fasse son travail, il n'est pas nécessaire. |
373 |
Pourquoi ? Parce que, par défaut, FS correspond à un simple caractère |
374 |
d'espacement qu'awk interprète comme « une ou plusieurs espaces ou |
375 |
tabulations ». Dans cet exemple particulier, le paramètre par défaut de FS |
376 |
est exactement ce que nous recherchions ! |
377 |
</p> |
378 |
|
379 |
<pre caption="Exemple de séparateur de champ"> |
380 |
FS="foo[0-9][0-9][0-9]" |
381 |
</pre> |
382 |
|
383 |
</body> |
384 |
</section> |
385 |
<section> |
386 |
<title>Nombre de champs</title> |
387 |
<body> |
388 |
|
389 |
<pre caption="Nombre de champs"> |
390 |
{ |
391 |
if ( NF > 2 ) { |
392 |
print $1 " " $2 ":" $3 |
393 |
} |
394 |
} |
395 |
</pre> |
396 |
|
397 |
</body> |
398 |
</section> |
399 |
<section> |
400 |
<title>Nombre d'enregistrements</title> |
401 |
<body> |
402 |
|
403 |
<pre caption="Nombre d'enregistrements NR (Number of Records)"> |
404 |
{ |
405 |
<comment># Nous ne voulons pas afficher l'en-tête</comment> |
406 |
if ( NR > 10 ) { |
407 |
print "ok, now for the real information!" |
408 |
} |
409 |
} |
410 |
</pre> |
411 |
|
412 |
<p> |
413 |
Awk fournit des variables supplémentaires qui peuvent être utilisées dans une |
414 |
variété de situations. Nous aborderons la plupart de ces variables dans les |
415 |
prochains articles. |
416 |
</p> |
417 |
|
418 |
<p> |
419 |
Nous en sommes à la fin de notre première exploration d'Awk. Dans la suite de |
420 |
cette série, je décrirai des fonctionnalités plus avancées d'Awk et nous |
421 |
finirons la série avec une application Awk dans le monde réel. Dans le même |
422 |
temps, si vous êtes désireux d'en apprendre plus, consultez les ressources |
423 |
listées ci-dessous. |
424 |
</p> |
425 |
|
426 |
</body> |
427 |
</section> |
428 |
</chapter> |
429 |
|
430 |
<chapter> |
431 |
<title>Ressources</title> |
432 |
<section> |
433 |
<title>Liens utiles</title> |
434 |
<body> |
435 |
|
436 |
<ul> |
437 |
<!--<li> |
438 |
Lisez les autres articles de Daniel sur awk sur |
439 |
developerWorks : Common threads: Awk by example, <uri |
440 |
link="l-awk2.xml">Part 2</uri> and <uri link="l-awk3.xml">Part 3</uri>. |
441 |
</li>--> |
442 |
<li> |
443 |
Si vous recherchez un bon vieux livre, O'Reilly's <uri |
444 |
link="http://www.oreilly.com/catalog/sed2/">sed & awk, 2nd |
445 |
Edition</uri> est un très bon choix. |
446 |
</li> |
447 |
<li> |
448 |
Consultez aussi la <uri |
449 |
link="http://www.faqs.org/faqs/computer-lang/awk/faq/">FAQ |
450 |
comp.lang.awk</uri>. Elle contient de nombreux liens supplémentaires sur |
451 |
Awk. |
452 |
</li> |
453 |
<li> |
454 |
<uri link="http://sparky.rice.edu/~hartigan/awk.html">Awk tutorial</uri> de |
455 |
Patrick Hartigan est présenté avec des scripts awk avancés. |
456 |
</li> |
457 |
<li> |
458 |
<uri link="http://www.tasoft.com/tawk.html">Thompson's TAWK Compiler</uri> |
459 |
compile des scripts awk en exécutables binaires rapides. Des versions sont |
460 |
disponibles pour Windows, OS/2, DOS et UNIX. |
461 |
</li> |
462 |
<li> |
463 |
<uri link="http://www.gnu.org/software/gawk/manual/gawk.html">The GNU Awk |
464 |
User's Guide</uri> est disponible comme référence en ligne. |
465 |
</li> |
466 |
</ul> |
467 |
|
468 |
</body> |
469 |
</section> |
470 |
</chapter> |
471 |
</guide> |