Ce chapitre explique comment rechercher un mot clé ou une chaîne de caractères dans des répertoires ou des fichiers à l'aide de la commande grep sous SunOS.
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 |
où chaîne désigne le mot ou l'expression à rechercher et fichier le fichier dans lequel la recherche doit être effectuée.
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".
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 :
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 $ |
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. $ |
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. $ |
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".
Un point (.) situé à l'intérieur d'une expression régulière permet de rechercher tout caractère unique. Ainsi, la commande :
$ 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).
Lorsqu'un astérisque (*) est placé à la suite d'un caractère, il est interprété par la commande grep comme "zéro, une ou plusieurs occurrences de ce caractère." Lorsque l'astérisque est placé à la suite d'une expression régulière, il est interprété comme "zéro, une ou plusieurs occurrences des caractères correspondant au modèle."
Etant donné que l'astérisque comprend zéro occurrence, son utilisation n'est pas très intuitive. En effet, pour obtenir la liste des mots contenant les lettres "qu", vous pouvez utiliser la commande :
$ 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.
Pour trouver zéro, une, ou plusieurs occurrences correspondant à n'importe quel caractère du fichier list, tapez :
$ grep .* list |
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.
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.