Atelier Systèmes d’Exploitation

Programming, Unix, SED, AWK · course

Browse all systèmes d'exploitation et cloud documents

Atelier Systèmes d’Exploitation

Chapitre IV : Sed et Awk

Amine DHRAIEF 1 [ère] année Licence LFIG ESEN, Université De La Manouba

SED : Stream Editor

07/12/17 Atelier S.E 2

Présentation de SED

#### Sed est l’abréviation de Stream Editor, que l’on peut comprendre comme « éditeur de texte orienté flux ». Pour saisir ce que cela signifie, il faut d’abord revenir à l’un des premiers outils du système Unix : l’éditeur ed, d’ailleurs toujours disponible sur les systèmes Unix actuels.

Il s’agit d’un éditeur de texte, comme vi, emacs,

nedit, etc. ; toutefois, contrairement à ces derniers, il ne fonctionne pas sur une page complète de texte affichée à l’écran, mais sur une seule ligne à la fois.

07/12/17 Atelier S.E 3

Présentation de SED

On peut légitimement s’interroger sur la pertinence qu’il y a à utiliser sed, ainsi que d’autres outils comme Awk, pour manipuler de nos jours des fichiers de texte ASCII brut.

Après tout, il s’agit d’instruments conçus pour l’informatique des années 1970 ;

leur emploi se justifie-t-il encore à l’ère du son et des images numériques ?

Naturellement cela dépend de l’usage que l’on fait de ces fichiers et de la

nécessité – ou non – de répéter ultérieurement les mêmes traitements sur différents fichiers.

Dans le monde professionnel, la rédaction d’un document passe systématiquement par un traitement de texte WYSIWIG (What You See Is What You Get).

Certaines personnes le regrettent et préfèrent employer des logiciels de traitement

de documents comme TeX, LaTeX, mais force est de constater que l’usage courant a standardisé certaines applications comme Word.

07/12/17 Atelier S.E 4

Présentation de SED

Quoi qu’il en soit, les choses continuent à évoluer, et un nouveau besoin se fait de plus en plus pressant, surtout dans les environnements techniques : disposer simultanément de deux versions de la même documentation.

La version imprimée, soigneusement mise en page et correctement reliée, est préférable pour

une consultation prolongée, confortable,

tandis que la version électronique en ligne est indispensable pour une recherche rapide ou

une consultation à distance.

De nouveaux formats émergent (XML, etc.) qui permettent une conversion plus ou moins

aisée vers le support employé pour la consultation. On peut raisonnablement imaginer qu’une part non négligeable des documents techniques à venir seront disponibles dans ces formats.

→ sed et Awk sont des outils absolument indispensables pour l’administrateur système qui doit exploiter des fichiers de trace (log files), ou manipuler automatiquement des fichiers de configuration sur une machine ou un parc complet.

07/12/17 Atelier S.E 5

Principe de SED

###### Le programme sed va agir sur les lignes d’un fichier de texte ou de son entrée standard, et fournir les résultats sur sa sortie standard.

En conséquence, les instructions de manipulation doivent

être fournies dans des fichiers de scripts indépendants, ou en ligne de commande.

###### La syntaxe d’invocation est la suivante :

sed -e ' instructions ' fichieràtraiter

sed -f script fichieràtraiter

07/12/17 Atelier S.E 6

Principe de SED

Si aucun fichier à traiter n’est indiqué, sed attend les données sur son entrée standard. Lorsqu’on fournit directement les commandes sur la ligne, grâce à l’option -e, il est préférable de les inclure entre apostrophes simples, en raison de l’usage fréquent des caractères $, *, ?, etc., susceptibles d’être interprétés par le shell.

Une option importante est également disponible : -n, avec laquelle sed fonctionne en mode silencieux, c’est-à-dire qu’il ne copie une ligne de texte de l’entrée standard vers la sortie standard que si on le lui demande explicitement, et non pas automatiquement comme c’est le cas par défaut.

Cette capacité à traiter les informations « au vol » dans les flux d’entrée-sortie standards fait que l’on utilise fréquemment sed au sein de pipelines regroupant d’autres commandes système.

07/12/17 Atelier S.E 7

Fonctionnement de SED

