Faire une recherche dans des fichiers texte avec grep

Un article de Wiki de la communauté Mandriva.

Jump to: navigation, search

CETTE PAGE EST UNE VERSION RÉVISÉE D'UNE SECTION DE LA PAGE MAINTENANT OBSOLÈTE DE L'ANCIENNE BASE DE CONNAISSANCES : http://club.mandriva.com/xwiki/bin/view/KB/BasicsBdoc3 ptyxs 25 février 2008 à 08:03 (CET)



Sommaire

[modifier] Les bases : comment chercher avec grep

Pour chercher une chaîne de caractères dans un ou plusieurs fichier(s), utilisez grep.

grep cherche un motif particulier dans des textes.

Voici un premier exemple d'emploi. J'ai réuni dans un répertoire un ensemble de scripts publiquement téléchargeables, issus du site d'un éditeur. Les noms de ces fichiers de scripts sont de simples numéros. Je voudrais retrouver ceux, ou celui, qui concernent la mise au point d'une calculette décimale en console.

Je me place dans le répertoire qui contient les scripts, puis je lance grep :

Image:Konsole.png
[utilisateur@ordi ~]$ grep calc *
24:# calc - Une calculatrice en ligne de commande qui sert d'interface à bc.

et voilà, il s'agit du script dont le nom de fichier est simplement 24.

Vous voyez que grep vous donne ici une réponse du type :

nom_de_fichier: ligne de ce fichier contenant le motif recherché

À noter !
Vous remarquerez sur votre écran que la suite de lettres qui correspond au motif recherché est colorisée, ceci grâce à un alias Mandriva : alias grep='grep --color' (vous pourrez vérifier que cet alias est activé sur votre système en tapant la commande... alias).

Vous avez noté que nous avons demandé à grep de chercher dans un ensemble de fichiers (tous les fichiers du répertoire de travail où nous nous étions placé), et ceci grâce au joker étoile de l'expansion des noms de fichiers. Il aurait bien entendu été possible aussi de lancer une recherche sur un unique fichier.

Un jour ou l'autre vous vous demanderez si tel ou tel paquetage est installé sur votre ordinateur. grep vous sera alors très utile. Vous obtiendrez la liste de tous les paquetages rpm installés par la commande rpm -qa et vous enverrez cette liste à grep par un tube de façon à filtrer dans cette liste la ligne qui contient le nom du paquetage qui vous intéresse. Par exemple, si vous voulez savoir si le paquetage anacron est installé, cela donnera quelque chose comme ceci :

Image:Konsole.png
[utilisateur@ordi ~]$ rpm -qa | grep anacron anacron-2.3-22mdv2008.0

Par défaut, grep effectue sa recherche uniquement à la racine du répertoire courant, mais vous pouvez lui demander de faire sa recherche aussi dans les sous-répertoires (il fera alors une recherche dite récursive), pour cela tapez -r avant le motif et le filtre de fichiers :

Image:Konsole.png
[utilisateur@ordi ~]$ grep -r motif fichiers

Si vous vous attendez à une sortie abondante, envoyez-la à un programme comme less via un tube :

Image:Konsole.png
[utilisateur@ordi ~]$ grep -r motif fichiers | less

Moyennant quoi, vous pourrez faire défiler tranquillement page à page la sortie de grep.

Une chose dont il est important de se souvenir est que vous devez fournir des fichiers à grep (vous pouvez très bien vous contenter d'ajouter simplement *, le symbole qui signifie : tous les fichiers, comme nous l'avons fait). Si vous oubliez cela grep attendra des données en provenance de l'entrée standard… Si vous vous retrouvez dans cette situation, tapez <CTRL c>, pour arrêter grep, puis retapez votre commande en ajoutant des fichiers. <math>Entrez votre formule ici</math>

[modifier] Options

[modifier] Rechercher sans tenir compte de la casse

Voilà quelques-unes des options les plus intéressantes de grep :

Image:Konsole.png
[utilisateur@ordi ~]$ grep -i motif fichiers

lance une recherche qui ne distingue pas les majuscules des minuscules, alors que par défaut, sans cette option, la recherche respecte la casse.

[modifier] Obtenir seulement les noms des fichiers qui contiennent le motif

Image:Konsole.png
[utilisateur@ordi ~]$ grep -l motif fichiers

énumère seulement les noms des fichiers qui correspondent (qui contiennent le motif) sans afficher les lignes qui contiennent le motif :

