Vous êtes sur la page 1sur 5

Tuteurs informatique

Nous contacter

Utiliser ce site
Actu et stages
Docs imprimer
Plan du site
Rechercher
Les tuteurs
Unix
Exercices
Solutions
Prise de
contact
cp et mv
Pipes
find
grep
Interface
less
ls
Rpertoires
Systme
Commandes
Unix
Serveur des lves
ENS
SPI

Exercices sur grep : corrigs


Les options de grep
Introduction aux expressions rgulires
Ces exercices sont des questions de cours : les solutions se trouvent toutes dans les pages de man des
commandes en question. On suppose donc connues les commandes de less, qui servent se dplacer dans
les pages de man... et la commande servant chercher un mot. Testez les commandes sur des fichiers et
rpertoires d'essai pour vous faire la main et comprendre ce qui se passe.

Les options de grep


1. Quelles sont les options de grep qui permettent d'obtenir des lignes de contexte (qui prcdent
et/ou suivent la ligne o figure le mot) ?
Il y en a plusieurs, qui se recoupent :
: le numro indique le nombre de lignes de contexte que l'on veut voir figurer avant et
aprs la ligne o figure le mot recherch. Par exemple, si on veut trois lignes de contexte,
avant et aprs la mot (soit sept lignes au total), on tape :
-num

grep -3 ...

(after) : le numro indique le nombre de lignes qui doivent suivre la ligne o figure le
mot. Si on en veut quatre, on tapera :
-A num

grep -A 4 ...

(before) : le numro indique le nombre de lignes qui doivent prcder la ligne o


figure le mot. Si on en veut dix, on tape :
-B num

grep -B 10 ...

(context) : quivalent -num. En fait, les trois lignes suivantes sont strictement
quivalentes :
-C num

grep -2 ...
grep -C 2 ...
grep -A 2 -B 2 ...

2. Comment faire apparatre le numro de la ligne o figure le mot recherch ?


C'est l'option -n (number) qui sert cela; le numro figure tout au dbut de la ligne, suivi d'un
deux-points (:) et du texte. Par exemple :
bireme ~ $ grep -n violon verlaine.tex
12:des violons de l'automne

Quand on fait une recherche dans plusieurs fichiers, le nom du fichier figure d'abord, puis le
numro de la ligne, et enfin le texte, le tout spar par des deux-points. Par exemple :
bireme ~ $ grep -n violon *
verlaine.tex:12:des violons de l'automne
orchestre:45:Cordes : contrebasse, violoncelle, alto, violons.

Que se passe-t-il quand on demande galement des lignes de contexte ?


La disposition gnrale ne change pas, par contre, le signe utilis pour sparer la ligne de son
numro est un tiret (-) quand il s'agit des lignes de contexte, et un deux-points quand il s'agit de la
ligne voulue. Par exemple :
bireme ~ $" grep -nC violon verlaine.tex
1011-Les sanglots longs
12:des violons de l'automne
13-bercent mon coeur
14-d'une langueur monotone

3. Comment faire pour afficher le nombre d'occurences du mot recherch ?


On utilise l'option -c (count) :

bireme ~ $ grep -c violon *


verlaine.tex:1
orchestre:1

4. Comment faire pour que grep ignore la casse des caractres (diffrence entre majuscules et
minuscules) dans sa recherche ?
Par dfaut, grep fait la diffrence entre les majuscules et les minuscules; pour invalider ce
comportement, on utilise l'option -i (ignorecase).
5. Comment faire pour faire apparatre non pas les lignes o figurent le mot, mais les noms des
fichiers ?
C'est l'option -l qui permet de faire cela : afficher les noms des fichiers o figure au moins une
fois la chane de caractres recherche.
6. Comment faire apparatre les lignes o ne figurent pas le mot recherch ?
On veut en fait inverser le sens de la recherche : c'est l'option -v qui fait cela.
7. Comment faire apparatre les noms des fichiers ne contenant pas le mot recherch ?
On utilise l'option -L, qui affiche les noms de fichiers o ne figurent pas la chane de caractres
recherche. Il ne faut bien sr pas confondre les options -l et -L...
8. Comment faire pour que grep ne recherche que les lignes o figure le mot tel quel, et non pas
ses variantes ?
C'est l'option -w (comme word) qui sert cela : un mot complet est dlimit comme suit :
Dbut : la chane de caractres est place au dbut d'une ligne, ou prcde d'un blanc, d'une
tabulation ou d'une ponctuation.
Fin : la chane de caractre est place en fin de ligne, ou suivie d'un blanc, d'une tabulation ou
d'une ponctuation.
Si donc on veut chercher travail et aucune forme drive de ce mot, on crit :
grep -w travail mon-fichier

9. Comment faire pour chercher plusieurs mots la fois en faisant apparatre les numros des
lignes ?
On veut chercher toutes les occurences des mots terre et ciel dans les deux premiers
chapitres de la premire partie de Germinal, avec les numros des lignes. On propose deux
solutions, la premire utilisant les ressources de la syntaxe de grep, la seconde utilisant l'option -f
avec un fichier.
1. Syntaxe de grep : La structure \(mot1\|mot2\) permet de chercher plusieurs mots. Ici, on
tape la ligne suivante :
grep '\(ciel\|terre\)' fichier

On met des apostrophes de part et d'autre de l'expression pour la protger contre le shell,
c'est--dire pour que le shell ne cherche pas interprter l'expression.
2. Option -f fichier : dans un fichier quelconque, que nous appellerons liste, on indique les
mots que l'on recherche : ciel et terre. Chaque ligne correspond un mot recherch. Il ne
faut donc pas mettre de ligne comme
terre ciel

car le programme chercherait la chane de caractres terre ciel, qui est assez improbable en
franais. Il ne faut pas non plus laisser de ligne blanche : le programme afficherait l'ensemble
du texte.
Quelle que soit la solution retenue, on veut ensuite afficher le numro des lignes (option -n);
d'autre part, pour que la recherche soit exhaustive, il vaut mieux que grep ne fasse pas de diffrence
entre les majuscules et les minuscules, avec l'option -i (ignore case, ignorer la casse des caractres).
Il faut aussi dcider si on cherche les mots tels quels, sans leurs variantes (comme terre au
pluriel), ou si on accepte ces variantes. Si on ne veut que le mot sans ses drivs, on utilise l'option w.
Pour dsigner les deux fichiers o faire la recherche, on peut les crire littralement :
zola1.txt zola2.txt

ou, mieux, utiliser les joker du shell :


zola[12].txt
[12]

signifie le caractre 1 ou le caractre 2.

Finalement, on peut taper, au choix :

grep
grep
grep
grep

-inw
-inw
-inw
-inw

-f liste zola1.txt zola2.txt


-f liste zola[12].txt
'\(ciel\|terre\)' zola1.txt zola2.txt
'\(ciel\|terre\)' zola[12].txt

Et on obtient :
zola1.txt:13:ciel, le pav se droulait avec la rectitude d'une jete, au
milieu de
zola1.txt:36:brlaient si haut dans le ciel mort, pareils des lunes fumeuses.
Mais, au
zola1.txt:50:besogne. Les ouvriers de la coupe terre avaient d travailler
tar d, on
zola1.txt:124:terre, lorsqu'un accs de toux annona le retour du charretier.
Le ntement,
zola1.txt:191:bleues en plein ciel, comme des torches gantes. C'tait d'une
tristesse
zola1.txt:207:
Le manoeuvre, aprs avoir vid les berlines, s'tait assis
terre,
zola1.txt:222:fois avec tout le poil roussi, une autre avec de la terre jusque
dans le
(...)

Le rsultat est un peu diffrent quand on n'utilise pas l'option -w.

Introduction aux expressions rgulires


recherche des chanes de caractres, qui peuvent tre un mot complet (terre), une suite de
lettres (tre), ou une expression rgulire. Les expressions rgulires sont des formules qui reprsentent
des chanes de caractres. On cherche alors non pas un mot prcis, mais des suites de caractres
correspondant aux critres demands. Elles sont d'un usage frquent avec grep bien sr, mais aussi avec
des commandes comme less, ou encore au sein d'un diteur.
grep

Expressions rgulires (Regular expressions en anglais) se traduisent en bon franais par


expressions rationnelles, mais l'usage est de dire rgulires.
Ces exercices n'entendent pas remplacer un cours sur les expressions rgulires, ni faire le tour de
leurs possibilits.
1. Chercher toutes les lignes commenant par a ou A.
Il faut indiquer que l'on veut le dbut de la ligne, avec le chapeau (caret en anglais). Ensuite, on
veut prciser que la ligne commence par un a minuscule ou majuscule. Il y a deux faons de le
faire :
Utiliser l'option -i qui fait ignorer la diffrence entre les majuscules et le minuscules.
Dire que l'on cherche un a ou un A. C'est cela que servent les crochets : [abc] signifie
a ou b ou c. Ici, ce sera [aA].
Enfin, il faut protger les signes contre le shell, pour qu'il ne les interprte pas; on met donc
l'expression entre apostrophes. Remarque : la protection des expressions rgulires contre le shell est
une question complexe....
Il faut donc crire :
grep -i '^a' fichier

ou
grep '^[aA]' fichier

2. Chercher toutes les lignes finissant par rs


C'est le dollar ($) qui reprsente la fin de la ligne. Il faut donc crire :
grep 'rs$' fichier

3. Chercher toutes les lignes contenant au moins un chiffre


