Comment utiliser la commande grep sous Linux

Photo of author

By pierre



L’utilitaire de ligne de commande `grep` sous Linux est un outil puissant pour la recherche de correspondances de chaînes et de motifs. Il permet de localiser des lignes spécifiques dans plusieurs fichiers, et fonctionne également avec les résultats produits par d’autres commandes. Voici comment l’utiliser efficacement.

L’origine de la commande grep

La commande `grep` est bien connue dans l’univers Linux et Unix pour trois raisons principales. Premièrement, elle est extrêmement pratique. Deuxièmement, l’étendue de ses options peut sembler déroutante. Troisièmement, elle a été créée rapidement pour répondre à un besoin spécifique. Les deux premières raisons sont excellentes, la troisième est juste un peu particulière.

Ken Thompson avait extrait les fonctionnalités de recherche d’expressions régulières de l’éditeur `ed` (prononcé ee-dee) et a développé un petit programme, pour son propre usage, pour faire des recherches dans des fichiers texte. Son supérieur chez Bell Labs, Doug Mcilroy, a approché Thompson pour lui décrire le problème rencontré par un de ses collègues, Lee McMahon.

McMahon cherchait à identifier les auteurs des Papiers fédéralistes grâce à l’analyse textuelle. Il avait besoin d’un outil capable de retrouver des phrases et des chaînes dans des documents texte. Thompson a passé environ une heure ce soir-là à transformer son outil en un utilitaire utilisable par d’autres, et l’a renommé `grep`. Le nom provient de la chaîne de commande `ed` `g/re/p`, qui signifie « recherche d’expression régulière globale ».

Vous pouvez écouter Thompson en parler avec Brian Kernighan à propos de l’origine de `grep`.

Recherches basiques avec grep

Pour trouver une chaîne de caractères dans un fichier, entrez le terme recherché et le nom du fichier dans la ligne de commande :


Les lignes contenant la chaîne recherchée sont affichées. Dans cet exemple, il s’agit d’une seule ligne. Le texte correspondant est mis en évidence. C’est parce que, sur la plupart des distributions, `grep` possède un alias :

alias grep='grep --color=auto'

Examinons les résultats lorsque plusieurs lignes correspondent. Nous allons rechercher le mot « Moyenne » dans un fichier journal d’application. Comme nous ne sommes pas sûrs de la casse du mot dans le fichier journal, nous utiliserons l’option `-i` (ignorer la casse) :

grep -i Average geek-1.log

Chaque ligne trouvée est affichée, avec le texte correspondant mis en évidence.

Nous pouvons afficher les lignes qui ne correspondent pas en utilisant l’option `-v` (inverser la correspondance).

grep -v Mem geek-1.log

Il n’y a pas de mise en évidence car ce sont les lignes qui ne contiennent pas le terme recherché.

Nous pouvons rendre `grep` complètement silencieux. Le résultat est transmis au shell sous forme de valeur de retour. Un résultat de zéro signifie que la chaîne a été trouvée, et un résultat de un signifie qu’elle n’a pas été trouvée. Nous pouvons vérifier le code de retour en utilisant le paramètre spécial `$?` :

grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

Recherches récursives avec grep

Pour effectuer une recherche dans des dossiers et sous-dossiers, utilisez l’option `-r` (récursif). Veuillez noter que vous ne devez pas indiquer de nom de fichier directement, mais un chemin. Ici, nous recherchons dans le répertoire actuel `.` et dans tous ses sous-répertoires :

grep -r -i memfree .

La sortie comprend le chemin du répertoire et le nom du fichier pour chaque ligne trouvée.

Nous pouvons demander à `grep` de suivre les liens symboliques en utilisant l’option `-R` (déréférencer récursivement). Dans ce répertoire, nous avons un lien symbolique appelé `logs-folder`. Il pointe vers `/home/dave/logs`.

ls -l logs-folder

Répétons notre dernière recherche avec l’option `-R` (déréférencer récursivement) :

grep -R -i memfree .

Le lien symbolique est suivi, et le répertoire vers lequel il pointe est également parcouru par `grep`.

Recherche de mots entiers

Par défaut, `grep` détectera une ligne si la chaîne recherchée est présente, même si elle fait partie d’une autre chaîne. Regardons cet exemple. Nous recherchons le mot « free ».

grep -i free geek-1.log

Les résultats sont des lignes contenant la chaîne « free », mais ce ne sont pas des mots séparés. Ils font partie de la chaîne « MemFree ».

Pour forcer `grep` à ne rechercher que des « mots » isolés, utilisez l’option `-w` (expression rationnelle de mot).

grep -w -i free geek-1.log
echo $?

Cette fois, il n’y a pas de résultats car le terme « free » n’apparaît pas dans le fichier en tant que mot distinct.

