Manuel de l'Utilisateur Expérimenté Solaris

Recherche d'un modèle à l'aide de la commande grep

La commande grep permet de rechercher une chaîne de caractères donnée dans un fichier. La syntaxe de base de la commande grep est la suivante :

$ grep chaîne fichier

chaîne désigne le mot ou l'expression à rechercher et fichier le fichier dans lequel la recherche doit être effectuée.


Remarque :

une chaîne est composée d'un caractère ou d'un ensemble de caractères ; il peut s'agir d'une lettre unique, d'un mot, ou d'une phrase. Les chaînes peuvent contenir des " blancs", des signes de ponctuation ou des caractères (de contrôle) invisibles.


Par exemple, pour connaître le poste téléphonique d'Edgar Allan Poe, tapez grep, tout ou partie de son nom, puis le fichier contenant l'information :

$ grep Poe extensions
Edgar Allan Poe     x72836
$

Le modèle entré peut correspondre à plusieurs lignes :

$ grep Allan extensions
David Allan         x76438
Edgar Allan Poe     x72836
$ grep Al extensions
Louisa May Alcott   x74236
David Allan         x76438
Edgar Allan Poe     x72836
$

Etant donné que la commande grep distingue les majuscules des minuscules, il est recommandé de respecter la combinaison du modèle :

$ grep allan extensions
$ grep Allan extensions
David Allan         x76438
Edgar Allan Poe     x72836
$

La commande grep n'a pas abouti dans le premier cas car aucune entrée commençant par un "a" minuscule n'a été trouvée".

Utilisation de la commande grep en tant que filtre

La commande grep est souvent utilisée en tant que "filtre" conjointement à d'autres commandes. Elle permet d'éliminer par filtrage les informations inutiles fournies par une commande. Utiliser la commande grep en tant que filtre consiste à limiter le résultat de la commande à l'aide de grep. Pipe est symbolisé par "|".

Dans l'exemple ci-dessous, seuls les fichiers dont l'extension est ".ps" et qui ont été créés au mois de mai, sont affichés :

$ ls -l *.ps | grep May

La première partie de la commande,

ls -l *.ps

permet d'obtenir la liste de fichiers suivante :

$ ls -l *.ps
-rw-r--r--  1 elvis       7228 Avr 22 15:07 change.ps
-rw-r--r--  1 elvis       2356 May 22 12:56 clock.ps
-rw-r--r--  1 elvis       1567 Jun 22 12:56 cmdtool.ps
-rw-r--r--  1 elvis      10198 Jun 22 15:07 command.ps
-rw-r--r--  1 elvis       5644 May 22 15:07 buttons.ps
$

La seconde partie

| grep May

limite la recherche à l'expression May, à l'aide de la commande grep :

$ ls -l *.ps | grep May
-rw-r--r--  1 elvis       2356 May 22 12:56 clock.ps
-rw-r--r--  1 elvis       5644 May 22 15:07 buttons.ps
$

Utilisation de la commande grep pour des chaînes de plusieurs mots

Pour rechercher un modèle comportant plusieurs mots, vous devez limiter la chaîne par des guillemets simples ou doubles :

$ grep "Louisa May" postes
Louisa May Alcott     x74236
$

La commande grep peut rechercher une chaîne dans un ensemble de fichiers. Lorsqu'elle trouve un modèle correspondant dans plusieurs fichiers, elle indique le nom du fichier suivi de deux points (:), puis de la ligne correspondant au modèle :

$ grep est *
auteurs:Ernest Hemmingway
alaska:L'Alaska est le plus vaste Etat des Etats-Unis.
wilde:livre. Un livre est plus ou moins bien écrit.
$

Recherche de lignes ne comportant pas de chaîne donnée

Il est possible de rechercher dans un fichier toutes les lignes ne comportant pas de chaîne donnée à l'aide de l'option -v de la commande grep. L'exemple ci-dessous décrit la recherche, dans le répertoire utilisateur medici, de toutes les lignes ne comportant pas la lettre e :

$ ls
auteurs    alaska    hinterland    tuteurs    wilde
$ grep -v e *
auteurs:Mon Mar 14 10:00 PST 1936
wilde:That is all.
$

