• Aucun résultat trouvé

15.4 Exemples avanc´ es

15.4.5 Exemple 5

Maintenant, il ne nous reste plus qu’`a prendre tout ce qui correspond au premier et troisi`eme regroupement dans chaque enregistrement (lignes arrivant sur l’entr´ee standard), et formatter la sortie de la fa¸con suivante :

login tab UID donc :

regroupement1 tab regroupement3 Nous obtenons donc :

sed -e ’s/^\([^:]*\)\(:[^:]*:\)\([^:]*\)\(.*$\)/\1\t\3/’ /etc/passwd

15.4.5 Exemple 5

Le but de cet exemple est de copier de tous les utilisateurs pr´ec´edent l’entr´ee du compte "uucp" dans "/etc/passwd" et d´eplacer de les `a la fin, compte "uucp" compris. Le r´esultat sera affich´e sur la sortie standard.

Pour cela on fait appel `a un fichier de commandes "sed" que l’on nommera "script.sed". L’appel se fera de la fa¸con suivante :

sed -f script.sed /etc/passwd

D´etaillons les op´erations `a effectuer :

{ Couper dans un espace de travail particulier, `a partir de la premi`ere ligne jusqu’`a celle commen¸cant par <<uucp".

{ Se placer `a la fin de l’espace m´emoire contenant les enregistrements

`

a traiter par "sed" et coller le contenu de l’espace pr´ec´edent.

Pour cela, nous allons utiliser les commandes li´ees `a la gestion de l’espace m´emoire et l’espace de travail de "sed". Comme il l’a ´et´e d´ecrit `a la section 15.2, "sed" dispose d’un espace m´emoire permettant de stocker temporairement, un certain nombre d’informations.

15.5. Remarque sur l’utilisation de l’option ”-f”

La premi`ere ´etape consiste donc `a partir du d´ebut du fichier (donc de la premi`ere ligne) et parcourir jusqu’`a la premi`ere ligne commen¸cant par <<uucp". Sachant que les nom d’utilisateurs sont uniques, le fichier ne contiendra qu’une et une seule ligne commen¸cant par <<uucp". Les adresses de d´ebut et de fin sont donc :

Description Expression

Premi`ere ligne 1

Premi`ere ligne commen¸cant par "uucp" /^uucp/

La commande "sed" appropri´ee pour stocker l’ensemble de ces lignes dans un espace m´emoire est "H" (cf. section 15.3.3). La requ^ete associ´ee est donc :

1,/^uucp/H

`A ce stade de l’ex´ecution, l’enregistrement courrant arrivant sur l’entr´ee de "sed" est la ligne du fichier "/etc/passwd" d´efinissant le compte utilisateur suivant celui de "uucp". Aucune action n’est sp´ecifi´ee. Les lignes sont donc r´e´ecritures sans aucune op´eration sur la sortie standard.

Lorsque la fin de fichier est rencontr´ee, "sed" doit afficher ce qu’il a pr´ec´edemment m´emoriser dans son espace m´emoire. Par cons´equent, l’adresse valide pour ex´ecuter la requ^ete est celle correspondant `a

la fin de fichier : "$". Ici les adresses de d´ebut et de fin sont identiques : elles doivent correspondre toutes les deux `a la fin de fichier. La

commande "sed" appropri´ee pour afficher sur la sortie standard l’ensemble de ces lignes pr´ec´edemment stock´ees dans un espace m´emoire est "G"

(cf. section 15.3.3). La requ^ete associ´ee est donc :

$G

En conclusion, le contenu du fichier "script.sed" est : 1,/^uucp/H

$G

Remarque 15.2 :

L’espace m´emoire utilis´e est, bien sˆur, propre `a ”sed”. Les op´erations ”g” et ”h” sont similaires mais avec un espace vide au d´epart.

15.5 Remarque sur l’utilisation de l’option ”-f”

`A la r`egle 10 explicit´ee `a la section 6.3.1, nous avions pr´eciser que la premi`ere ligne d’un script devait sp´ecifier le nom de l’ex´ecutable associ´e au shell utiliser.

Nous avons vu de m^eme, que la commande "sed" dispose de l’option

"-f", permettant de pr´eciser un fichier de requ^etes "sed".

Si l’analogie est faite avec le shell, le processus charg´e d’´evaluer chaque ligne du fichier est l’ex´ecutable sp´ecifi´e au niveau de la premi`ere ligne du fichier contenant les instructions. Par cons´equent si le fichier contenant les requ^etes "sed" :

S.Baudry, Introduction `a la programmation Bourne Shell – v4.0 131

Chapitre 15. Utilisation de ”sed”

{ a comme premi`ere ligne "#!/usr/bin/sed"5, { est accessible en ex´ecution,

il peut ^etre consid´er´e comme un filtre ex´ecutant les requ^etes "sed"

qu’il contient.

Par exemple, si cette notion est appliqu´ee au fichier d´ecrit dans l’exemple de la section 15.4.5, le contenu de ce fichier sera :

#!/usr/bin/sed 1,/^uucp/H

$G

La commande qui sera saisie deviendra : script.sed /etc/passwd

5Nous consid´erons ici que l’ex´ecutable de ”sed” se trouve dans le r´epertoire ”/usr/bin”.

Pour en connaˆıtre la localisation exacte sur votre syst`eme, vous pouvez utiliser la commande

”which(1)” ou ”whereis(1)”.

Chapitre 16

Utilisation de ”awk”

16.1 Introduction

"awk" est un processeur d’´el´ements syntaxiques qui :

{ sert `a traiter, de mani`ere non interactive, un texte au niveau de ses ´el´ements syntaxiques,

{ travaille sur la base d’une ligne, et ligne apr`es ligne, { permet de d´efinir, analyser, transformer les mots ou ´el´ements

syntaxiques qui composent chaque ligne.

"awk" traitera chaque ligne en entr´ee comme un enregistrement. C’est ce terme qui sera employ´e par la suite. Chaque enregistrement est compos´e de champs. Ces champs sont s´epar´es, par d´efaut, par un ou plusieurs espaces ou bien une ou plusieurs tabulations. C’est aussi un langage de programmation dont la fonction premi`ere est de rechercher des cha^ınes de caract`eres suivant certains crit`eres et d’y appliquer des actions.

On aura donc toujours un mod`ele : s´election + action Le corps de chaque action est un bloc constitu´e d’une ou plusieurs

commandes, d´elimit´e par les caract`eres "{" et <<}". On aura alors : s{\’e}lection { commande · · · }

Pour la petite histoire, le nom "awk" est d´eriv´e des initiales de ses auteurs : Alfred V. Aho, Peter J. Weinberger et Brian W. Kerninghan. Syntaxe :

awk ’corps du programme awk ’ [fichier=· · · ] ou awk -f fichier.programme [fichier · · ·]

Dans le premier cas de syntaxe, le corps du programme "awk" est appliqu´e directement aux fichiers ou `a l’entr´ee standard. Dans le second cas de syntaxe, le programme "awk" est contenu dans un fichier et appliqu´e aux fichiers ou `a l’entr´ee standard.

133

Chapitre 16. Utilisation de ”awk”