grep mot fichiers
grep
mot fichiers sert à retrouver
une chaîne de caractères dans des fichiers (zgrep
, beaucoup moins
standard, s'utilise avec les fichiers compressés). Nous n'entrerons pas dans
les détails de la syntaxe. Il suffit de savoir que :
*.tex |
(étoile point tex) | signifie « n'importe quel fichier .tex »
(*.tex signifie « tout ce qui ne commence pas par un point et
qui finit par .tex »). |
**/ |
(étoile étoile) | désigne le répertoire courant et tous ses sous-répertoires. |
Donc :
Pour chercher «coucou» dans | On tape |
---|---|
Tous les fichiers .tex du répertoire où l'on se trouve |
grep coucou *.tex |
Tous les fichiers du répertoire où l'on se trouve | grep coucou * |
Tous les fichiers .tex du répertoire courant et de ses
sous-répertoires |
grep -r --include="*.tex" coucou |
Tous les fichiers du répertoire courant et de ses sous-répertoires | grep -r coucou . |
Par exemple, Toto cherche le mot «travail» dans tous les fichiers
.tex
du répertoire où il se trouve :
corvette ~ $ grep travail *.tex
caire.tex:les voit presque tous les matins, travailler par équipes de deux ou
jordanie.tex:méridionale, le socle ancien apparaît. Le travail de l'érosion dans les
jordanie.tex:Le pays compte également sur les remises des travailleurs expatriés qui, au
Quand plusieurs fichiers sont parcourus, grep
indique dans quel
fichier se trouve le mot demandé (mot au sens de «chaîne de caractères»).
grep
Il y a différentes options à grep
, dont :
grep -n
: indique le numéro de la ligne où
figure le mot.
grep -C
( contexte) : fait figurer les deux
lignes qui précèdent et suivent la ligne où figure le mot recherché.
grep -i
(ignore case) : fait ignorer la
casse des caractères (différence entre majuscules et minuscules).
grep -c
(count) : indique le nombre de lignes
où figure au moins une fois le mot recherché dans chacun des fichiers passés
en revue.
Bien entendu, ces options sont compatibles entre elles :
corvette ~ $ grep -nC travail caire.tex caire.tex-371-société. On compte environ 40\,000 de ces éboueurs chiffonniers qui caire.tex-372-vivent dans de misérables bidonvilles aux abords de la capitale. On caire.tex:373:les voit presque tous les matins, travailler par équipes de deux ou caire.tex-374-trois hommes, habillés comme des épouvantails, avec des chapeaux de caire.tex-375-paille et de vieux vêtements hétéroclites; accompagnés de leurs corvette ~ $ grep -c travail *.tex caire.tex:1 egypte.tex:0 jordanie.tex:2 syrie.tex:0
Défilement : il peut arriver que le mot recherché figure très souvent, et qu'une série de lignes se mettent à défiler sur l'écran, parce qu'elle n'ont pas la place d'y figurer toutes. Dans ce cas, vous pouvez taper
grep machin * | less
Le |
( pipe en anglais : tuyau) connecte la sortie
standard d'une commande (c'est-à-dire le résultat visible de cette
commmande) sur l'entrée standard d'une autre commande (ici
less
); dans notre cas, cela signifie que les lignes produites
par grep
pourront être lues avec less
, comme un
fichier.
Lignes parasites : grep
passe en revue tous
les répertoires et fichiers; quand on ne lui précise pas la nature du fichier
(*
et non pas *.tex
), il signale tous les
répertoires qu'il examine. Pour éliminer toutes ces lignes parasites, il faut
ajouter 2>/dev/null
à la fin de la ligne de commande
(/dev/null
est une sorte de poubelle où on redirige les données
dont on veut se débarasser). Par exemple :
grep coucou **/* 2>/dev/null grep coucou **/* 2>/dev/null | less
Allez faire les exercices sur grep et les expressions régulières.
find
find répertoire fichier
sert à
retrouver un fichier selon certaines caractéristiques (nom, taille...).
L'option -name
sert à indiquer le nom du fichier recherché :
find répertoire -name nom-du-fichier
Le répertoire est ~
(tilde) quand on veut chercher dans tout son
compte, .
(point) quand on veut chercher dans le répertoire
courant (et ses sous-répertoires).
egypte.tex
(qui se
trouve dans un répertoire geo/
) :
corvette ~ $ find ~ -name egypte.tex /users/97/litt/toto/geo/egypte.tex
~toto/histoire/moderne/documents/
il y a un fichier
appelé chrono
et Toto se trouve dans
histoire/
:
corvette $ find . -name chrono ./moderne/documents/chrono
Si vous ne vous rappelez que d'une partie du nom du fichier, on utilise les jokers (voir le cours du Hublot sur Les jokers, numéro 2, décembre 1999). Reprenons le cas 1; Toto sait juste qu'il y a «gypt» dans le nom du fichier; il fera ainsi sa demande :
corvette ~ $ find ~ -name '*gypt*' /users/97/litt/toto/geo/egypte.tex
« *gypt*
» peut se comprendre comme « n'importe quoi avant
et après la suite de caractères « gypt ». Les quotes
(apostrophes) servent à garantir que les étoiles seront interprétées par
find
, et non par le shell.
Find est une commande très puissante, qui permet de chercher un fichier non seulement en fonction de son nom, mais aussi de son type, de sa date de modification, de sa taille... Pour toutes ces options, voir les exercices sur find.