Gentoo Archives: gentoo-commits

From: "Camille Huot (cam)" <cam@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo commit in xml/htdocs/doc/fr/articles: l-awk1.xml
Date: Fri, 10 Oct 2008 23:54:58
Message-Id: E1KoRot-0001GT-PQ@stork.gentoo.org
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 «&nbsp;cool&nbsp;»,
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 «&nbsp;awk&nbsp;» 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&nbsp;!
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 «&nbsp;print&nbsp;». Dans awk, quand une commande «&nbsp;print&nbsp;» 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 «&nbsp;print&nbsp;» et «&nbsp;print $0&nbsp;» 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 «&nbsp;:&nbsp;». 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 «&nbsp;Field Separator&nbsp;»), 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 «&nbsp;print&nbsp;» en utilisant un test
238 «&nbsp;if&nbsp;». 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 à «&nbsp;matchme&nbsp;». 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&nbsp;:
275 </p>
276
277 <pre caption="Afficher les champs correspondant à foo et à bar">
278 ( $1 == "foo" ) &amp;&amp; ( $2 == "bar" ) { print }
279 </pre>
280
281 <p>
282 Cet exemple affiche seulement les lignes dont le premier champ vaut
283 «&nbsp;foo&nbsp;» et dont le deuxième champ vaut «&nbsp;bar&nbsp;».
284 </p>
285
286 </body>
287 </section>
288 <section>
289 <title>Variables numériques&nbsp;!</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 «&nbsp;^&nbsp;»
329 utilisé précédemmment, l'opérateur modulo «&nbsp;%&nbsp;» (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&nbsp;: 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 à «&nbsp;:&nbsp;». 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 «&nbsp;+&nbsp;», qui signifie «&nbsp;une ou plusieurs occurrences du caractère
364 précédent&nbsp;».
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&nbsp;? Parce que, par défaut, FS correspond à un simple caractère
374 d'espacement qu'awk interprète comme «&nbsp;une ou plusieurs espaces ou
375 tabulations&nbsp;». Dans cet exemple particulier, le paramètre par défaut de FS
376 est exactement ce que nous recherchions&nbsp;!
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&nbsp;:&nbsp;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 &amp; 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>