[CLI Wiki] page changée : filtres:awk:presentation

noreply at asyd.net noreply at asyd.net
Sat Apr 18 02:12:21 CEST 2009


Une page dans votre Wiki a été ajoutée ou modifiée. Voici les 
détails :

Date              : 2009/04/18 02:12
Navigateur        : Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5
Adresse IP        : 82.255.12.23
Nom d'hôte        : lns-bzn-39-82-255-12-23.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1161856696
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé            : Corrections orthographiques et stylistiques.
Utilisateur       : christophemartin

@@ -1,147 +1,152 @@
  ====== Avant propos ======
  
- Cette page ne se veut certainement pas complete, ni une reference, ni un cours,
- ni quoi que ce soit. Ce n'est qu'une tres modeste introduction, juste pour
- donner envie et faire decouvrir le potentiel de cette commande.
+ Cette page ne se veut certainement pas complète, ni une référence, ni un cours,
+ ni quoi que ce soit. Ce n'est qu'une très modeste introduction, juste pour
+ donner envie et faire découvrir le potentiel de cette commande.
  
  ====== Qu'est ce que awk ? =======
  
- AWK est tout a la fois un langage et un programme portant ce meme nom. Le
- contexte permet en general de savoir de quoi on parle.
+ AWK est tout a la fois un langage et un programme portant ce même nom. Le
+ contexte permet en général de savoir de quoi on parle.
  
  ====== À quoi sert awk ? ======
  
  Awk est une sorte de grep programmable; donc ** awk traite des fichiers texte **.
- Mais en plus, de selectionner simplement des lignes, awk peut aussi travailler sur les colonnes tres simplement.  C'est meme
- **l'outil ideal quand on veut travailler sur les colonnes** d'un fichier texte.
- Mais awk est bien plus que ca, comme il y a un langage assez riche, on peut faire des calculs, avant de ce commencer a lire les
+ Mais en plus, de sélectionner simplement des lignes, awk peut aussi travailler sur les colonnes très simplement.  C'est même
+ **l'outil idéal quand on veut travailler sur les colonnes** d'un fichier texte.
+ 
+ Mais awk est bien plus que ça, comme il y a un langage assez riche, on peut faire des calculs, avant de commencer à lire les
  fichiers texte (initialiser tout un tas de trucs et de machins), faire des
- calculs apres avoir lu toutes les lignes de tous les fichiers, pour
- generer un rapport par exemple.
+ calculs après avoir lu toutes les lignes de tous les fichiers, pour
+ générer un rapport par exemple.
  
- Si awk est tres complexe -- plusieurs livres lui sont consacres -- il peut
- aussi etre infiniment simple et **pratique** pour un travail en ligne
- de commande au quotidien. Les exemples que nous donnons ci apres ne sont
- qu'une microscopique partie de la partie emergee de l'iceberg.
+ Si awk est très complexe -- plusieurs livres lui sont consacres -- il peut
+ aussi être infiniment simple et **pratique** pour un travail en ligne
+ de commande au quotidien. Les exemples que nous donnons ci après ne sont
+ qu'une microscopique partie de la partie émergée de l'iceberg.
  
  
  ====== Un peu d'histoire ======
  
- Aho Weinberger Kernighan se reunissent dans un bateau et tombent a l'eau
+ Aho Weinberger Kernighan se réunissent dans un bateau et tombent à l'eau
  Que reste-t-il ? AWK.
- On distinguera awk, la commande originale, encore trouvable sur des systemes
- dont l'historique est plus long que celui des jeunes et souvent plus familier
+ On distinguera awk, la commande originale, encore trouvable sur des systèmes
+ dont l'historique est plus long que celui des jeunes et souvent plus familiers
  GNU/Linux, tel que Solaris par
- exemple, du new awk (<CODE>nawk</CODE> sur ces systemes), (version normalisee POSIX ?) arrivee
- un peu plus tard sur le marche.
+ exemple, du new awk (nawk sur ces systèmes), (version normalisée POSIX ?) arrivée
+ un peu plus tard sur le marché.
  