Image:Konsole.png
[utilisateur@ordi ~]$ grep -l sucre /etc/toto/confitures/*

abricots.txt poires.txt

[modifier] Obtenir seulement les noms des fichiers qui ne contiennent pas le motif

Inversement :

Image:Konsole.png
[utilisateur@ordi ~]$ grep -L motif fichiers

énumère les noms des fichiers qui ne correspondent pas (qui ne contiennent pas le motif recherché).

[modifier] Obtenir les lignes qui ne contiennent pas le motif

Image:Konsole.png
[utilisateur@ordi ~]$ grep -v motif fichiers

énumère les lignes qui ne contiennent pas le motif recherché dans les fichiers ciblés par le filtre de fichier.

[modifier] Chercher uniquement des mots et non des parties de mots

Image:Konsole.png
[utilisateur@ordi ~]$ grep -w motif fichiers

recherche des mots entiers correspondant au motif et non des parties de mots (grep -w magic fichiers trouvera magic SysRq mais pas magicien).

[modifier] Afficher aussi le contexte

Image:Konsole.png
[utilisateur@ordi ~]$ grep -nombre motif fichiers

détermine quel nombre de lignes de contexte sont affichées avant et après chaque occurrence trouvée (souvent bien utile pour comprendre ce que vous trouvez).

[modifier] Une règle de bonne pratique

Attention !
Prenez l'habitude de mettre le motif entre guillemets simples. Lorsque vous taperez dans le motif autre chose que des lettres et des chiffres, cela vous évitera bien des déboires (les guillemets empêchent le shell d'interpréter pour son propre compte les nombreux caractères qui ont un sens pour lui).

[modifier] Techniques diverses

[modifier] Chercher des lignes qui contiennent l'un ou l'autre des motifs fournis

Image:Konsole.png
[utilisateur@ordi ~]$ grep 'motif1\|motif2' fichiers

énumère les lignes qui contiennent motif1 ou motif2 (ou qui contiennent les deux). Notez bien la barre oblique inverse \ devant la barre verticale | et la position des guillemets : tout cela est indispensable.

[modifier] Chercher des lignes qui contiennent tous les motifs fournis

Image:Konsole.png
[utilisateur@ordi ~]$ grep motif1 fichiers | grep motif2

énumère les lignes qui contiennent et motif1 et motif2.

[modifier] Chercher des mots qui commencent ou finissent d'une certaine façon

Il existe certains caractères spéciaux qui vous aideront à raffiner votre recherche :


  • \< et \> correspondent au début et à la fin d'un mot.

Exemples :

Image:Konsole.png
[utilisateur@ordi ~]$ grep lin *

trouvera calin, linge, lin etc. tandis que :

Image:Konsole.png
[utilisateur@ordi ~]$ grep '\<lin' *

trouvera linge et lin, mais pas calin.

Image:Konsole.png
[utilisateur@ordi ~]$ grep 'lin\>' *

trouvera lin et calin, mais pas linge.

Image:Konsole.png
[utilisateur@ordi ~]$ grep '\<lin\>' *

ne trouvera que lin, mais pas calin ni linge ni aucune autre chaîne de caractères (mais dans ce cas il devrait être plus simple de taper grep -w lin *, avec l'option -w déjà vue plus haut).

[modifier] Chercher des lignes qui commencent d'une certaine façon

  • ^ : signifie début de ligne


Image:Konsole.png
[utilisateur@ordi ~]$ grep '^a' *

cherchera les lignes qui commencent par la lettre a. Par exemple, on sait que le nom des paquetages du noyau Linux commencent par kernel, pour rechercher ceux qui sont installés on pourra donc faire :

Image:Konsole.png
[utilisateur@ordi ~]$ rpm -qa | grep '^kernel'

[modifier] Chercher des lignes qui finissent d'une certaine façon

  • $ : signifie fin de ligne
Image:Konsole.png
[utilisateur@ordi ~]$ grep 'a$' *

cherchera les lignes qui finissent par la lettre a.

[modifier] Et pour finir...

À noter !

Un peu de terminologie : Dans tous les exemples qui précèdent, le premier des deux arguments de grep, celui qui représente le motif, est ce qu'on appelle une expression régulière ou une expression rationnelle ou une regex (parfois même : regexp...).

Vous trouverez un exemple d'emploi d'une variante de grep : egrep à la section Le shell sans peine#Un exemple de fonction : apros.