Aller au contenu

Maitriser la commande grep et ses variantes

Mise à jour :

Mais où se trouve ce fichier qui contient cette ligne précise ou ce message d’erreur que je dois corriger ? Quand on manipule des logs, des scripts ou de grandes bases de fichiers texte, retrouver rapidement une information enfouie devient essentiel. C’est là que la commande grep entre en jeu : elle permet de rechercher des motifs textuels avec précision, qu’ils soient simples ou complexes, dans un ou plusieurs fichiers à la fois. Grâce à ses nombreuses options, grep est l’outil idéal pour trouver une occurrence précise, filtrer des résultats ou diagnostiquer un problème, sans perdre de temps.

Introduction à grep

La commande grep (pour Global Regular Expression Print) est un outil de recherche textuelle incontournable en ligne de commande. Elle permet de parcourir rapidement des fichiers ou des flux de texte pour y extraire les lignes contenant un motif précis, qu’il s’agisse d’un mot, d’une phrase, d’un code ou d’un message d’erreur.

Elle est particulièrement utilisée pour :

  • trouver une information précise dans un fichier de log,
  • rechercher un mot-clé ou une fonction dans du code source,
  • filtrer les lignes d’un fichier CSV ou d’un export brut,
  • tracer une erreur dans un répertoire contenant des milliers de fichiers.

Par exemple, pour rechercher les lignes contenant le mot “ERREUR” dans un fichier :

Terminal window
grep "ERREUR" journal.log

Pour chercher ce mot dans tous les fichiers d’un dossier :

