Sommaire Carte Index Recherche Nouvelles Archives Liens A propos
[Barre Superieure]
[Barre Inferieure]
[Photo de l'auteur]
par Javier Palacios Bermejo

L´auteur:

Javier pr�pare un Ph. D. en astronomie � l'universit� espagnole o� il administre un r�seau de stations de travail. Ses travaux journaliers se font sur des machines Unix. Une distribution Slackware Linux a �t� choisie apr�s quelques probl�mes initiaux et des essais. Linux s'est r�v�l� bien meilleur que d'autres Unix propri�taires.



Sommaire:

La pratique d'awk par l'exemple: Introduction rapide

[Illustration]

Résumé:

C'est une introduction au bon vieux programme AWK d'Unix. Elle montre comment �crire de petites s�quences type AWK pour automatiser les t�ches du travail quotidien.




Au d�part, l'id�e d'�crire ce texte m'est venue apr�s avoir lu deux autres articles publi�s dans LinuxFocus et �cris par Guido Socher. Le premier, concerne find et les commandes associ�es, m'a montr� que je n'�tais pas le seul � utiliser la ligne de commande. Souvent,de belles interfaces graphiques ne vous disent pas comment les choses se passent r�ellement (c'est de cette mani�re que windows est arriv� il y a des ann�es). L'autre article concerne les expressions r�guli�res. Bien que les expressions r�guli�res ne soient que l�g�rement abord�es dans le pr�sent article, il est n�cessaire de les conna�tre pour tirer le maximum d'awk et d'autres commandes comme sed et grep.

A la question: "la commande awk est elle r�ellement utile?" nous r�pondons sans ambiguit� oui! Awk peut �tre utile pour un utilisateur lambda afin de traiter des fichiers texte, les reformater etc... Pour un administateur syst�me, awk est vraiment un utilitaire tr�s important. Jetez donc un coup d'oeil � /var/yp/Makefile ou aux scripts d'initialisation. Awk est utilis� partout.  

Introduction � awk

Mes premiers pas avec awk sont sufisement vieux pour avoir �t� oubli�s. J'avais un coll�gue qui devais travailler avec de tr�s grosse sorties issues d'un petit Cray. La page du manuel pour awk sur le cray �tait vraiment r�duite au minimum, mais il d�cida quand m�me qu'awk ressemblait beaucoup � ce qu'il souhaitait m�me s'il ne savait pas encore l'utiliser.
Beaucoup plus tard, dans une situation banale de la vie courante, un autre coll�gue utilisa awk pour extraire la premi�re colonne d'un tableau:

awk '  '{print $1}'   file


Simple n'est ce pas? Cette simple t�che ne n�cessite pas de programmation complexe en C ou de n'importe quel autre langage interpr�t� ou compil�. Une simple ligne d'awk suffit.

Une fois que nous savons extraire une colonne, nous pouvons faire des choses comme renommer des fichiers:
ls -1 pattern | awk '{print "mv "$1" "$1".new"}' | sh

... et il y en a d'autres. L'utilisation de sed ou de grep avec les exemples pr�c�dents, nous donne des outils encore plus puissants.

  1. Modification d'une partie du nom
    ls -1 *old* | awk '{print "mv "$1" "$1}' | sed s/old/new/2 | sh
    (cela ne marchera pas dans certain cas comme: file_old_and_old)

  2. supprimer seulement les fichiers (cela peut �tre fait avec rm seul, mais pas avec un alias comme 'rm -r')
    ls -l * | grep -v drwx | awk '{print "rm "$9}' | sh
    (Cela peut ne pas marcher avec des nom �tranges ou des permissions) Attention si vous essayez ceci dans votre r�pertoire personnel, il y a destruction de fichiers!

  3. supprimer seulement les r�pertoires
    ls -l | grep '^d' | awk '{print "rm -r "$9}' | sh
    (Je pense que cela fonctionne dans tous les cas et peut �tre am�lior� en utilisant:
    ls -p | grep /$ | awk '{print "rm -r "$1}')
    Attention si vous essayez ceci dans votre r�pertoire personnel, il y a destruction de fichiers!

Comme vous pouvez le voir, awk est d'un grand secours pour r�p�ter de nombreuses fois une op�ration... et en plus de cela, il est bien plus amusant d'�crire un programme awk que de r�peter 20 fois la m�me chose manuellement.

Bien que nous utilisions le terme commande-awk, awk n'est pas le genre de chose qui est habituellement appel� une commande. awk est un langage de programmation, avec une syntaxe proche du C � beaucoup d'�gards. C'est un langage interpr�t� et l'interpr�teur awk traduit des instructions.

Voici la syntaxe de la commande:

# gawk --help
Usage: gawk [POSIX or GNU style options] -f progfile [--] file ...
        gawk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options:
        -f progfile             --file=progfile
        -F fs                   --field-separator=fs
        -v var=val              --assign=var=val
        -m[fr] val
        -W compat               --compat
        -W copyleft             --copyleft
        -W copyright            --copyright
        -W help                 --help
        -W lint                 --lint
        -W lint-old             --lint-old
        -W posix                --posix
        -W re-interval          --re-interval
        -W source=program-text  --source=program-text
        -W traditional          --traditional
        -W usage                --usage
        -W version              --version

Report bugs to [email protected],
with a Cc: to [email protected]
Au lieu d'encadrer la commande avec des guillemets simples ('), on peut les �crire dans un fichier et l'appeler avec l'option -f, ainsi qu'avec des variables d�finies en ligne de commande avec -v var=val, ce qui rends le programme plus versatile.

Awk est, en gros, un langage de traitement de tableau. Autrement dit, d�di� � des informations qui peuvent �tre group�es en champs et enregistrements. L'avantage ici r�side dans l'extr�me flexibilit� de ces deux d�finitions.

Awk est puissant. Il est con�u pour travailler avec des enregistrements arrang�s en lignes; mais ceci peut �tre modifi�. Afin de pr�senter plus en d�tails certains de ces aspects, nous allons etudier quelques exemples repr�sentatifs tir�s de cas r�els.

Des programmes comme ceux-ci ne prennent que 5 mn � �laborer et 5 de plus � �crire (ou bien plus de 20 mn sans r�fl�chir en utilisant la m�thode plus dr�le des essais et erreurs succesifs).

J'ai utilis� awk pour beaucoup d'autres t�ches (g�n�ration automatique d'informations four des bases de donn�es simples) et j'en sais suffisemment sur le sujet pour �tre certain que l'on peut en faire beaucoup de choses.
Laisser juste votre imagination faire le reste.

 

Un probl�me

 

(et une solution)

Un des probl�mes vient du fait qu'awk � besoin d'informations parfaitement tabul�es, sans trous. Awk ne marche pas, par exemple, avec des colonnes de largeurs fixes. Ce n'est pas g�nant si nous cr�ons nous m�me les donn�es d'entr�e: on choisit quelque chose d'inhabituel pour s�parer les colonnes, et plus tard on s'en sert avec FS et c'est tout!!! Si l'on dispose d�j� des donn�es cela peut �tre un peu plus compliqu� parce que le s�parateur de champs (FS) peut aussi �tre un espace, par cons�quent certain noms compos�s peuvent poser un probl�me. Ainsi, un tableau comme celui-l�:
1234  HD 13324  22:40:54 ....
1235  HD12223   22:43:12 ....
est difficile � manipuler avec awk. Des donn�es comme celles l� sont parfois obligatoires. De plus, cela se retrouve assez souvent car les donn�es ne sont jamais homog�nes. Si l'on n'a qu'une colonne avec de telles carct�ristiques, on peut r�soudre le probl�me (si quelqu'un sais comment traiter plus d'une colonne de mani�re g�n�rique, merci de m'avertir!).
Une fois, j'ai eu � traiter une table de cette esp�ce. La seconde colonne �tait un nom et comprenait un nombre variable d'espaces. Comme cela arrive souvent, j'avais � le trier sur la troisi�me colonne. J'ai essay� plusieurs fois avec sort +/-n.m qui a rencontr� les m�mes probl�mes d'espaces int�gr�s.
J'ai finalement r�alis� que la colonne que je cherchait � trier �tait la derni�re et que awk sait combien il y a de champs dans l'enregistrement en cours. Cela �tait suffisant pour pouvoir acc�der � la derni�re colonne (parfois $9, et parfois $11, mais toujours NF). A la fin de la journ�e, le r�sultat souhait� �tait obtenu:
{
  printf $NF
  $NF = ""
  printf " "$0"\n"
}