- Les implementations GNU/Linux de awk, sont en fait des new awk. La presente
- page ne parle que de new awk. Conclusion, si vous desirez essayer les
- exemples, essayez d'abord avec une hypothetique commande nawk, si nawk n'existe
+ Les implémentations GNU/Linux de awk, sont en fait des new awk. La présente
+ page ne parle que de new awk. Conclusion, si vous désirez essayer les
+ exemples, essayez d'abord avec une hypothétique commande nawk, si nawk n'existe
  pas, essayez avec awk (ce sera sans doute un new awk).
  
- Derniere petite chose. On trouve en general la commande awk dans /usr/bin.
- Certains systemes GNU/linux ont eu la mauvaise idee de la mettre dans /bin.
- Pas tres grave, pensez vous car en general, les deux sont dans le **PATH**...
- Oui, mais tout de meme, on peut faire des scripts en awk, et le shebang
+ Dernière petite chose. On trouve en général la commande awk dans /usr/bin.
+ Certains systèmes GNU/linux ont eu la mauvaise idée de la mettre dans /bin.
+ Pas très grave, pensez vous car en général, les deux sont dans le **PATH**...
+ Oui, mais tout de même, on peut faire des scripts en awk, et le shebang
  (!# /usr/bin/awk -f) devient faux, et le script inutilisable si le binaire
  n'est pas la où on l'attend.
  
  ====== Les implémentations de awk ======
  
- Tout depend, et, pour reprendre la section precedente, on peut avoir a faire
+ Tout dépend, et, pour reprendre la section précédente, on peut avoir à faire
  au awk d'origine ou a un nawk.
  
  il y a donc :
-         * awk
-         * nawk (POSIX ?)
-         * mawk : tres bonne implementation de nawk, utilisee par defaut sur les systemes [[http://www.debian.org|Debian GNU/Linux]]
-         * gawk : encore une [[http://www.gnu.org|GNU]]rie. D'aucuns lui trouvent certains avantages, la possibilite de ne pas tenir compte de la casse (majuscule/minuscule), internationnalisation etc... Pleins d'extensions "non standard", gros, lent, mais certainement innovant.
-         * sans doute pleins d'autres, faites nous parvenir vos decouvertes.
+   * awk
+   * nawk (POSIX ?)
+   * mawk : implémentation petite et rapide de nawk, utilisée par défaut sur les systèmes [[http://www.debian.org|Debian GNU/Linux]], contient des bugs sévères non corrigés.
+   * gawk : encore une [[http://www.gnu.org|GNU]]rie. D'aucuns lui trouvent certains avantages, la possibilité de ne pas tenir compte de la casse (majuscule/minuscule), internationalisation etc... Pleins d'extensions "non standard", gros, lent, mais certainement innovant.
+   * sans doute pleins d'autres, faites nous parvenir vos découvertes.
  
  ====== Les rapports aux "autres" programmes de manipulations de données textes ======
  
  ===== sed / awk =====
  
-    * si vous voulez traiter des colonnes, ou des paragraphes entiers, utilisez si vous voulez juste remplacer une chaine par une autre dans un 
- texte, la coutume est d'utiliser sed. Si vous voulez extraire une ligne ou deux et faire un peu de
- modification de texte :
-    * si le critere de selection de ligne est immediat (presence
- d'un marqueur) utilisez sed
-    * Si le critere est complexe (la somme des nombres situes en
- colonne 4 et 7 est superieure a 25), utilisez awk
- d'une maniere general, sed n'a qu'une seule variable -- et seuls
- quelques vieux sages savent s'en servir --, donc, si les criteres
- font intervenir une memorisation quelconque, ou un calcul, utiliser
- awk
+   * si vous voulez traiter des colonnes, ou des paragraphes entiers, utilisez awk
+   * si vous voulez juste remplacer une chaine par une autre dans un texte, la coutume est d'utiliser sed.
+   * Si vous voulez extraire une ligne ou deux et faire un peu de modification de texte :
+     * si le critère de sélection de ligne est immédiat (présence d'un marqueur) utilisez sed
+     * Si le critère est complexe (la somme des nombres situés en colonne 4 et 7 est supérieure à 25), utilisez awk.
+ 
+ d'une manière général, sed n'a qu'une seule variable -- et seuls
+ quelques vieux sages savent s'en servir --, donc, si les critères
+ font intervenir une mémorisation quelconque, ou un calcul, utiliser
+ awk.
  
  ===== grep =====
  
- En utilisation courante, c'est egal. grep est plus direct et est
+ En utilisation courante, c'est égal. grep est plus direct et est
  l'outil classique. Disons que //bla | grep toto// indique clairement ce qu'on fait, alors que
  //bla | nawk /toto/ ...//
- necessite qu'on reflechisse a ce qui est fait par awk (car il peut
+ nécessite qu'on réfléchisse à ce qui est fait par awk (car il peut
  faire n'importe quoi)
  
  La version [[http://www.gnu/org|GNU]] de grep a bien
- des avantages, comme la coloration de la chaine recherchee. De plus grep
- peut afficher facilement des lignes de contexte avant et apres la
+ des avantages, comme la coloration de la chaine recherchée. De plus grep
+ peut afficher facilement des lignes de contexte avant et après la
  ligne recherchée (options -B -A et -C), ce qui nécessite un programme complet avec awk.
  
  ===== Perl =====
  
- Perl est une monster application. Son initialisation est tres longue,
- et tres couteuse (ouverture de nombreux fichiers, recherche de module
- dans un grand nombre de repertoires differents, etc...)
- Si c'est pour remplacer trois lettres dans une ligne, utiliser sed
- Si c'est pour extraire trois colonnes, utiliser awk
+ Perl est une //monster application//. Son initialisation est très longue,
+ et très couteuse (ouverture de nombreux fichiers, recherche de module
+ dans un grand nombre de répertoires différents, etc...)
+ Si c'est pour remplacer trois lettres dans une ligne, utiliser sed.
+ Si c'est pour extraire trois colonnes, utiliser awk.
  
- Serieusement, perl n'est pas comparable et ne joue pas dans la meme
- cour. Cela etant dit, dans un domaine bien particulier, et selon les
- dire du grand Larry lui meme, awk est superieur a perl. Selon la page
+ Sérieusement, perl n'est pas comparable et ne joue pas dans la même
+ cour. Cela étant dit, dans un domaine bien particulier, et selon les
+ dire du grand Larry lui même, awk est supérieur a perl. Selon la page
  de manuel de perlvar :
  
       Remember: the value of $/ is a string, not a regex.  awk has to
       be better for something. :-)
  
  ======Exécuter awk ======
  
- Non, nous ne parlons pas ici de mise a mort, mais de la maniere de se vervir
+ Non, nous ne parlons pas ici de mise à mort, mais de la manière de se servir
  de awk. L'invocation standard est :
  
  <code>
          awk 'commande awk' fichier fichier...
  </code>
  
- et cela signifie : executer la 'commande awk' pour l'ensemble des fichiers
+ et cela signifie : exécuter la 'commande awk' pour l'ensemble des fichiers
  exemple :
  
  <code>
          awk '{ print NR, $0 }' *.txt
  </code>
  
- Si aucun fichier n'est donne, awk lit son entree standard, ce qui fait
+ Si aucun fichier n'est donne, awk lit son entrée standard, ce qui fait
  qu'on peut l'utiliser dans les pipes, en filtre
  
  exemple :
  <code>
          ls -l | awk '{ print ; s += $5 } END { print "total =", s }'
  </code>
  
- Enfin, on peut definir des variables awk avant d'executer quoi que ce soit.
+ Enfin, on peut définir des variables awk avant d'exécuter quoi que ce soit.
  
  <code awk>
          ls | awk -v x=coucou '{ print x, $0 }'
  </code>
  
+ Et pour écrire un script en awk, il faut utiliser l'option -f ; le shabang doit donc être :
+ 
+ <code awk>
+ #! /usr/bin/awk -f
+ </code>
  ===== Des exemples simples ====
  
  Ces exemples simples permettent d'approcher doucement awk.
- L'idee de awk est que les lignes sont composees de colonnes; la definition
- de la colonne etant la definition naturelle.
+ L'idée de awk est que les lignes sont composées de colonnes; la définition
+ de la colonne étant la définition naturelle.
  
-    * extraire une ligne contenant un modele donne (une expression rationnelle)
+    * extraire une ligne contenant un modèle donné (une expression rationnelle)
  
  <code awk>
          grep 'regexp'
          nawk '/regexp/'
@@ -149,9 +154,9 @@
     * extraire la colonne 4
  <code awk>
          nawk '{ print $4 }'
  </code>
-    * extraire la derniere colonne
+    * extraire la dernière colonne
  <code awk>
          nawk '{ print $NF }'
  </code>
     * extraire la colonne 7 et 5, si le nombre en colonne 3 est plus grand que pi
@@ -167,9 +172,9 @@
  <code>
          nawk 'FNR % 2'
  </code>
  
- Si votre fichier a des colonnes separees par autre chose que des blancs,
+ Si votre fichier a des colonnes séparées par autre chose que des blancs,
  par exemple des : comme le fichier /etc/passwd, utiliser l'option -F
  exemple :
  
  <code awk>
@@ -177,126 +182,127 @@
  </code>
  
  
  Mais pourquoi utilise-t-on des { } de temps en temps mais pas toujours ?
- C'est parceque un script awk est compose de test et d'actions. Les actions
- son entourees de { } , pas les tests. Cela est explique dans la section
+ C'est parce qu'un script awk est composé de test et d'actions. Les actions
+ son entourées de { } , pas les tests. Cela est expliqué dans la section
  suivante.
  
  ====== Langage awk ======
  
  Entrons enfin dans le vif du sujet.
  
- Grosso modo le langage awk est du C (kernighan oblige), mais interprete
- et ou les variables peuvent etre de n'importe quel type. (entier, flotant
+ Grosso modo le langage awk est du C (kernighan oblige), mais interprété
+ et où les variables peuvent être de n'importe quel type. (entier, flottant
  ou chaine)
  
  on note les chaines entre "", comme dans x="coucou"
  
- les entiers et les flottants s'ecrivent normalement :
+ les entiers et les flottants s'écrivent normalement :
  
     * x=4
     * pi=3.14159
     * z=1.5e12
  
- **Attention a vos reglages internationnaux.** Si votre variable LC_ALL ou
+ **Attention a vos réglages internationaux** Si votre variable LC_ALL ou
  LC_NUMERIC vaut fr_FR ou un truc du genre, vous allez vous retrouver avec
  des nombres a ****virgule**** oui, a virgule, pas a point (.), et cela
  sera sans doute la cause de bien des maux.
  
- awk lit des enregistrements (des lignes) qu'il decoupe en champs (en colonnes).
- la ligne de base est aussi conservee sans modification.
- On peut changer ce reglage grace a des variables internes -- dont les noms
+ awk lit des enregistrements (des lignes) qu'il découpe en champs (en colonnes).
+ la ligne de base est aussi conservée sans modification.
+ On peut changer ce réglage grâce à des variables internes -- dont les noms
  sont toujours en majuscule -- Ici il s'agit des variable RS (Record Separator)
  et FS (Field Separator).
  
- Pour lire des paragraphes entiers et decouper en ligne, il faut que
- RS soit vide et que FS contienne un retour chariot
- S soit vide et que FS contienne un retour chariot
- exemple :
+ Pour lire des paragraphes entiers et découper en ligne, il faut que
+ RS soit vide et que FS contienne un retour chariot.
+ Exemple :
  <code awk>
          nawk 'BEGIN { RS="" ; FS = "\n" } { printf "enregistrement %3d, nombre de champs %d\n, %s\n", NR, NF,\ $0 }'
  </code>
  
  NB :
  
- On utilisera maintenant le terme ligne pour enregistrement et le terme colonne pour champ, car c'est ce qu'on\ fait le plus souvent. Ne perdez pas de vue cependant que cela peut etre change.
+ On utilisera maintenant le terme ligne pour enregistrement et le terme colonne pour champ, car c'est ce qu'on fait le plus souvent. Ne perdez pas de vue cependant que cela peut être changé.
  
  
  ===== Structure d'un script =====
  
  Un script en awk est une suite de paire : test action
  
- Pour chaque ligne, un test est effectue, et s'il resussi, l'action associee
- est effectuee. Si l'action precedente n'a pas provoque la fin du programme (exit) ou
- le passage a une nouvelle ligne (next), le test suivant est effectue et son
- action associee est executee si necessaire etc...
+ Pour chaque ligne, un test est effectue, et s'il réussit, l'action associée
+ est effectuée. Si l'action précédente n'a pas provoqué la fin du programme (exit) ou
+ le passage à une nouvelle ligne (next), le test suivant est évalué et son
+ action associée est exécutée s'il a réussi, etc...
  
-   * Ne pas mettre de test est considere comme un test qui reussi toujours
-   * Ne pas mettre d'action provoque l'action par defaut si le test reussi : l affichage de la ligne.
+   * Ne pas mettre de test est considéré comme un test qui réussit toujours
+   * Ne pas mettre d'action provoque l'action par défaut si le test réussit : l affichage de la ligne.
    * omettre un test et une action (faire un script vide) ne fait rien.
-   * le test BEGIN est vrai avant de commencer la lecture de quoi que ce soit on l'utilise pour initialiser
-   * les test END est vrai apres que la derniere ligne soit lue. on l'utilise generer des rapport, afficher des resultat lentements collectes au cours de la lecture...
+   * le test BEGIN est vrai avant de commencer la lecture de quoi que ce soit on l'utilise pour initialiser.
+   * le test END est vrai après que la dernière ligne soit lue. on l'utilise  habituellement pour générer des rapports, afficher des résultats lentement collectés au cours de la lecture...
  
- Les tests peuvent etre n'importe quelle expression qui s'evalue numeriquement
+ Les tests peuvent être n'importe quelle expression qui s'évalue numériquement
  ou "chainement" ou  une expression rationnelle entre /
- ou toute combinaison de tout cela grace au operateur et-logique ou-logique etc...
+ ou toute combinaison de tout cela grâce aux opérateurs et-logique, ou-logique etc...
  
-   * une expression numerique est "vraie" si elle est non nulle
+   * une expression numérique est "vraie" si elle est non nulle
    * une expression chaine est "vraie" si elle est non vide
    * une /expression rationnelle/ est "vraie" si elle concorde avec la ligne en cours de traitement
  
- ainsi les scripts suivants affichent toutes les lignes de leur entree :
+ ainsi les scripts suivants affichent toutes les lignes de leur entrée :
  
  <code awk>
          nawk 1
          nawk '"a"'
  </code>
  
- et ceux la n'affichent rien :
+ et ceux là n'affichent rien :
  
  <code awk>
          nawk 0
          nawk '""'
  </code>
  
  ===== La magie de awk =====
  
- une part importante de la magie de awk reside dans son operateur $
- Operateur qu'il ne faut pas confondre avec le $ du shell.
+ une part importante de la magie de awk réside dans son opérateur $.
+ Opérateur qu'il ne faut pas confondre avec le $ du shell.
  D'ailleurs les scripts en awk se mettent presque toujours entre ' '
  pas entre " "
  
- Cet operateur est le selecteur de colonne, et il attend un entier.
+ Cet opérateur est le sélecteur de colonne, et il attend un entier.
  
- $0 correspond a la ligne telle qu'elle a ete lue.
+ $0 correspond a la ligne telle qu'elle a été lue.
  
  exemple : afficher le dernier mot de la ligne
  
  <code awk>
          awk '{ print $NF }'
  </code>
  
  NF est une autre variable magique de awk, elle contient le nombre de
- colonnes, et est mise a jour a la lecture de chaque nouvelle ligne.
+ colonnes, et est mise à jour à la lecture de chaque nouvelle ligne.
  
  afficher l'avant dernier mot de la ligne :
  
  <code awk>
          awk '{ print $(NF - 1) }'
  </code>
  
- Une autre part de magie reside dans les tableaux. Les tableaux sont des
+ Une autre part de magie réside dans les tableaux. Les tableaux sont des
  tableaux associatifs (ce qu'on appelle dictionnaire en Postscript, Hash
- en perl). L'indice peut etre n'importe quoi. cela permet d'associer une valeur a une
+ en perl). L'indice peut être n'importe quoi. cela permet d'associer une valeur à une
  clef, comme dans l'exemple suivant :
  
  <code awk>
          awk '
+                 # pour chaque ligne
                  {
                          for( i = 1; i <= NF; ++i ) {
                                  frequence[ $i ] ++
                  }
+                 # et maintenant, un petit rapport.
                  END {
                          for( i in frequence ) {
                                  printf "frequence[ %s ] = %s\n", i, frequence[i]
                          }



-- 
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/



More information about the Shell mailing list