Ce traitement immédiat du texte lu dicte le fonctionnement même de sed, puisqu’il ne dispose pas d’une vue globale sur le fichier à traiter, mais uniquement des informations fractionnaires, délivrées sur le flux d’entrée standard.

Ainsi sed repose-t-il sur le mécanisme suivant :

1) Lecture d’une ligne sur le flux d’entrée (jusqu’à ce qu’il rencontre un caractère de

saut de ligne) ;

2) Traitement de cette ligne en la soumettant à toutes les commandes rencontrées

dans le fichier script ;

3) Affichage de la ligne résultante sur la sortie standard, sauf si sed est invoqué avec

l’option – n ;

4) Passage à la ligne suivante, et ainsi de suite jusqu’à la fin du flux d’entrée standard.

07/12/17 Atelier S.E 8

Fonctionnement de SED

###### Les commandes que sed accepte ne sont pas très nombreuses, et sont toujours représentées par une lettre unique ( a, b, c, d, g, h, i, n, p, q, r, s, t, y ) ou par le signe = .

Il s’agit essentiellement d’insertion ou de suppression de

lignes, et de modification de chaînes de caractères.

###### En pratique, seules trois commandes sont utilisées réellement ( d, p, et s ), les autres donnant des lignes illisibles et surtout impossibles à maintenir.

07/12/17 Atelier S.E 9

Fonctionnement de SED

Une commande peut être éventuellement précédée d’une adresse.

Dans ce cas, elle ne s’applique qu’aux lignes concernées du flux d’entrée

standard. Une adresse se présente sous forme numérique – correspondant alors au numéro de la ligne sélectionnée – ou sous forme d’expression régulière.

Les numéros de ligne commencent à 1 et se poursuivent sans interruption sur l’ensemble des fichiers à traiter.

Une expression rationnelle permet de sélectionner une ou plusieurs lignes en fonction de leur contenu.

07/12/17 Atelier S.E 10

Fonctionnement de SED

07/12/17 Atelier S.E 11

Fonctionnement de SED

Advertisement

###### Tout d’abord, nous allons demander à sed d’appliquer la commande p (print) aux lignes du fichier, sans aucun filtrage.

###### Cette commande demande l’affichage explicite de la ligne en cours. Comme l’option -n n’est pas employée, sed effectue aussi une copie systématique des données lues vers la sortie standard, ce qui a pour effet de dupliquer les lignes

07/12/17 Atelier S.E 12

Fonctionnement de SED

07/12/17 Atelier S.E 13

Fonctionnement de SED

Nous pouvons examiner le filtrage des lignes, en demandant une sélection du numéro de ligne : $sed -n -e ‘ NuméroLigne p’ Fichier

Exemple : $sed -n -e ‘2p’ /etc/hosts.allow

07/12/17 Atelier S.E 14

Fonctionnement de SED

On peut aussi sélectionner une ligne en indiquant un motif (sous forme d’expression régulière) qu’elle doit contenir. Ce motif est indiqué entre caractères slashes / (barres obliques)

$sed -n -e ‘ /regexp/p Fichier

07/12/17 Atelier S.E 15

Fonctionnement de SED

### La commande p, accepte une sélection de lignes sous forme d’intervalle. Un intervalle est décrit par deux adresses séparées par une virgule.

$sed -n -e ‘num1,num2 p Fichier

07/12/17 Atelier S.E 16

Présentation de SED

### Un intervalle peut aussi être décrit par deux expressions régulières par une virgule.

$sed -n -e ‘/regexp1/,/regexp2/ p Fichier

### sed affichera le texte de la première ligne contenant regexp1 vers la dernière ligne contenant regexp2

07/12/17 Atelier S.E 17

Fonctionnement de SED

07/12/17 Atelier S.E 18

Fonctionnement de SED

### L’adresse symbolique $ correspond à la dernière ligne du dernier fichier à traiter.

07/12/17 Atelier S.E 19

Fonctionnement de SED

##### On notera également que l’on peut nier une adresse, c’est-à-dire n’exécuter la commande que sur les lignes qui ne correspondent pas à la sélection grâce à l’opérateur ! .

07/12/17 Atelier S.E 20

Fonctionnement de SED

### Par exemple, nous n’affichons ici que les lignes qui ne sont pas vides :

07/12/17 Atelier S.E 21