Ceci fournit un r�sultat �gal � l'entr�e mais avec la derni�re colonne en premi�re position. Bien s�r, cette m�thode est applicable facilement depuis le troisi�me champ depuis la fin, ou depuis un champ de contr�le qui contient toujours la m�me valeur.
Avec le dernier champ en premi�re position, on peut trier (sort) les donn�es sans probl�mes.
Il suffit d'utiliser ses id�es et son imagination.

 

AWK en profondeur

 

Travailler sur des lignes cibl�es

Jusqu'ici, tous les exemples cit�s traitent toutes les lignes du fichier d'entr�e. Mais, comme sp�cifi� dans la page du manuel, il est possible de ne traiter que certaines de ces lignes. Il suffit juste de faire pr�c�der le groupe de commandes avec la condition que doit remplir la ligne. Cette condition peut aller d'une simple expression r�guli�re pour v�rifier le contenu d'un champ � la possibilit� de grouper les conditions avec des op�rateurs logiques adapt�s.

 

Awk en tant que langage de programmation

Comme tous les autres langages de programmation, awk propose toutes les structures de contr�le n�cessaires ainsi qu'un jeux d'op�rateurs et de fonctions pr�d�finies pour manipuler les nombres et les cha�nes. La syntaxe est proche du C.

Et bien s�r, il est possible d'inclure des fonctions d�finies par l'utilisateur avec le mot clef function, en �crivant les commandes associ�es comme si l'on traitait une ligne du fichier d'entr�e. En plus des variables scalaires habituelles, awk peut aussi manipuler des tableaux de taille variable.

 

Inclure des biblioth�ques

Comme dans tous langages de programmation, il existe des fonctions tr�s fr�quemment utilis�es et qu'il est incomfortable de couper-coller depuis d'autres lignes de code source. C'est la raison pour laquelle les biblioth�ques existent. Avec la version GNU d'awk, il est possible de les inclure avec le programme awk. Ceci fait par contre partie des sujets qui d�passent les objectifs de cet article.

 

Conclusions

Awk n'est certainement pas aussi puissant que d'autres outils con�us dans des buts similaires, mais il a le grand avantage d'avoir la possibilit� d'�crire de petits programmes adapt�s � nos besoins, en tr�s peu de temps.

AWK est tr�s bien adapt� pour les raisons qui ont conduit � sa construction: Lire des lignes et agir en fonction de leur contenu.

Des fichiers comme /etc/password s'av�rent id�aux pour �tre trait�s et reformatt� par AWK. Ce dernier est inestimable pour de telles t�ches.

Bien s�r,AWK n'est pas seul. Perl est un comp�titeur tr�s valable mais qui n'emp�che pas de conna�tre quelques trucs AWK.

 

Informations compl�mentaires

Ces commandes de base ne sont pas forc�ment bien document�es, vous devriez toutefois trouver votre bonheur en cherchant un peu.

D'habitude, tous les livres unix mentionnent cette commande mais seuls quelques uns donnent des d�tails utils. Le mieux que nous puissions faire est de parcourir tous les livres qui nous passent entre les mains car on ne sait jamais d'avance o� l'information utile peut �tre trouv�e.


Site Web maintenu par l´équipe d´édition LinuxFocus
© Javier Palacios Bermejo
LinuxFocus 2000

Cliquez ici pour signaler une erreur ou envoyer un commentaire � Linuxfocus
Translationinformation:
es -> -- Javier Palacios Bermejo
en -> fr John Perr

2000-03-16, generated by lfparser version 1.2b