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: |
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.
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:
|
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.
ls -1 *old* | awk '{print "mv "$1" "$1}' | sed s/old/new/2 | sh
ls -l * | grep -v drwx | awk '{print "rm "$9}' | sh
ls -l | grep '^d' | awk '{print "rm -r "$9}' | sh
ls -p | grep /$ | awk '{print "rm -r "$1}'
)
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=
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.
awk
), ce n'est pas trop difficile:
BEGIN { printf "LaTeX preample" printf "\\begin{tabular}{|c|c|...|c|}" } |
{ printf $1" & " printf $2" & " . . . printf $n" \\\\ " printf "\\hline" } |
END { print "\\end{document}" } |
|
( $1 == "====>" ) { NomObj = $2 TotObj = $4 if ( TotObj > 0 ) { FS = "|" for ( cont=0 ; cont<TotObj ; cont++ ) { getline print $2 $4 $5 $3 >> NomObj } FS = " " } } |
NOTA: En fait, le nom de l'objet n'�tatit pas donn� et ce fut l�g�rement plus compliqu�; mais ceci est suppos� �tre un exemple didactique. |
BEGIN { BEGIN_MSG = "From" BEGIN_BDY = "Precedence:" MAIN_KEY = "Subject:" VALIDATION = "[MONTH REPORT]" HEAD = "NO"; BODY = "NO"; PRINT="NO" OUT_FILE = "Month_Reports" } { if ( $1 == BEGIN_MSG ) { HEAD = "YES"; BODY = "NO"; PRINT="NO" } if ( $1 == MAIN_KEY ) { if ( $2 == VALIDATION ) { PRINT = "YES" $1 = ""; $2 = "" print "\n\n"$0"\n" > OUT_FILE } } if ( $1 == BEGIN_BDY ) { getline if ( $0 == "" ) { HEAD = "NO"; BODY = "YES" } else { HEAD = "NO"; BODY = "NO"; PRINT="NO" } } if ( BODY == "YES" && PRINT == "YES" ) { print $0 >> OUT_FILE } } |
Si nous sommes administrateur d'une liste de courrier et que de temps en temps,
des messages sp�ciaux y sont envoy�s (par exemple des rapports mensuels) avec un
format sp�cifique (le sujet contient '[MONTH REPORT] mois , dept'). Nous pouvons
d�cider soudainement � la fin de l'ann�e de regrouper ces messages � part des autres.
Ceci peut �tre fait en traitant le buffer de courrier avec le programme awk sur la gauche. Pour que chaque rapport soit �crit individuellement dans un fichier, nous aurons besoin de trois lignes de code suppl�mentaires. |
NOTA: Cet exemple suppose que le tampon de courrier est structur� comme je l'attends. En fait, je ne connais pas le format r�el, mais ce programme fonctionne avec mon installation (ici aussi, dans certains cas �tranges, il pourrait ne pas marcher). |
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.
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.
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.
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.
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.
Ces commandes de base ne sont pas forc�ment bien document�es, vous devriez toutefois trouver votre bonheur en cherchant un peu.
man awk
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:
|
2000-03-16, generated by lfparser version 1.2b