Commandes SED

On peut utiliser la commande p vue ci-dessus surtout pour deux raisons principales :

Afficher la n-ième ligne ( sed –ne ‘Np’ ), ou les lignes de la n-ième

à la m-ième d’un fichier ( sed –ne ‘N,Mp’ ). Ceci est également possible en enchaînant les commandes tail et head mais de manière moins élégant

Afficher les lignes dans un intervalle délimité par des expressions

régulières. C’est en quelque sorte une extension de la commande grep qui n’affiche que les lignes correspondant à une expression, mais pas un intervalle.

07/12/17 Atelier S.E 22

Commandes SED Suppression de ligne

###### La commande d (delete) permet de supprimer la ligne sélectionnée. Naturellement, comme sed travaille sur un flux de données et pas directement sur un fichier, il ne s’agit pas d’une véritable suppression, mais plutôt d’un abandon.

###### En rencontrant cette commande, sed passe simplement à la ligne suivante sans afficher celle en cours.

07/12/17 Atelier S.E 23

Commandes SED Suppression de ligne

### On utilise la commande d de manière symétrique à la commande p, lorsqu’on sait sélectionner ce que l’on veut rejeter, pour garder tout le reste

###### sed –ne ‘/selectionaconserver/p’

###### est symétrique à :

###### sed –e ‘/selectionarejeter/d’

07/12/17 Atelier S.E 24

Commandes SED Suppression de ligne

07/12/17 Atelier S.E 25

Commandes SED Suppression de ligne

### Nous pouvons également supprimer toutes les lignes sauf celles qui contiennent un motif (« that » par exemple) :

07/12/17 Atelier S.E 26

Commandes SED Suppression de ligne

Bien que l’on puisse placer plusieurs commandes successives en argument de l’option -e, en les séparant à l’aide d’un point-virgule, on conseille de les éclater en plusieurs invocations de sed enchaînées par des pipes | au niveau du shell.

L’exécution sera un peu moins efficace – car on aura un plus grand nombre de processus – mais on gagnera en lisibilité si les tâches successives sont clairement distinguées.

07/12/17 Atelier S.E 27

Commandes SED Suppression de ligne

### Par exemple, si l’on désire supprimer toutes les lignes blanches, ou celles qui débutent par un caractère dièse ( # ) on peut écrire :

###### $sed –e ‘/^[[:blank:]]$/d; /^[[:blank:]]#/d’

###### $sed –e ‘/^ [[:blank:]]$/d’ | sed –e ‘/^[[:blank:]]#/d’

07/12/17 Atelier S.E 28

Commandes SED Suppression de ligne

07/12/17 Atelier S.E 29

Commandes SED Suppression de ligne

07/12/17 Atelier S.E 30

Commandes SED Substitution

La commande essentielle de Sed, celle qui occupe une proportion énorme des scripts courants, est la commande s (substitution). Elle permet de remplacer partiellement le contenu d’une ligne.

Advertisement

Il s’agit de la tâche principale des commandes sed, car les autres

fonctions les plus utilisées ( d et p ) peuvent souvent être assurées par d’autres utilitaires ( grep, head, tail, et tr par exemple) de manière moins directe, mais souvent moins effrayante pour l’utilisateur courant.

En voici la syntaxe générale :

s/motif/remplacement/options

07/12/17 Atelier S.E 31

Commandes SED

07/12/17 Atelier S.E 32

Commandes SED Substitution

### Le motif indiqué est en premier lieu recherché dans la ligne en cours et, le cas échéant, remplacé par la chaîne qui se trouve en seconde position.

### Le motif est constitué d’une expression régulière simple, avec les caractères spéciaux

07/12/17 Atelier S.E 33

Commandes SED Substitution

### Lorsque sed rencontre dans la ligne une expression qui correspond au motif recherché, il la remplace avec la chaîne de caractères fournie en second argument.

### Dans cette expression, seuls deux métacaractères peuvent être utilisés

07/12/17 Atelier S.E 34

Commandes SED Substitution

###### Le caractère \ permet naturellement de protéger le & ainsi que \ lui-même, afin qu’ils ne prennent pas leur signification particulière.

###### Il faut impérativement employer l’expression \& pour obtenir le caractère & dans la chaîne de remplacement.

