12 exemples de commande grep sous Linux

Grep est un acronyme qui signifie Global Regular Expression Print.
C'est un outil en ligne de commande Linux / Unix utilisé pour rechercher une chaîne de caractères dans un fichier spécifié. Le modèle de recherche de texte est appelé une expression régulière (regex). Lorsqu'il trouve une correspondance, il imprime la ligne avec le résultat. La commande grep est pratique lors de la recherche dans de gros fichiers journaux.

Ce guide et tutoriel détaille les commandes grep les plus utiles pour les systèmes Linux/Unix à travers des exemples.

12 exemples de commande grep sous Linux

Commande grep sous linux : exemples d'utilisation

La commande grep permet de capturer un motif dans un texte.
Elle en permet pas d'effectuer de rechercher/remplacer, pour cela, il faut utiliser la commande sed :

Utilisation basique

grep peut s'utiliser directement pour rechercher un motif dans un fichier.
Mais on peut aussi l'utiliser comme toute commande Linux via un pipe.

Ainsi, ces deux utilisations sont équivalentes :

grep motif nomfichier

ou

cat nomfichier|grep motif

Pour le rendre insensible à la casse, il faut utiliser l'option -i :

grep -i vache *

Chercher un mot complet avec grep linux

Grep vous permet de rechercher et d'imprimer les résultats pour des mots entiers uniquement.
Pour rechercher le mot vache dans tous les fichiers du répertoire courant, ajoutez -w à la commande grep.
Cette option n'imprime que les lignes avec des correspondances de mots entiers et les noms des fichiers dans lesquels elle les a trouvées.

Par exemple pour rechercher le mot de vache en entier :

cat /tmp/test |grep -w vache

vacheTest ou vache. en fin de phrase ne sera pas renvoyer par la commande grep.

Chercher un mot complet avec grep linux

Chercher dans un ou plusieurs fichiers ou dossiers en récursif

grep peut recherche dans un ou plusieurs fichiers.
Si vous ne spécifiez aucune option, il va chercher dans le répertoire indiqué mais PAS dans les sous-répertoire :

Rechercher un motif dans un fichier spécifique :

grep err /var/log/messages.1

Rechercher un motif dans tout le répertoire :