Pour dsigner un chiffre, on peut en indiquer une liste entre crochets : [0123456789]. Il est
plus simple d'utiliser une classe de caractres : [0-9] qui dsigne, comme la solution prcdente,
n'importe quel chiffre de zro neuf.
Il faut donc taper :
grep '[0-9]' fichier

4. Chercher toutes les lignes commenant par une majuscule


Comme on l'a vu, c'est le chapeau qui indique le dbut de la ligne. Pour indiquer que l'on
cherche une majuscule, on peut soit en donner une liste ([ABCDEFGHIJKLMNOPQRSTUVWXYZ]), soit
utiliser une classe de caractres : [A-Z], la seconde solution tant, de loin, prfrable...
Il faut donc taper :
grep '^[A-Z]' fichier

5. Chercher toutes les lignes commenant par B, E ou Q


Il faut indiquer entre crochets les trois lettres recherches :
grep '^[BEQ]' fichier

6. Chercher toutes les lignes finissant par un point d'exclamation


Le point d'exclamation n'a pas de signification particulire avec grep, on peut donc le mettre tel
quel :
grep '!$' fichier

7. Chercher toutes les lignes ne finissant pas par un signe de ponctuation (point, virgule, pointvirgule, deux-points, point d'interrogation, point d'exclamation)
Il faut donner une liste de caractres, que l'on ne veut pas voir figurer; la liste sera entre
crochets, comme on l'a dj vu, et c'est le chapeau qui signifiera, dans ce contexte, sauf. Par
exemple, si on cherche tous les a, sauf ceux suivi de b, c ou t, on crit :
grep 'a[^bct]'

Il y a une seconde difficult, qui vient de ce que certains caractres sont spciaux avec grep.
Vous vous doutez que le chapeau est spcial quand il est plac au dbut de l'expression, et que le
dollar l'est quand il est plac en fin d'expression. Dans notre cas :
Le point dsigne n'importe quel caractre.
Le point d'interrogation signifie le caractre qui prcde apparat 0 ou 1 fois. Avec egrep, il
fonctionne tout seul, avec grep, il faut le faire prcder d'un backslash pour qu'il fonctionne;
par exemple (avec grep), pour chercher charbon ou vagabond, on crit :
grep 'ar\?bo' fichier

(chercher la suite de lettre abo avec un r facultatif entre le a et le b).


Pour que grep interprte littralement ces caractres, et ne les considre plus comme spciaux,
il faut les faire prcder d'un backslash (\). Si par exemple vous cherchez toutes les lignes qui se
terminent par un point, il faut taper :
grep '\.$' fichier

Dans notre cas cependant, ces caractres sont protgs par les crochets. On peut donc crire :
grep '[^.,;:?!]$' fichier

On peut aussi utiliser l'option -v, qui prend toutes les lignes o ne figure pas une chane de
caractres donne; dans ce cas, on tape :
grep

-v '[.,;:?!]$' fichier

8. Comment chercher tous les mots contenant un r prcd de n'importe quelle lettre
majuscule ou minuscule ?
On cherche une chane de caractres qui soit indiffremment au dbut ou au milieu d'un mot.
N'importe quelle lettre, ce sont les classes de caractres [a-zA-Z] ou [:alpha:], qui sont
quivalentes.
Il y a une petite subtilit avec l'emploi de classes du second type; elles dsignent un groupe de
caractres, et il faut mettre une seconde paire de crochets pour dire n'importe quel caractre de
cette classe prdfinie. On tape donc au choix :
grep '[a-zA-Z]r' fichier'

ou
grep '[[:alpha:]]r' fichier'

Attention, dans ces listes ne sont pas compris les caractres accentus...
9. Chercher tous les mots dont la seconde lettre est un r.
C'est le symbole \< qui dsigne un dbut de mot. La premire lettre du mot est indiffrente, la

seconde est un r. On crit donc :


grep '\<.r' fichier

Il y a cependant un problme avec les caractres accentus, que grep considre comme des
blancs. Dans ce cas, il vaut mieux procder autrement : un mot est prcd d'un dbut de ligne, ou
d'un blanc ou d'une tabulation. Un dbut de ligne, c'est le chapeau, un blanc ou une tabulation, c'est
la classe de caractres [:space:].
On va se servir du pipe (|) qui signifie ou. Avec grep, il faut backslasher le pipe, avec egrep
ce n'est pas ncessaire. On crit donc (avec grep) :
grep '^.r\|[[:space:]].r' fichier

Ce n'est quand mme pas si simple; les mots peuvent tre prcds d'un tiret (mots composs),
d'une apostrophe, de guillemets divers (``, ", , <<), et, si l'auteur du texte n'est pas respectueux des
rgles de typographie, d'une ponctuation. Il y a donc bien des cas envisager...

Auteur : milia Robin, Jol Riou. Dernire modification : Mon Feb 2 16:02:21 2015 +0100 par Louis Jachiet.