Cet oubli fréquent est une cause importante d’erreurs dans

les scripts qui manipulent des fichiers HTML ou C, où le caractère & est couramment employé.

07/12/17 Atelier S.E 35

Commandes SED Substitution

### Les options possibles à la fin de la commande de substitution sont les suivantes :

07/12/17 Atelier S.E 36

Commandes SED Substitution

Remplacement d’une seule occurrence d’une chaîne complète

Remplacement de toutes les occurrences d’une chaîne → avec l’option g, toutes les occurrences sont remplacées

Commandes SED Substitution

Extension de la chaîne : La mise en correspondance se fait de telle sorte que le motif « consomme » le maximum de caractères.

Nous allons demander à sed de remplacer un motif constitué d’un a, d’une chaîne de longueur quelconque, et d’un z .

Nous pouvons remarquer qu’il va assurer la substitution de la plus

longue sous-chaîne possible en allant chercher le z le plus éloigné.

Commandes SED Substitution

##### Utilisation d’un ensemble : Les ensembles de caractères sont très souvent utilisés pour mettre en correspondance des chaînes, sans tenir compte des majuscules et des minuscules.

07/12/17 Atelier S.E 39

Commandes SED Substitution

Remplacement du caractère & : Le métacaractère & remplace toute la chaîne de caractères mise en correspondance avec l’expression rationnelle en premier argument.

Par exemple, nous pouvons l’employer pour encadrer un

mot ( Linux en l’occurrence) par les balises HTML et réclamant un affichage en caractères gras. Il faut protéger le caractère / de la balise par un \ :

Références arrière

Lorsque des parties de l’expression régulière ont été encadrées par des parenthèses (elles-mêmes protégées par des \ ) dans le motif recherché, il est possible d’y faire référence dans l’expression de remplacement, en utilisant les symboles \1 pour la première sous-expression, \2 pour la deuxième, et ainsi de suite.

07/12/17 Atelier S.E 41

Références arrière

07/12/17 Atelier S.E 42

Exercice 1

1)Transformer les caractères a, b et c du fichier /etc/passwd par un @ de la ligne 11 à 20 2) Transformer les mots du fichier /usr/share/dict/french qui commencent par une voyelles et se terminent par un z par le mot LINUX 3) Transformer les mots du fichier /usr/share/dict/french qui commencent par une consonne et se terminent par un z par le mot Ubuntu

07/12/17 Atelier S.E 43

Correction exercice 1

1)$sed -e '11,20s/ /@/g' /etc/passwd 2)$sed -e 's/^ .z$/Linux/g' /usr/share/dict/french 3)$sed -e 's/^[^aeiouâîûéêô].z$/Ubuntu/g' /usr/share/dict/french

07/12/17 Atelier S.E 44

Exercice 2

#### Sauvez une page web de votre choix et observez le code html dans gedit.

#### Créez avec sed un « dé-htmliseur », c’est-à-dire une commande qui retire toutes les balises HTML.

En HTML, les balises sont de la forme ou

.

Vous devez donc détruire tous les caractères compris

entre < et >

07/12/17 Atelier S.E 45

Correction Exercice 2

07/12/17 Atelier S.E 46

AWK: Alfred Aho, Peter Weinberger et Brian Kernighan

07/12/17 Atelier S.E 47

AWK

Si Sed est régulièrement utilisé pour rechercher et remplacer des sous-chaînes dans des fichiers de texte, Awk, pour sa part, est fréquemment employé pour extraire les divers champs contenus dans chaque ligne d’enregistrement d’un fichier.

Ce sont en quelque sorte leurs emplois naturels, ceux pour lesquels l’administrateur système invoquera sans hésiter ces langages au sein d’une chaîne de commandes shell

07/12/17 Atelier S.E 48

Fonctionnement de Awk

###### Le principe général de Awk est le même que celui de Sed :

lecture des lignes de texte sur l’entrée standard,

traitement en fonction d’instructions regroupées sur la ligne

Advertisement

de commande ou dans un fichier externe

et écriture des résultats sur la sortie standard.

###### Les commandes pour awk ont la forme :

motif { action }

où l’action est appliquée à chaque ligne d’entrée qui permet

une mise en correspondance avec le motif

07/12/17 Atelier S.E 49