Utilisation de plusieurs termes de recherche

L’option `-E` (expression régulière étendue) permet de rechercher plusieurs mots. (L’option `-E` remplace la version obsolète `egrep` de `grep`.)

Cette commande recherche les deux termes « moyenne » et « memfree ».

grep -E -w -i "average|memfree" geek-1.log

Toutes les lignes correspondantes sont affichées pour chaque terme recherché.

Vous pouvez également chercher plusieurs termes qui ne sont pas nécessairement des mots entiers, mais qui peuvent aussi l’être.

L’option `-e` (modèles) permet d’utiliser plusieurs termes de recherche dans la ligne de commande. Ici, nous utilisons les crochets d’expression régulière pour créer un modèle de recherche. Cela indique à `grep` de rechercher l’un des caractères entre crochets `[]`. Cela signifie que `grep` cherchera « Ko » ou « ko ».

Les deux chaînes sont détectées, et certaines lignes contiennent même les deux chaînes.

Correspondance exacte des lignes

L’option `-x` (expression régulière de ligne) ne détectera que les lignes dont l’intégralité correspond au terme recherché. Cherchons une date et une heure dont nous savons qu’elles n’apparaissent qu’une seule fois dans le fichier journal :

grep -x "20-Jan--06 15:24:35" geek-1.log

La seule ligne qui correspond est trouvée et affichée.

À l’inverse, il est possible d’afficher les lignes qui ne correspondent pas. Cela peut s’avérer utile lorsque vous consultez des fichiers de configuration. Les commentaires sont intéressants, mais il est parfois difficile de distinguer les paramètres réels parmi tous ces commentaires. Voici le contenu du fichier `/etc/sudoers`:

Nous pouvons filtrer efficacement les lignes de commentaires comme ceci:

sudo grep -v "https://www.howtogeek.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

Il est ainsi beaucoup plus facile d’analyser ce fichier.

Afficher uniquement le texte correspondant

Parfois, vous ne voulez pas voir toute la ligne correspondante, mais seulement le texte qui correspond à votre recherche. L’option `-o` (seulement la correspondance) fait exactement cela.

grep -o MemFree geek-1.log

L’affichage se limite au texte correspondant au terme recherché, au lieu de toute la ligne.

Compter avec grep

`grep` ne sert pas uniquement à manipuler du texte, il peut également fournir des informations numériques. Nous pouvons faire compter `grep` de différentes manières. Si vous souhaitez savoir combien de fois un terme apparaît dans un fichier, vous pouvez utiliser l’option `-c` (compter) :

grep -c average geek-1.log

`grep` indique que le terme recherché apparaît 240 fois dans ce fichier.

Vous pouvez demander à `grep` d’afficher le numéro de ligne de chaque ligne trouvée avec l’option `-n` (numéro de ligne).

grep -n Jan geek-1.log

Le numéro de ligne de chaque ligne correspondante est affiché au début de la ligne.

Pour réduire le nombre de résultats affichés, utilisez l’option `-m` (nombre maximum). Nous allons limiter l’affichage à cinq lignes correspondantes :

grep -m5 -n Jan geek-1.log

Ajouter du contexte

Il est souvent utile de pouvoir voir des lignes supplémentaires – éventuellement non correspondantes – pour chaque ligne correspondante. Cela peut aider à distinguer les lignes qui vous intéressent.

Pour afficher quelques lignes après la ligne correspondante, utilisez l’option `-A` (après le contexte). Nous demandons trois lignes dans cet exemple :

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

Pour voir quelques lignes avant la ligne correspondante, utilisez l’option `-B` (contexte avant).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

Et pour inclure les lignes avant et après la ligne correspondante, utilisez l’option `-C` (contexte).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

Affichage des fichiers correspondants

Pour voir les noms des fichiers qui contiennent le terme recherché, utilisez l’option `-l` (fichiers avec correspondance). Pour savoir quels fichiers de code source C contiennent des références au fichier d’en-tête `sl.h`, utilisez cette commande :

grep -l "sl.h" *.c

Les noms de fichiers sont listés, mais pas les lignes correspondantes.

Et bien sûr, nous pouvons rechercher les fichiers qui ne contiennent pas le terme recherché. L’option `-L` (fichiers sans correspondance) fait exactement cela.

grep -L "sl.h" *.c

<img decoding= »async » loading= »lazy » class= »alignnone size-full wp-image-497999″ src= »https://toptips.fr/wp-content/uploads/2021/01/1610319024_559_Comment-utiliser-la-commande-grep-sous-Linux.png » alt= »grep -L  » sl.h= » » in= » » a= » » terminal= » » window= » » width= »646″ height= »97″ onload= »pagespeed.lazyLoadImages.