Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 15:41
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.255.26.194
Nom d'hôte : lns-bzn-39-82-255-26-194.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240148484
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé :
Utilisateur : christophemartin
@@ -406,10 +406,11 @@
}
}
' /var/mail/$USER
</code>
+
====== Historique du document ======
* Première version de Christophe Martin (10 Mars 2006)
- * Correction d'orthographe et ajout d'exemples commentés (19 avril 2009)
+ * Christophe Martin : Correction d'orthographe et ajout d'exemples commentés (19 avril 2009)
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 15:41
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.255.26.194
Nom d'hôte : lns-bzn-39-82-255-26-194.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240148344
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : MAJ historique
Utilisateur : christophemartin
@@ -406,8 +406,10 @@
}
}
' /var/mail/$USER
</code>
+
====== Historique du document ======
- * Première version de Christophe Martin (10 Mars 2006)
+ * Première version de Christophe Martin (10 Mars 2006)
+ * Correction d'orthographe et ajout d'exemples commentés (19 avril 2009)
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 15:39
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.255.26.194
Nom d'hôte : lns-bzn-39-82-255-26-194.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240147861
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : commentaire dans l'exemple
Utilisateur : christophemartin
@@ -338,8 +338,9 @@
print "\t\tou bien"
print "\t\tle nombre en colonne 7 est plus grand que sinus( 0,732 * le nombre en colonne 8 )"
}
</code>
+
===== La magie de awk =====
@@ -375,9 +376,11 @@
<code awk>
awk '
# pour chaque ligne
{
+ # pour chaque mot
for( i = 1; i <= NF; ++i ) {
+ # incrementer la frequence du mot
frequence[ $i ] ++
}
# et maintenant, un petit rapport.
END {
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 15:31
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.255.26.194
Nom d'hôte : lns-bzn-39-82-255-26-194.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240147680
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : orthographe + commentaire dans exemple.
Utilisateur : christophemartin
@@ -338,8 +338,9 @@
print "\t\tou bien"
print "\t\tle nombre en colonne 7 est plus grand que sinus( 0,732 * le nombre en colonne 8 )"
}
</code>
+
===== La magie de awk =====
une part importante de la magie de awk réside dans son opérateur $.
@@ -348,9 +349,9 @@
pas entre " "
Cet opérateur est le sélecteur de colonne, et il attend un entier.
- $0 correspond a la ligne telle qu'elle a été lue.
+ $0 correspond à la ligne telle qu'elle a été lue.
exemple : afficher le dernier mot de la ligne
<code awk>
@@ -390,11 +391,13 @@
autre exemple :
<code awk>
nawk '
+ # Pour les lignes commençant par "From:"
/^From:/ {
de[$2]++
}
+ # A la fin, on fait un petit rapport.
END {
for( i in de ) {
printf "%s a ecrit %d messages\n", i , de[i]
}
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 15:28
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.255.26.194
Nom d'hôte : lns-bzn-39-82-255-26-194.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240133598
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : ajout d'exemple
Utilisateur : christophemartin
@@ -245,45 +245,100 @@
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 être changé.
+
===== Structure d'un script =====
- Un script en awk est une suite de paire : test action
+ Un script en awk est une suite de paire : ''test { action }''
- 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
+ Pour chaque ligne, un test est effectué, et s'il réussit, l'action associée
+ est exécuté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 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.
+ * 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.
- * 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...
+ * le test ''BEGIN'' est vrai avant de commencer la lecture de quoi que ce soit on l'utilise pour initialiser. on peut mettre plusieurs tests ''BEGIN'' dans un script, leurs actions seront toutes exécutées avant de commencer le traitement des données.
+ * 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... On peut mettre plusieurs tests ''END'' dans un script, comme pour les tests ''BEGIN'' les actions seront toutes exécutées, sauf si l'une d'elles a recours à la commande ''exit'' de awk, bien sûr.
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 grâce aux opérateurs et-logique, ou-logique etc...
+ ou "chainement" ou une expression rationnelle entre ''/''
+ ou toute combinaison de tout cela grâce aux opérateurs et-logique (''&&''), ou-logique (''||'') etc...
- * 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
+ * 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 entrée :
<code awk>
- nawk 1
- nawk '"a"'
+ awk 1
+ awk '"a"'
</code>
et ceux là n'affichent rien :
<code awk>
- nawk 0
- nawk '""'
+ awk 0
+ awk '""'
+ </code>
+
+ Voilà quelques exemples de test possible et leur signification :
+ <code awk>
+ /toto/ {
+ print "la ligne\n\t" $0 "\ncontient 'toto'"
+ }
+
+ $4 == "toto" {
+ print "dans\n\t", $0 "\nle 4eme mot est toto"
+ }
+
+ $3 ~ /toto/ {
+ print "dans\n\t", $0 "\nle 3eme mot contient 'toto'"
+ }
+
+ $3 ~ /^toto/ {
+ print "dans\n\t", $0, "\nle 3eme mot commence par 'toto'"
+ }
+
+ NF > 1 && $(NF - 1) !~ /toto$/ {
+ print "dans\n\t", $0, "\nl avant dernier mot ne se termine PAS par 'toto'"
+ }
+
+ NF > 4 && $(NF - 4) {
+ print "dans la ligne\n\t" $0 \
+ "\nil y a au moins 5 colonnes",
+ "\nle quatrieme avant dernier mot est non nul (", $(NF - 4), ")"
+ }
+
+ # Les chaines sont plus grandes que les nombres, donc
+ # ce test n est correct que si on est certain de ne rencontrer que des
+ # nombres dans les colonnes 3, 5, 7, 8
+ /xyzzy/ || $5 > 3 && ( $3 < $5 || $7 >sin( 0.732 * $8 )) {
+ print "SURPRENEMENT, dans \n\t" $0
+ print "\tsoit il y a 'xyzzy'"
+ print "\tsoit le nombre en colonne 5 est plus grand que 3 ET"
+ print "\t\tle nombre en colonne 3 est plus petit que le nombre en colonne 5"
+ print "\t\tou bien"
+ print "\t\tle nombre en colonne 7 est plus grand que sinus( 0,732 * le nombre en colonne 8 )"
+ }
+
+ # On peut ruser un peu en multipliant chaque colonne par 1.0, car
+ # une chaine * un nombre = 0. Malgre tout, si seule la colonne 8
+ # contient une chaine mais pas un nombre, ce test peut reussir tout
+ # de meme si les autres conditions sont remplies.
+ /xyzzy/ || $5 * 1.0 > 3 && ( $3 < $5 || $7 * 1.0 >sin( 0.732 * $8 )) {
+ print "PRESQUE CORRECTEMENT, dans \n\t" $0
+ print "\tsoit il y a 'xyzzy'"
+ print "\tsoit le nombre en colonne 5 est plus grand que 3 ET"
+ print "\t\tle nombre en colonne 3 est plus petit que le nombre en colonne 5"
+ print "\t\tou bien"
+ print "\t\tle nombre en colonne 7 est plus grand que sinus( 0,732 * le nombre en colonne 8 )"
+ }
</code>
===== La magie de awk =====
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 11:33
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.253.120.2
Nom d'hôte : lns-bzn-38-82-253-120-2.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240133477
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : orthographe
Utilisateur : christophemartin
@@ -206,8 +206,9 @@
Mais pourquoi utilise-t-on des { } de temps en temps mais pas toujours ?
C'est parce qu'un script awk est composé de tests 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.
@@ -223,11 +224,11 @@
* x=4
* pi=3.14159
* z=1.5e12
- **Attention a vos réglages internationaux** Si votre variable LC_ALL ou
+ **Attention à 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
+ des nombres à ****virgule**** oui, à virgule, pas a point (.), et cela
sera sans doute la cause de bien des maux.
awk lit des enregistrements (des lignes) qu'il découpe en champs (en colonnes).
la ligne de base est aussi conservée sans modification.
@@ -238,9 +239,9 @@
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 }'
+ awk 'BEGIN { RS="" ; FS = "\n" } { printf "enregistrement %3d, nombre de champs %d\n, %s\n", NR, NF,\ $0 }'
</code>
NB :
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 11:29
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.253.120.2
Nom d'hôte : lns-bzn-38-82-253-120-2.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240133303
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : orthographe
Utilisateur : christophemartin
@@ -156,8 +156,9 @@
{
print x, $0
}
</code>
+
===== Des exemples simples ====
Ces exemples simples permettent d'approcher doucement awk.
@@ -201,9 +202,9 @@
</code>
Mais pourquoi utilise-t-on des { } de temps en temps mais pas toujours ?
- C'est parce qu'un script awk est composé de test et d'actions. Les actions
+ C'est parce qu'un script awk est composé de tests et d'actions. Les actions
son entourées de { } , pas les tests. Cela est expliqué dans la section
suivante.
====== Langage awk ======
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 11:28
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.253.120.2
Nom d'hôte : lns-bzn-38-82-253-120-2.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240132082
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : remise en forme. exemple plus clair.
Utilisateur : christophemartin
@@ -107,44 +107,58 @@
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 à mort, mais de la manière de se servir
- de awk. L'invocation standard est :
+ de awk.
+ L'invocation standard est :
<code>
awk 'commande awk' fichier fichier...
</code>
- et cela signifie : exécuter 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 entrée standard, ce qui fait
- qu'on peut l'utiliser dans les pipes, en filtre
-
+ Si aucun fichier n'est donné, 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 définir des variables awk avant d'exécuter quoi que ce soit.
-
+ Les deux lignes d'exemple ci dessous sont equivallentes.
<code awk>
ls | awk -v x=coucou '{ print x, $0 }'
+ ls | awk 'BEGIN { x="coucou" } { print x, $0 }'
</code>
- Et pour écrire un script en awk, il faut utiliser l'option -f ; le shabang doit donc être :
-
+ Si votre programme en awk est tellement complexe et long qu'il ne tient plus sur la ligne de commande, vous le mettrez peut-être dans un fichier. À ce moment là, vous exécuterez votre script de la manière suivante ;
+ <code>
+ awk -f fichier-script fichier-a-traiter...
+ </code>
+ Vous pouvez également rendre votre fichier-script exécutable grâce à //chmod 755 fichier-script// par exemple, et y ajouter à la première ligne le shabang idoine. Vous pourrez alors exécuter le script comme toute autre commande : en tapant son nom. \\
+ Voilà un exemple de script en awk, pas très utile cependant :
<code awk>
#! /usr/bin/awk -f
+
+ BEGIN {
+ x="coucou"
+ }
+ {
+ print x, $0
+ }
</code>
+
===== Des exemples simples ====
Ces exemples simples permettent d'approcher doucement awk.
L'idée de awk est que les lignes sont composées de colonnes; la définition
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2009/04/19 11:08
Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Adresse IP : 82.253.120.2
Nom d'hôte : lns-bzn-38-82-253-120-2.adsl.proxad.net
Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240132002
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé : orthographe
Utilisateur : christophemartin
@@ -90,20 +90,21 @@
La version [[http://www.gnu/org|GNU]] de grep a bien
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 très longue,
- et très couteuse (ouverture de nombreux fichiers, recherche de module
+ et très couteuse (ouverture de nombreux fichiers, recherche de modules
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.
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
+ dire du grand Larry lui même, awk est supérieur à 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. :-)
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/