Autres possibilités de la commande grep

La commande grep permet également de rechercher des cibles prédéfinies en tant que modèles à l'aide d'expressions régulières. Ces dernières se composent de chiffres, de lettres et de caractères ayant une signification particulière pour la commande grep. Ces caractères spéciaux, appelés métacaractères, ont également une signification particulière pour le système et doivent être mis entre guillemets ou despécialisés. Lorsque vous utilisez une expression régulière grep sur une ligne de commande, vous devez l'entourer de guillemets ou despécialiser les métacaractères (tels que & ! . * $ ? ou \) à l'aide d'une barre oblique inversée (\).

$ grep '^b' list

permet d'afficher toutes les lignes du fichier list commençant par la lettre "b."

$ grep 'b$' list

permet d'afficher les lignes se terminant par la lettre "b". Et la commande :

$ grep '^b$' list

permet d'afficher les lignes du fichier list dont le seul caractère est "b".

$ grep 'an.' list

permet de trouver tous les ensembles de trois caractères commençant par "an", y compris "rang", "année", "rangement" ou "plan" (car les espaces sont également pris en compte).

$ grep 'qu*' list

Mais, si vous recherchez tous les mots contenant la lettre "n," vous devez taper :

$ grep 'nn*' list

Alors que pour trouver les mots contenant le modèle "nn," il vous faudrait taper :

$ grep 'nnn*' list

Vous pouvez lancer ces commandes pour juger du résultat obtenu.

$ grep .* list

Recherche de métacaractères

Imaginons que vous recherchiez les lignes du texte contenant un symbole dollar ($). Si vous faites précéder le symbole dollar d'une barre oblique inversée (\) dans l'expression régulière, la commande grep ne tiendra pas compte de la signification particulière de (despécialisera) ce symbole. Cela est valable également pour les autres métacaractères (& ! . * ? et même \).

Par exemple, la commande

$ grep ^\.

permet de rechercher les lignes commençant par un point. Elle est particulièrement utile pour la recherche des demandes de formatage des fichiers nroff ou troff (qui commencent par un point).

Le Tableau 4-1 présente une liste des modèles de recherche les plus fréquemment utilisés avec la commande grep.

Tableau 4-1 Modèles de recherche de la commande grep

Caractère 

Recherche 

^

Début d'une ligne de texte 

$

Fin d'une ligne de texte 

.

Tout caractère unique 

[...] 

Tout caractère unique dans la liste ou l'intervalle entre crochets 

[^...] 

Tout caractère non compris dans la liste ou l'intervalle 

*

Zéro, une ou plusieurs occurrences du caractère ou de l'expression régulière précédent(e) 

.* 

Zéro, une ou plusieurs occurrences de tout caractère unique 

\

Supprime la signification particulière du caractère suivant 

Ces caractères de recherche peuvent également être utilisés pour les recherches dans l'éditeur de texte vi.

Guillemets simples ou doubles dans les lignes de commande

Comme indiqué précédemment, un texte doit être placé entre guillemets pour être interprété en tant que mot unique. Par exemple, pour rechercher la phrase "On s'en fiche, les gars" dans tous les fichiers à l'aide de la commande grep, tapez :

$ grep "On s'en fiche, les gars" *

Une phrase de plusieurs mots peut aussi être unifiée à l'aide de guillemets simples ou apostrophes ('). Les apostrophes permettent également d'indiquer que certains caractères, tels que $, doivent être interprétés littéralement. (Le métacaractère de la commande history ! est toujours interprété en tant que tel, même placé entre guillemets, sauf si vous le despécialisez à l'aide d'une barre oblique inversée.). Quoi qu'il en soit, il est préférable de despécialiser les caractères tels que & ! $ ? . ; et \ chaque fois que vous les utilisez en tant que caractères typographiques ordinaires.

Par exemple, si vous tapez :

$ grep $ list

vous verrez apparaître toutes les lignes du fichier list, alors que si vous tapez :

$ grep '\$' list

seules les lignes contenant le caractère "$" seront affichées.

Pour plus d'informations sur la commande grep(1), consultez les man Pages(1): User Commands.