Les motifs

Les motifs avec lesquels les lignes sont comparées ressemblent quelque peu aux sélections déjà rencontrées avec Sed, mais offrent plus de possibilités.

Tout d’abord, un motif peut être composé d’une expression

régulière exprimée entre caractères slash.

Par exemple, la commande /root/ {print} applique l’action print aux lignes contenant le mot root .

Lorsque l’entrée standard provient du fichier /etc/passwd, nous

obtenons

07/12/17 Atelier S.E 50

Les motifs

###### Un motif de sélection peut également être représenté par une relation, c’est-à-dire un test réalisé sur un champ donné de la ligne.

à titre d’exemple, la sélection $1~/tcp/ vérifie si le

premier champ de la ligne (les champs sont par défaut séparés par des espaces) contient l’expression rationnelle tcp .

07/12/17 Atelier S.E 51

Les motifs

Seule, la sélection /tcp/ accepte aussi le motif tcp en seconde colonne, affichant bien plus de lignes

Les motifs

### Un motif de sélection peut être une combinaison logique de plusieurs expressions, à l’aide des opérateurs booléens && (ET), || (OU), ! (NON)

07/12/17 Atelier S.E 53

Les motifs

L’opérateur ? qui s’emploie sous la forme motif1 ? motif2 : motif_3 . Si le premier motif est validé, la mise en correspondance se fait avec le deuxième, sinon avec le troisième.

On peut égale ment écrire cela avec la forme (motif1 && motif2) ||

motif_3 .

Comme on le voit, on peut regrouper les motifs de sélection entre

parenthèses pour gérer les priorités.

07/12/17 Atelier S.E 54

Les motifs

Deux sélections particulières, BEGIN et END, sont aussi disponibles.

Une instruction qui commence par BEGIN est exécutée au démarrage du

programme, avant toute tentative de lecture.

Symétriquement, une instruction END est exécutée après la fin de tout le

fichier, juste avant la terminaison de awk .

La ligne BEGIN est très utile pour l’initialisation de awk, notamment quand

il s’agit de remplir les variables requises pour l’exécution du programme.

07/12/17 Atelier S.E 55

Les actions

Une instruction Awk, est composée en premier lieu d’un motif de sélection et d’une seconde partie qui contient les actions à entreprendre sur les lignes de l’entrée standard ainsi sélectionnées.

Les actions sont regroupées entre accolades et séparé éventuellement par des « ; »

Un jeu complet d’actions est disponible avec Awk (entrées-sorties, opérations arithmétiques, interactions avec le système, manipulations de chaînes de caractères...), néanmoins force est de constater qu’une grande majorité des scripts Awk couramment employés se limite à l’action print .

07/12/17 Atelier S.E 56

Les variables

Awk autorise la création et la consultation de variables, susceptibles de contenir aussi bien des chaînes de caractères que des valeurs numériques en virgule flottante.

Comme dans la plupart des langages interprétés, les variables sont créées dynamiquement sans nécessiter de déclaration préalable.

Une variable commence à exister dès qu’on lui affecte une valeur.

Lorsqu’une valeur doit être initialisée avec une valeur non nulle, on emploiera une instruction BEGIN

07/12/17 Atelier S.E 57

Les variables

07/12/17 Atelier S.E 58

Les variables

L’utilisation des variables est simple et intuitive, awk assurant la conversion des données numériques en chaînes de caractères (et inversement) suivant le contexte d’utilisation.

On remarquera que, contrairement au shell, il n’y a pas lieu d’ajouter de caractère particulier comme le $ pour accéder au contenu d’une variable.

Dans la commande print, nous avons affiché une variable particulière : $0 . Elle représente toujours la ligne qui vient d’être lue sur l’entrée standard.

La notation nb++ est un raccourci pour dire « incrémenter la variable nb ».

07/12/17 Atelier S.E 59

Enregistrements et champs

Les enregistrements

#### On considère que le fichier d’entrée est constitué d’une suite d’enregistrements, eux- mêmes composés de plusieurs champs.

#### Par défaut, les enregistrements correspondent aux lignes du fichier d’entrée, séparés donc par un caractère de saut de ligne, mais on peut modifier ce séparateur pour lire des fichiers organisés différemment.

07/12/17 Atelier S.E 60

Enregistrements et champs

Les enregistrements

La variable spéciale RS (Record Separator) décrit la séparation entre les enregistrements

Lorsque RS est vide, la séparation se fait sur des lignes

blanches, ce qui peut servir à traiter un fichier de texte paragraphe par paragraphe

Advertisement

Lorsque RS contient un seul caractère, celui-ci sert de

séparateur d’enregistrements ; par défaut c’est le saut de ligne ;

Lorsque RS contient plusieurs caractères, sa valeur est

considérée comme une expression rationnelle décrivant les séparations. Si on veut indiquer plusieurs séparateurs possibles, il faut donc les regrouper entre crochets, en mentionnant ainsi une alternative.

07/12/17 Atelier S.E 61

Enregistrements et champs

Les enregistrements

07/12/17 Atelier S.E 62

Enregistrements et champs

Les champs

Lorsque l’interpréteur awk reçoit un enregistrement, il le découpe automatiquement en champs. L’enregistrement lui-même est représenté par la variable spéciale $0 .

Les champs sont disponibles dans les variables $1, $2, $3, et ainsi de suite jusqu’au dernier. Le nombre de champs détectés est inscrit dans la variable NF, il est ainsi possible d’accéder directement au dernier champ avec l’expression $NF, à l’avant-dernier avec $(NF-1), etc.

07/12/17 Atelier S.E 63

Enregistrements et champs

Les champs

Par défaut, les champs sont séparés par des caractères blancs (espaces ou tabulations), mais cela peut être modifié par l’intermédiaire de la variable FS (Fields Separator), avec les conventions suivantes :

lorsque FS est vide, chaque caractère est considéré comme

un champ indépendant ; $1 contiendra le premier caractère, $2 le suivant, et ainsi de suite ;

lorsque FS contient un seul caractère, il est considéré

comme étant un séparateur de champs ;

lorsque FS contient plusieurs caractères, il s’agit d’une

expression rationnelle qui décrit la séparation.

07/12/17 Atelier S.E 64

Enregistrements et champs

Les champs

07/12/17 Atelier S.E 65

Enregistrements et champs

Les champs

### Dans nos précédents scripts, nous avons créé une variable pour compter les enregistrements lus (nb).

### En réalité, l’interpréteur awk tient à jour automatiquement ce compte dans une variable spéciale nommée NR (Number of Records) :

07/12/17 Atelier S.E 66

Enregistrements et champs

Les champs

07/12/17 Atelier S.E 67

Exercice 1

### Écrire un script awk qui compte le nombre de mots et de lignes dans un fichier texte

07/12/17 Atelier S.E 68

Correction Exercice 1

07/12/17 Atelier S.E 69

Exercice 2

### Donnez le script AWK qui permet de compter le nombre de lignes qui contiennent la chaîne "bash" dans le fichier /etc/passwd

07/12/17 Atelier S.E 70

Correction Exercice 2

07/12/17 Atelier S.E 71

Structures de contrôle

#### Le langage Awk permet d’utiliser des structures de contrôle variées, mais elles sont très peu utilisées dans son emploi habituel.

07/12/17 Atelier S.E 72

Les tableaux associatifs

##### Awk permet de déclarer des tableaux associatifs

Les éléments de ces derniers sont indexés par des

chaînes de caractères plutôt que par des indices entiers,

La définition et la consultation d’un élément d’un tableau

se font simplement en indiquant l’indice entre crochets

07/12/17 Atelier S.E 73

Affichage avec printf

### Printf est une version plus performante que print, qui permet un affichage formaté :

###### Celle-ci prend en premier argument une chaîne de caractères qui décrit le format à utiliser pour présenter les données.

###### Ensuite viennent les variables à afficher suivant le format indiqué.

###### Exemple : {printf "%d\n", $0}

07/12/17 Atelier S.E 74

Exercice 3

### En utilisant sed retirer la ponctuation d’un texte

### Compter les fréquences des mots de ce texte en utilisant des tableaux associatifs

###### NB utiliser tolower($0) pour mettre tout une ligne en miniscule

07/12/17 Atelier S.E 75

Correction Exercice 3

### sed -e 's/[[:punct:]]/ /g' fichier3 > fichier4

07/12/17 Atelier S.E 76