Documente Academic
Documente Profesional
Documente Cultură
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
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 ...
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 ...
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.
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
grep
grep
grep
grep
-inw
-inw
-inw
-inw
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
(...)
ou
grep '^[aA]' 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
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
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.