Terminal window
grep "ERREUR" /var/log/*.log

Et pour ignorer la casse :

Terminal window
grep -i "erreur" journal.log

grep est rapide, léger, et s’utilise facilement enchaîné avec d’autres commandes dans un pipeline. C’est un outil de diagnostic et d’extraction de données textuelles indispensable pour tout administrateur système, développeur ou analyste.

Syntaxe de base

La commande grep suit une structure simple mais puissante, adaptée à des recherches rapides ou complexes dans un ou plusieurs fichiers.

Structure générale

Terminal window
grep [options] motif fichier
  • motif : le texte ou l’expression régulière à rechercher
  • fichier : un ou plusieurs fichiers dans lesquels effectuer la recherche
  • options : modifient le comportement de grep (casse, contexte, récursivité…)

Exemple de base

Rechercher toutes les lignes contenant “Erreur” dans un fichier :

Terminal window
grep "Erreur" journal.log

Rechercher dans plusieurs fichiers

Terminal window
grep "root" /etc/passwd /etc/group

Affiche les lignes correspondantes avec le nom du fichier source.

Utiliser grep avec un pipe

On peut filtrer les résultats d’une autre commande :

Terminal window
dmesg | grep "usb"

Utiliser des jokers avec le shell

Pour chercher dans tous les fichiers .log :

Terminal window
grep "timeout" *.log

Attention : les jokers sont gérés par le shell, pas par grep lui-même.

Avec cette syntaxe de base, grep devient un outil ultra-réactif pour isoler des lignes précises dans de grands volumes de texte. Les options abordées dans les chapitres suivants permettent de personnaliser et d’affiner encore plus vos recherches.

Recherche simple de motifs

Dans sa forme la plus directe, grep permet de rechercher un mot ou une expression littérale dans un ou plusieurs fichiers. C’est la base de tout usage de grep.

Rechercher un mot exact

Terminal window
grep "Erreur" fichier.log

Cela affiche toutes les lignes contenant le mot ou une partie de mot “Erreur”.

Rechercher un mot dans plusieurs fichiers

Terminal window
grep "backup" *.conf

Affiche les lignes correspondantes avec le nom du fichier.

Ignorer la casse avec -i

Terminal window
grep -i "apache" /etc/*conf

Cette option permet de trouver “Apache”, “apache”, ou “APACHE” sans distinction.

Afficher les lignes correspondantes avec leur numéro (-n)

Terminal window
grep -n "Listen" /etc/apache2/ports.conf

Affiche chaque ligne avec son numéro dans le fichier.

Rechercher des lignes vides

Terminal window
grep "^$" fichier.txt
  • ^ : début de ligne
  • $ : fin de ligne
  • ^$ : ligne vide

Rechercher un mot entier (-w)

Pour éviter de capturer les mots partiels :

Terminal window
grep -w "user" fichier.txt

Cette commande ne trouve que les lignes contenant user, pas username.

Ces recherches simples couvrent la majorité des usages quotidiens de grep, et suffisent souvent pour isoler rapidement un bloc de texte ou vérifier une configuration sans ouvrir tout le fichier.

Recherche avancée avec options

Pour affiner vos recherches, grep propose de nombreuses options avancées permettant de contrôler le comportement de l’affichage, de filtrer plus précisément les résultats, ou de travailler avec des fichiers plus complexes.

Ignorer la casse : -i

Terminal window
grep -i "server" config.txt

Trouve “server”, “Server”, “SERVER”, etc.

Rechercher un mot entier : -w

Terminal window
grep -w "port" fichier.conf

Évite de capturer des mots partiels comme “airport” ou “import”.

Afficher le numéro de ligne : -n

Terminal window
grep -n "Listen" ports.conf

Affiche les lignes trouvées avec leur numéro dans le fichier.

Afficher uniquement la correspondance : -o

Terminal window
grep -o "ERROR [0-9]*" log.txt

Affiche seulement le texte correspondant au motif, et non toute la ligne.

Compter le nombre de correspondances : -c

Terminal window
grep -c "ERROR" log.txt

Renvoie le nombre de lignes contenant le motif, utile pour des statistiques simples.

Afficher le nom des fichiers contenant le motif : -l

Terminal window
grep -l "root" /etc/*

Affiche uniquement le nom des fichiers contenant au moins une occurrence.

Afficher les fichiers ne contenant pas le motif : -L

Terminal window
grep -L "enabled" *.conf

Montre les fichiers ne contenant aucune occurrence du motif.

Ces options permettent d’adapter grep à des recherches ciblées, des vérifications automatisées, ou des extractions précises, notamment dans des fichiers volumineux ou multiples.

Recherche inversée et contextuelle

grep ne se limite pas à afficher les lignes contenant un motif : il peut aussi exclure des lignes ou montrer le contexte autour des correspondances, ce qui est très utile pour le débogage ou la compréhension d’un fichier.

Exclure un motif avec -v

Pour afficher toutes les lignes ne contenant pas un mot :

Terminal window
grep -v "DEBUG" application.log

Cette commande est parfaite pour filtrer les lignes inutiles ou parasites dans un log.

Afficher le contexte avec -A, -B et -C

-A [n] : lignes après le motif

Terminal window
grep -A 2 "ERROR" journal.log

Affiche 2 lignes après chaque ligne contenant “ERROR”.

-B [n] : lignes avant le motif

Terminal window
grep -B 3 "FAILURE" output.txt

Affiche les 3 lignes précédant chaque occurrence.

-C [n] : lignes avant et après (contexte complet)

Terminal window
grep -C 1 "timeout" log.txt

Affiche la ligne contenant le mot et une ligne de contexte avant et après.

Exemple combiné

Afficher toutes les erreurs mais ignorer les lignes “benignes”, avec contexte :

Terminal window
grep -i "error" log.txt | grep -v "non critique"

Ces options contextuelles rendent grep très utile pour les diagnostics, car elles permettent de voir ce qui entoure un message d’erreur, une alerte ou un comportement suspect, sans ouvrir tout le fichier.

Recherche récursive et dans plusieurs fichiers

Quand on travaille dans une arborescence complexe ou sur un projet contenant de nombreux fichiers, grep permet d’effectuer des recherches récursives et de cibler précisément les fichiers concernés.

Recherche récursive avec -r ou -R

Rechercher le mot “TODO” dans tous les fichiers d’un projet :

Terminal window
grep -r "TODO" .
  • -r ou -R : descente récursive dans les sous-dossiers.

Rechercher avec filtre sur l’extension

Pour ne rechercher que dans les fichiers .py :

Terminal window
grep "import" $(find . -name "*.py")

Ou en combinant find et xargs :

Terminal window
find . -name "*.sh" | xargs grep "echo"

Afficher uniquement le nom des fichiers contenant une correspondance : -l

Terminal window
grep -rl "mot_de_passe" /etc/

Affiche la liste des fichiers contenant au moins une occurrence, sans contenu.

Rechercher dans tous les fichiers, même binaires : --binary-files=text

Par défaut, grep ignore les fichiers binaires. Pour forcer la recherche :

Terminal window
grep --binary-files=text "clé" fichier.dump

Avec ces options, grep devient un outil d’audit et d’analyse massif, capable de balayer efficacement un projet ou un serveur à la recherche d’une expression, d’un code d’erreur, ou d’une trace laissée dans les fichiers.

Utilisation des expressions régulières

L’un des plus grands atouts de grep est sa compatibilité avec les expressions régulières, qui permettent de faire des recherches avancées, souples et précises, au-delà du simple texte littéral.

Expressions régulières de base avec grep

ExpressionSignification
.Un seul caractère quelconque
*Zéro ou plusieurs occurrences
^Début de ligne
$Fin de ligne
[...]Un seul caractère parmi ceux listés
[^...]Un seul caractère non listé
\Échappe un caractère spécial (\. pour un point)

Exemples :

  • Lignes commençant par Erreur :

    Terminal window
    grep "^Erreur" fichier.log
  • Lignes se terminant par .conf :

    Terminal window
    grep "\.conf$" fichiers.txt
  • Lignes contenant un chiffre :

    Terminal window
    grep "[0-9]" fichier.txt

Expressions régulières étendues avec grep -E ou egrep

Pour aller plus loin (groupes, alternances, etc.) :

Terminal window
grep -E "(erreur|warning)" fichier.log

Ou avec egrep, équivalent de grep -E :

Terminal window
egrep "(erreur|warning)" fichier.log

Utiliser des quantificateurs avancés

  • Mot contenant au moins trois chiffres :

    Terminal window
    grep -E "[0-9]{3,}" fichier.txt
  • Lignes contenant “Nom: [texte]” :

    Terminal window
    grep -E "Nom: .+" fichier.txt

Expressions régulières Perl avec grep -P (si supporté)

Pour des motifs plus complexes :

Terminal window
grep -P "\buser\d{2}\b" fichier.txt

Attention : -P (mode Perl) n’est pas disponible sur toutes les distributions.

Avec les expressions régulières, grep devient un analyseur de texte très précis, capable de traiter des fichiers structurés, semi-structurés ou non structurés avec une efficacité redoutable.

Variantes de grep

La commande grep possède plusieurs variantes utiles selon le type de données, le niveau de complexité ou le contexte d’utilisation. Voici les principales :

egrep – Grep avec expressions régulières étendues

Équivalent à grep -E, il permet d’utiliser des expressions plus puissantes :

Terminal window
egrep "Erreur|Alerte" fichier.log

Permet l’utilisation directe des opérateurs comme |, +, ?, {} sans les échapper.

Remarque : egrep est considéré comme obsolète, on recommande grep -E à la place.

fgrep – Grep sans expressions régulières

Équivalent à grep -F, il recherche des chaînes exactes sans interpréter les métacaractères :

Terminal window
fgrep "1.2.3.4" journal.log
  • Plus rapide que grep classique pour des recherches très simples
  • Ne supporte aucune expression régulière

zgrep – Grep dans les fichiers compressés .gz

Permet de rechercher dans les fichiers gzip sans décompression manuelle :

Terminal window
zgrep "ERREUR" archive.log.gz
  • Compatible avec les mêmes options que grep
  • Très utile pour les logs archivés

pgrep – Recherche dans les processus

Contrairement aux autres, pgrep n’analyse pas les fichiers mais les processus en cours :

Terminal window
pgrep ssh

Affiche les PID des processus contenant “ssh” dans leur nom.

Pour afficher les noms des processus :

Terminal window
pgrep -a nginx

Chaque variante de grep est optimisée pour un cas d’usage spécifique. Les connaître permet de choisir l’outil le plus efficace selon le contexte : traitement de logs, audit de processus, ou filtrage massif.

Cas d’utilisation pratiques

Voici plusieurs exemples concrets montrant comment grep et ses variantes peuvent être utilisés pour résoudre des problèmes réels, analyser des fichiers, ou automatiser des recherches dans un environnement système ou de développement.

1. Rechercher des erreurs dans les journaux système

Terminal window
grep -i "error" /var/log/syslog

Affiche toutes les erreurs, quelle que soit la casse.

Pour voir les erreurs avec 3 lignes de contexte avant et après :

Terminal window
grep -C 3 "error" /var/log/syslog

2. Rechercher des directives dans un fichier de configuration

Terminal window
grep "^Listen" /etc/apache2/ports.conf

Permet de savoir sur quel port Apache écoute.

3. Vérifier l’absence d’un mot de passe en clair dans des scripts

Terminal window
grep -r "password=" ~/scripts/

Recherche récursive dans tous les scripts du dossier personnel.

4. Compter le nombre d’occurrences d’un événement

Terminal window
grep -c "connection lost" application.log

Affiche combien de fois un événement s’est produit.

5. Extraire toutes les adresses IP d’un log

Terminal window
grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' serveur.log

Avec -o pour afficher uniquement les correspondances.

6. Rechercher dans des fichiers compressés

Terminal window
zgrep "backup failed" archive.log.gz

Sans devoir décompresser le fichier.

7. Identifier les fichiers contenant un mot spécifique

Terminal window
grep -rl "admin" /etc/

Affiche la liste des fichiers contenant le mot admin.

Ces cas d’usage montrent que grep est bien plus qu’une simple commande de recherche : il devient un véritable outil d’inspection, d’audit, et de contrôle du système et des fichiers. Indispensable dans les tâches de maintenance et de surveillance.

Bonnes pratiques

Pour utiliser grep de manière efficace, fiable et lisible, voici quelques bonnes pratiques que j’applique dans mes propres scripts et recherches en ligne de commande.

1. Toujours tester avec un fichier simple avant de lancer une recherche large

Avant de lancer une commande sur tout /var/log ou un projet entier :

Terminal window
grep "motif" fichier_test.txt

Cela permet d’éviter des surprises liées à des correspondances inattendues ou des motifs mal formulés.

2. Utiliser des guillemets autour des motifs

Surtout quand le motif contient des espaces, des caractères spéciaux, ou des jokers :

Terminal window
grep "adresse IP" fichier.log

3. Privilégier grep -E pour les expressions complexes

Plutôt que d’échapper tous les caractères spéciaux, utilisez :

Terminal window
grep -E "erreur|fail|critique" journal.log

Plus lisible et plus propre que plusieurs grep enchaînés.

4. Combiner intelligemment avec find, xargs, ou sed

Rechercher dans certains types de fichiers :

Terminal window
find . -name "*.log" | xargs grep "ERREUR"

5. Filtrer les résultats avec -v ou -w

  • -v pour exclure des lignes :

    Terminal window
    grep -v "DEBUG" fichier.log
  • -w pour éviter les faux positifs sur des sous-mots :

    Terminal window
    grep -w "root" /etc/passwd

6. Utiliser des fichiers de motifs avec -f

Pour des recherches complexes ou multiples :

Terminal window
grep -f motifs.txt fichiers.txt

Le fichier motifs.txt contient un motif par ligne.

7. Coloriser les résultats pour les rendre plus lisibles

La plupart des systèmes activent cette option par défaut, sinon :

Terminal window
grep --color=always "motif" fichier

En appliquant ces bonnes pratiques, vous rendrez vos commandes grep plus sûres, plus lisibles et plus puissantes, que ce soit pour une recherche rapide ou intégrée dans un processus automatisé.

conclusion

La commande grep est bien plus qu’un simple outil de recherche textuelle : c’est un véritable allié pour explorer, analyser et diagnostiquer le contenu de vos fichiers en ligne de commande. Grâce à sa vitesse, sa simplicité d’usage et sa richesse fonctionnelle, grep s’adapte aussi bien aux besoins ponctuels qu’aux scripts les plus complexes. En la combinant avec d’autres outils Unix, elle devient une composante essentielle du quotidien de tout administrateur système, développeur ou analyste.