grep err /var/log/*

A partir de là, il est possible de jouer sur les caractères joker des noms de fichier.
Par exemple pour rechercher toutes les erreurs dans les journaux /var/log/messages, /var/log/messages.1, ....

grep -i err /var/log/messages*

Pour inclure tous les sous-répertoires dans une recherche récursive, ajoutez l'opérateur -r à la commande grep.

grep -r vache *

Par exemple pour rechercher dans /tmp en entier incluant les sous-répertoires :

grep -r vache /tmp/*
test:vache
test:vacheTEST

Afficher les numéros de ligne

grep peut aussi afficher la ligne d'un fichier où se trouve l'occurence.
Pour cela, ajoutez l'option -n :

grep -n -r vache /tmp/*
test:1:vache
test:4:vacheTEST

Inverser la recherche pour exclure

Vous pouvez utiliser grep pour imprimer toutes les lignes qui ne correspondent pas à un modèle de caractères spécifique.
Pour inverser la recherche, ajoutez -v à une commande grep.

Pour exclure toutes les lignes contenant vache, saisissez :

grep -v vache /tmp/test

Le terminal imprime toutes les lignes qui ne contiennent pas le mot utilisé comme critère de recherche. Utilisez -i pour ignorer la casse afin d'exclure complètement le mot utilisé pour cette recherche :

grep -i -v vache /tmp/test

Limiter le nombre de sortie

Les fichiers individuels, tels que les fichiers journaux, peuvent contenir de nombreuses correspondances pour les modèles de recherche grep. Limitez le nombre de lignes dans la sortie grep en ajoutant l'option -m et un nombre à la commande.

grep -m2 vache /tmp/test

Afficher le nombre de lignes avant ou après une chaîne de recherche

Pour afficher le nombre de lignes avant ou après une chaîne de recherche, on utilise les option -A, -B et -C.

Utilisez -A et un certain nombre de lignes à afficher après un motif.
Par exemple pour afficher 3 lignes après le mot vache :

grep -A3 vache /tmp/test

Utilisez -B et un certain nombre de lignes à afficher avant un motif.
Pour afficher 3 lignes avant le mot vache :

grep -B3 vache /tmp/test

Utilisez -C et un certain nombre de lignes pour afficher avant et après le motif.
Pour afficher 3 lignes avants et après le mot vache :

grep -C3 vache /tmp/test

Rechercher plusieurs chaînes

Vous pouvez rechercher plusieurs mots à la fois.
La première méthode consiste à séparer les motifs avec l'option -e :

grep -e pattern1 -e pattern2 -e pattern3 [fichier]

Par exemple pour recherche le mot vache ou chien dans tous les fichiers de /tmp :

grep -e vache -e chien -r /tmp/*

La seconde méthode consiste à utiliser les regex étendues avec l'option -E.
Voici donc un équivalent :

grep -r -E "vache|chien" /tmp/*

Recherche sur le nom de fichier

Pour voir les noms des fichiers qui contiennent le terme de recherche, 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

Compter le nombre d'occurence

Il est possible de compter le nombre d'occurrence grâce à l'option -c.
Par exemple pour compter le nombre d'erreur dans les journaux messages :

grep -c err /var/log/messages*

Appliquer commande après grep

Comme toute commande Linux, on peut appliquer la sortie à une autre commande notamment grâce au caractère pipe.
La syntaxe générale :

find . -name '[motif]' | xargs grep '[motif]'

Dans cet exemple, on dirige la sortie (stdout)* de find vers (stdin of)* grep 'stdlib.h' sous forme de texte.
C'est-à-dire que les noms de fichiers sont traités comme du texte). grep fait son travail habituel et trouve les lignes correspondantes dans ce texte (tous les noms de fichiers qui contiennent eux-mêmes le motif).
Le contenu des fichiers n'est jamais lu.

 find . -name '*.c' | xargs grep 'stdlib.h'

On peut aussi utiliser une boucle for (ou while) pour traiter le résultat d'une commande avec grep.
Cela est pratique pour stocker une variable et passer plusieurs commandes avec.
Par exemple ici, on créer une variable mavariable pour chaque ligne du résultat de recherche grep que l'on intégère dans la boucle for.

for mavariable in `grep -r motif /tmp/*`
do
    echo $mavariable
done

Rechercher en début ou fin de ligne

Pour récupérer que les lignes avec un commentaire, soit dont la ligne débute par # :

grep "^#" /etc/fichier.conf

Par exemple pour rechercher les lignes qui se terminent par un . dans fichier.txt

grep "\.$" fichier.txt

Coloriser le motif

L'option --color permet de coloriser le résultat de la sortie grep afin d'augmenter la lisibilité.

grep --color=always -i vache -r /tmp/
Coloriser le résultat de recherche de la commande grep

Utiliser des expressions régulières

grep est compatible avec trois types d'expressions régulières.
Pour passer d'une norme à l'autre :

  • -G pour les expressions régulières basiques (BRE)
  • -E pour les expressions régulières étendues (ERE)
  • -P pour les expressions régulières PERL (PCRE)

Par exemple pour rechercher une adresse IP avec grep :

tail -20 /var/log/nginx/access.log|egrep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"

Liste des options de la commande grep

OptionsDescription
-A <NUM>Imprimer NUM lignes de contexte de fin après les lignes correspondantes. Place une ligne contenant -- entre des groupes contigus de correspondances.
-B <NUM>Imprimer NUM lignes de contexte principal avant de faire correspondre les lignes. Place une ligne contenant -- entre des groupes contigus de correspondances.
-C <NUM>Imprimer NUM lignes de contexte de sortie. Place une ligne contenant --entre des groupes contigus de correspondances.
-cCompter le nombre d'occurences
-eUtilisez des MOTIFS comme motifs. Si cette option est utilisée plusieurs fois ou est combinée avec l'option -f (--file), recherchez tous les modèles donnés. Cette option peut être utilisée pour protéger un motif commençant par « - ».
-iNe pas prendre en compte la case
-EInterprétez le motif comme une expression régulière étendue.
-m <NUM>Limiter le nombre d'occurrence à NUM
-nAfficher le numéro de la ligne dans le fichier
-rRechercher en récursif
-PInterprétez le motif comme une expression régulière Perl.
-vInversez le sens de la correspondance pour sélectionner des lignes non correspondantes.
-wChercher un mot entier
Liste des options de la commande grep

Tags: