Aller au contenu
Administration Linux medium

grep : rechercher dans du texte

30 min de lecture

Quand on doit trouver une ligne d'erreur dans un log de plusieurs milliers de lignes, rechercher un mot-clé dans du code source ou filtrer la sortie d'une commande, grep est l'outil incontournable. Simple et puissant, grep permet de rechercher des motifs textuels (simples ou regex) et d'afficher les lignes correspondantes, directement en ligne de commande.

  • Rechercher un motif simple dans un fichier
  • Utiliser les options essentielles -i, -v, -n, -c
  • Afficher le contexte avec -A, -B, -C
  • Utiliser des expressions régulières basiques et étendues (-E)
  • Faire des recherches récursives avec -r

grep fait partie des commandes de traitement de texte sous Linux. Chaque outil a sa spécialité :

CommandeSpécialitéQuand l'utiliser
grepFiltrer des lignes par motifRechercher, filtrer, diagnostiquer
awkTraitement avancé de colonnesCalculs, conditions, formats complexes
sedÉditer du texte en fluxRemplacer, supprimer, insérer
cutExtraire des colonnesFichiers délimités (CSV, TSV)
findRechercher des fichiersTrouver par nom, taille, date
xargsTransformer stdin en argumentsChaîner commandes sur listes

Quand utiliser grep vs awk ?

Situationgrepawk
Rechercher un mot dans un fichierOui, grep "mot" fichierOui, mais overkill
Ignorer la casseOui, grep -i "mot"Oui, tolower()
Afficher les lignes contenant un patternOui, ParfaitOui
Extraire une colonne spécifiqueNonOui, awk '{print $2}'
Compter les occurrences exactesNon, -c compte les lignesOui
Calculs sur les lignes trouvéesNonOui
Conditions complexes (ET, OU, IF)Attention : LimitéOui

Combinaisons fréquentes :

Fenêtre de terminal
# grep + cut : filtrer puis extraire une colonne
grep 'ERROR' app.log | cut -d' ' -f4
# grep + sort + uniq : compter les types d'erreurs
grep 'ERROR' app.log | cut -d':' -f2 | sort | uniq -c
# grep + xargs : agir sur les fichiers contenant un motif
grep -rl 'TODO' src/ | xargs -I{} echo "Fichier à traiter: {}"
# grep + wc : compter les lignes correspondantes
grep -c 'ERROR' *.log | grep -v ':0$'

🧠 Modèle mental — Comment fonctionne grep

grep = Définir l'entrée → Spécifier le motif → Obtenir les lignes correspondantes

Modèle mental grep : Entrée (fichier/stdin) → Motif (texte/regex) → Sortie (lignes filtrées)

Points clés

  • grep filtre les lignes contenant un motif (texte ou regex)
  • Sans fichier, grep lit depuis stdin (pipe)
  • Par défaut, la recherche est sensible à la casse
  • -i pour ignorer la casse, -v pour inverser (lignes sans le motif)
  • -n affiche les numéros de lignes, -c compte les occurrences
  • grep -E (ou egrep) active les regex étendues (|, +, ?, etc.)

Règles d'or

1
Toujours protéger le motif avec des guillemets Évite que le shell interprète les caractères spéciaux (*, ?, |, etc.)
2
Utiliser -E pour les regex avec alternance ou quantificateurs grep basique nécessite d'échapper | + ? (), -E les active directement

Vocabulaire essentiel

-i
Ignorer la casse (case-insensitive)
-v
Inverser : lignes SANS le motif
-n
Afficher les numéros de ligne
-c
Compter les lignes (pas les occurrences)
-r
Recherche récursive dans les dossiers
-l
Afficher uniquement les noms de fichiers
📚 Pour aller plus loin — 6 options avancées
-E
Regex étendues (egrep)
-w
Mot entier uniquement
-o
Afficher uniquement la correspondance
-A N
N lignes après chaque match
-B N
N lignes avant chaque match
-C N
N lignes de contexte (avant et après)

grep lit le fichier ou stdin ligne par ligne, teste si le motif est présent, puis affiche les lignes correspondantes sur stdout.

L'ordre des trois éléments n'est pas négociable : les options viennent avant le motif, et le motif avant les fichiers. Si vous inversez motif et fichier, grep cherchera le nom du fichier à l'intérieur du motif traité comme un chemin, et vous obtiendrez une erreur No such file or directory déroutante. Quand [FICHIER...] est absent, grep lit son entrée standard, ce qui est exactement le comportement recherché dans un pipeline.

Fenêtre de terminal
grep [OPTIONS] MOTIF [FICHIER...]

grep propose plusieurs modes selon le type de motif. Le choix se fait sur une seule question : votre motif contient-il des caractères qui ont un sens spécial en regex ? Si oui et que vous les voulez littéraux, -F est la réponse la plus sûre. Si vous voulez au contraire exploiter l'alternance ou les quantificateurs, -E vous évite d'échapper la moitié du motif.

ModeCommandeUsageExemple
Texte simplegrepMotifs littérauxgrep "ERROR" log.txt
Regex basique (BRE)grepMétacaractères basiquesgrep "^[0-9]" file
Regex étendue (ERE)grep -E|, +, ?, () sans échappementgrep -E "a|b"
Texte littéralgrep -FDésactive les regexgrep -F "*.txt" file

Ces huit options couvrent la quasi-totalité des usages quotidiens. Elles se combinent librement : grep -rin "timeout" /var/log/ cumule la récursivité, la casse ignorée et les numéros de ligne. Deux d'entre elles modifient la nature de la sortie plutôt que la sélection : -c renvoie un nombre, -l renvoie des chemins. Ce sont celles qu'on chaîne dans un script, parce que leur sortie se consomme facilement par une autre commande.

OptionEffetExemple
-iIgnorer la cassegrep -i "error"
-vInverser (lignes sans le motif)grep -v "DEBUG"
-nAfficher les numéros de lignegrep -n "ERROR"
-cCompter les lignesgrep -c "ERROR"
-lAfficher uniquement les noms de fichiersgrep -l "TODO"
-rRecherche récursivegrep -r "TODO" src/
-wMot entier uniquementgrep -w "port"
-oAfficher uniquement la correspondancegrep -o "[0-9]*"

Une ligne d'erreur isolée dit rarement ce qui s'est passé. Ces trois options ramènent les lignes voisines et transforment un message brut en séquence lisible. Un détail à connaître : quand deux correspondances sont proches, grep insère une ligne -- entre les blocs de contexte pour marquer la coupure. Cette ligne parasite les traitements en aval, supprimez-la avec --no-group-separator si vous chaînez la sortie.

OptionEffetExemple
-A NN lignes après (After)grep -A 3 "ERROR"
-B NN lignes avant (Before)grep -B 2 "ERROR"
-C NN lignes avant et après (Context)grep -C 2 "ERROR"
Fenêtre de terminal
# Voir ce qui s'est passé avant et après une erreur
grep -C 3 "Exception" application.log
# Afficher le contexte après chaque erreur (stack trace)
grep -A 10 "ERROR" app.log

Ces motifs appartiennent au dialecte BRE (Basic Regular Expression), celui que grep utilise sans option. Deux comportements y surprennent : * ne signifie pas « n'importe quoi » comme dans le shell, mais « zéro ou plusieurs fois le caractère précédent » ; et les frontières de mot s'écrivent \< et \>, avec des barres obliques inverses, alors que la plupart des autres options avancées exigent l'inverse. Retenez les deux ancres ^ et $ en priorité, ce sont elles qui éliminent le plus de faux positifs.

PatternSignificationExemple
^motifDébut de lignegrep "^ERROR"
motif$Fin de lignegrep "done$"
.Un caractère quelconquegrep "err.r"
*Zéro ou plus du précédentgrep "ab*c"
[abc]Un parmi a, b ou cgrep "[aeiou]"
[^abc]Aucun parmi a, b ou cgrep "[^0-9]"
\<mot\>Mot entier (BRE)grep "\<port\>"

Avec -E, vous passez en ERE (Extended Regular Expression) et les métacaractères avancés deviennent disponibles sans échappement :

PatternSignificationExemple
a|ba OU bgrep -E "ERROR|WARNING"
+Un ou plus du précédentgrep -E "[0-9]+"
?Zéro ou un du précédentgrep -E "colou?r"
(abc)Groupementgrep -E "(ab)+"
{n,m}Entre n et m répétitionsgrep -E "[0-9]{2,4}"
Fenêtre de terminal
# Trouver ERROR ou WARNING ou CRITICAL
grep -E "ERROR|WARNING|CRITICAL" app.log
# Trouver les lignes avec un numéro de 2 à 4 chiffres
grep -E "[0-9]{2,4}" data.txt
# Extraire les adresses IP
grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log

La récursivité est le mode où grep peut devenir lent et bruyant. Deux options règlent presque tout : --exclude-dir pour ignorer les dossiers de dépendances et l'historique Git, --include pour ne cibler qu'un type de fichier. Sans elles, une recherche à la racine d'un projet Node parcourt node_modules et noie le résultat utile. Notez aussi que -r suit les liens symboliques indiqués en argument mais pas ceux rencontrés en chemin ; utilisez -R si vous voulez les suivre tous.

Fenêtre de terminal
# Tous les fichiers du dossier courant
grep -r "TODO" .
# Avec numéros de ligne
grep -rn "FIXME" src/
# Uniquement les noms de fichiers
grep -rl "password" /etc/
# Exclure certains dossiers
grep -r "TODO" --exclude-dir={node_modules,.git} .
# Filtrer par extension
grep -r "import" --include="*.py" .

Toutes ces situations ont la même signature : grep ne plante pas, il renvoie simplement un résultat qui ne correspond pas à votre attente. C'est ce qui les rend coûteuses, puisque rien ne signale l'erreur. Le réflexe qui les évite presque toutes est de tester le motif sur une seule ligne connue avant de le lancer sur un fichier entier.

ErreurCauseSolution
Aucun résultatCasse différenteUtiliser -i
Résultats partielsCorrespondance sous-chaîneUtiliser -w pour mot entier
Regex non reconnuegrep basiqueUtiliser -E pour regex étendues
"Binary file matches"Fichier binaire détectéUtiliser -a pour forcer texte
grep se trouve lui-mêmeps | grepAjouter | grep -v grep

Maintenant que vous comprenez la logique de grep, voici seize modèles prêts à l'emploi. Chacun donne sa formule générale et un exemple concret.

Trouver les lignes contenant un mot. La sortie affiche la ligne entière, pas seulement la portion qui correspond ; le code de retour vaut 0 si au moins une ligne correspond, 1 sinon, ce qui rend cette forme utilisable telle quelle dans un test de script.

Fenêtre de terminal
grep "MOTIF" <fichier> # formule
grep "ERROR" application.log # exemple
  • MOTIF : texte ou expression régulière à rechercher

Trouver sans distinction majuscules / minuscules. C'est l'option à dégainer en premier quand une recherche ne renvoie rien alors que vous êtes certain du contenu : les niveaux de log s'écrivent ERROR chez les uns, Error chez les autres.

Fenêtre de terminal
grep -i "MOTIF" <fichier> # formule
grep -i "error" logs.txt # exemple
  • -i : recherche insensible à la casse

Afficher les lignes qui ne contiennent pas le motif.

Fenêtre de terminal
grep -v "MOTIF" <fichier> # formule
grep -v "DEBUG" application.log # exemple
  • -v : inverse la sélection

Compter le nombre de lignes correspondantes. Attention au sens exact : -c compte les lignes, pas les occurrences. Une ligne qui contient trois fois le motif ne compte que pour un.

Fenêtre de terminal
grep -c "MOTIF" <fichier> # formule
grep -c "ERROR" application.log # exemple
  • -c : renvoie uniquement le compte, pas les lignes

Voir à quelles lignes se trouvent les correspondances.

Fenêtre de terminal
grep -n "MOTIF" <fichier> # formule
grep -n "ERROR" application.log # exemple
  • -n : préfixe chaque ligne par son numéro

Voir N lignes après chaque correspondance. C'est la forme adaptée aux traces d'exception, où le message d'erreur tient sur une ligne mais la pile d'appel se déroule sur les suivantes.

Fenêtre de terminal
grep -A N "MOTIF" <fichier> # formule
grep -A 3 "Exception" error.log # exemple
  • -A N : N lignes après (After)

Voir N lignes avant chaque correspondance. Utile dans le cas inverse : comprendre ce que le service tentait de faire juste avant l'échec, information qui manque toujours dans la ligne d'erreur elle-même.

Fenêtre de terminal
grep -B N "MOTIF" <fichier> # formule
grep -B 2 "FAILURE" job.log # exemple
  • -B N : N lignes avant (Before)

Voir N lignes de part et d'autre de chaque correspondance.

Fenêtre de terminal
grep -C N "MOTIF" <fichier> # formule
grep -C 2 "timeout" network.log # exemple
  • -C N : N lignes de contexte (Context)

Éviter les correspondances partielles. Sans cette option, chercher port dans une configuration remonte aussi import, export et support, ce qui noie le résultat utile sous des lignes sans rapport.

Fenêtre de terminal
grep -w "MOTIF" <fichier> # formule
grep -w "port" config.conf # exemple
  • -w : impose une frontière de mot

Chercher dans tous les fichiers d'un répertoire. Sur un projet réel, ajoutez systématiquement --exclude-dir : sans elle, grep descend dans .git et dans les dossiers de dépendances, et la recherche devient à la fois lente et illisible.

Fenêtre de terminal
grep -r "MOTIF" <dossier> # formule
grep -r "TODO" ./src/ # exemple
  • -r : descend dans les sous-dossiers

Lister les fichiers contenant le motif, sans afficher les lignes.

Fenêtre de terminal
grep -l "MOTIF" <fichiers> # formule
grep -rl "password" /etc/ # exemple
  • -l : n'affiche que les chemins de fichiers

Chercher plusieurs motifs avec un OU. Sans -E, la barre verticale est prise au pied de la lettre et grep cherche la chaîne littérale ERROR|WARNING, qui n'existe nulle part : vous obtenez zéro résultat sans le moindre message d'erreur.

Fenêtre de terminal
grep -E "MOTIF1|MOTIF2" <fichier> # formule
grep -E "ERROR|WARNING|CRITICAL" app.log # exemple
  • -E : active les regex étendues
  • | : alternance (OU)

Extraire uniquement la partie correspondante, pas la ligne entière.

Fenêtre de terminal
grep -o "PATTERN" <fichier> # formule
grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log # exemple
  • -o : affiche uniquement la correspondance

Ignorer les lignes de commentaires et les lignes vides d'un fichier de configuration.

Fenêtre de terminal
grep -v "^#" <fichier> | grep -v "^$" # formule
grep -v "^#" config.conf | grep -v "^$" # exemple
  • ^# : lignes commençant par #
  • ^$ : lignes vides

Filtrer la sortie d'une autre commande. C'est l'usage le plus courant en administration. Retenez que grep ne voit ici que la sortie standard : les messages d'erreur passent à côté du filtre tant que vous n'ajoutez pas 2>&1.

Fenêtre de terminal
<commande> | grep "MOTIF" # formule
ps aux | grep nginx # exemple
  • grep filtre ce qui arrive sur son entrée standard

Chercher dans plusieurs fichiers à la fois. Dès qu'il y a plus d'un fichier, grep préfixe chaque ligne du nom du fichier. C'est ce préfixe qui permet ensuite de trier ou de compter par fichier, mais il casse les traitements qui attendaient la ligne brute.

Fenêtre de terminal
grep "MOTIF" <fichier1> <fichier2> ... # formule
grep "server" *.conf # exemple
  • * : joker shell pour cibler plusieurs fichiers

Huit erreurs reviennent constamment avec grep. Pour chacune : la commande piégée, le symptôme, la cause et la correction.

Fenêtre de terminal
grep *.log fichier.txt # INCORRECT : le shell interprète le * avant grep

Symptôme : erreur ou résultats inattendus. Cause : le shell interprète les caractères spéciaux (*, ?, |) avant que grep ne les voie.

Fenêtre de terminal
grep "*.log" fichier.txt # CORRECT : le motif est protégé
Fenêtre de terminal
grep "error" fichier.log # INCORRECT : ne trouve pas "ERROR" ni "Error"

Symptôme : des lignes manquent dans les résultats. Cause : par défaut, grep est sensible à la casse.

Fenêtre de terminal
grep -i "error" fichier.log # CORRECT : casse ignorée
Fenêtre de terminal
ps aux | grep nginx # INCORRECT : affiche aussi la ligne du processus "grep nginx"

Symptôme : une ligne parasite contenant grep dans les résultats. Cause : le processus grep apparaît lui-même dans la liste de ps.

Fenêtre de terminal
ps aux | grep nginx | grep -v grep # CORRECT : on exclut la ligne du grep
Fenêtre de terminal
grep "ERROR|WARNING" fichier.log # INCORRECT : cherche le texte littéral "ERROR|WARNING"

Symptôme : aucun résultat. Cause : en regex basique, le | n'est pas l'alternance, il faut l'échapper ou utiliser -E.

Fenêtre de terminal
grep -E "ERROR|WARNING" fichier.log # CORRECT : regex étendue
Fenêtre de terminal
grep "prix: 10$" fichier.txt # INCORRECT : le $ est interprété comme « fin de ligne »

Symptôme : résultats inattendus. Cause : $ est un métacaractère de regex.

Fenêtre de terminal
grep -F "prix: 10$" fichier.txt # CORRECT : -F traite le motif comme du texte littéral
Fenêtre de terminal
grep -c "mot" fichier.txt # INCORRECT : renvoie 2 même si "mot" apparaît 5 fois sur 2 lignes

Symptôme : un compte inférieur au nombre réel d'occurrences. Cause : -c compte les lignes contenant le motif, pas le nombre total de correspondances.

Fenêtre de terminal
grep -o "mot" fichier.txt | wc -l # CORRECT : compte les occurrences réelles
Fenêtre de terminal
grep "motif" fichier.bin # INCORRECT : affiche "Binary file matches" au lieu du contenu

Symptôme : un message au lieu du résultat. Cause : grep détecte un fichier binaire et n'en affiche pas le contenu.

Fenêtre de terminal
grep -a "motif" fichier.bin # CORRECT : -a force le traitement comme du texte
Fenêtre de terminal
grep "port" config.conf # INCORRECT : trouve aussi "import", "export", "support"

Symptôme : trop de résultats non pertinents. Cause : grep cherche la sous-chaîne, pas le mot entier.

Fenêtre de terminal
grep -w "port" config.conf # CORRECT : -w impose le mot entier

Rien ne remplace la pratique. Créez l'environnement de test ci-dessous, puis déroulez les douze étapes. À la fin, nettoyez avec rm -rf ~/grep-lab.

Ce script crée quatre fichiers de test dans ~/grep-lab : un log applicatif, un fichier de configuration, du code source Python et une liste de contacts.

Fenêtre de terminal
# Créer le lab
mkdir -p ~/grep-lab
cd ~/grep-lab
# Fichier de log applicatif
cat > application.log << 'EOF'
2025-01-15 08:00:01 INFO Application démarrée
2025-01-15 08:00:02 DEBUG Connexion base de données établie
2025-01-15 08:01:15 INFO Utilisateur alice connecté
2025-01-15 08:02:30 WARNING Mémoire utilisée: 75%
2025-01-15 08:03:45 ERROR Timeout lors de la requête API
2025-01-15 08:03:46 DEBUG Retry 1/3 en cours...
2025-01-15 08:03:48 ERROR Timeout lors de la requête API
2025-01-15 08:03:49 DEBUG Retry 2/3 en cours...
2025-01-15 08:03:51 INFO Requête réussie après retry
2025-01-15 08:05:00 INFO Utilisateur bob connecté
2025-01-15 08:10:00 WARNING Disque utilisé: 85%
2025-01-15 08:15:00 ERROR Permission denied: /var/data/secret.txt
2025-01-15 08:20:00 INFO Batch job terminé avec succès
EOF
# Fichier de configuration
cat > config.conf << 'EOF'
# Configuration serveur
server.host=localhost
server.port=8080
server.ssl.enabled=true
# Base de données
database.host=db.example.com
database.port=5432
database.name=production
database.user=admin
# Cache
cache.enabled=true
cache.ttl=3600
# Logging
log.level=INFO
log.file=/var/log/app.log
EOF
# Code source Python
cat > app.py << 'EOF'
#!/usr/bin/env python3
"""Application principale"""
import os
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def connect_database(host, port):
logger.info(f"Connexion à {host}:{port}")
# TODO: implémenter la connexion réelle
return True
def process_data(data):
# FIXME: gérer les erreurs
if not data:
raise ValueError("Data is empty")
return data.upper()
if __name__ == "__main__":
connect_database("localhost", 5432)
# TODO: ajouter la logique métier
EOF
# Fichier avec adresses email
cat > contacts.txt << 'EOF'
alice@example.com - Alice Martin
bob.smith@company.org - Bob Smith
charlie@test.co.uk - Charlie Brown
invalid-email - Non valide
ADMIN@EXAMPLE.COM - Administrateur
support@help-desk.net - Support technique
EOF
echo "Correct : Lab créé dans ~/grep-lab"
ls -la ~/grep-lab

Déroulez-les dans l'ordre : chaque étape réutilise une notion de la précédente, et les quatre dernières combinent plusieurs options. Après chaque commande, comparez ce que vous obtenez à la ligne d'explication : si le nombre de lignes affichées diffère, c'est presque toujours le motif qui est en cause, pas la commande. Les fichiers du lab sont volontairement courts pour que vous puissiez vérifier le résultat à l'oeil.

  1. Recherche simple. Trouvez toutes les lignes contenant ERROR dans application.log.

    Fenêtre de terminal
    grep "ERROR" ~/grep-lab/application.log

    grep affiche toutes les lignes contenant le motif, ici, trois lignes.

  2. Ignorer la casse. Trouvez toutes les variantes de error, quelle que soit la casse.

    Fenêtre de terminal
    grep -i "error" ~/grep-lab/application.log

    -i rend la recherche insensible à la casse.

  3. Numéros de lignes. Affichez les erreurs avec leur numéro de ligne.

    Fenêtre de terminal
    grep -n "ERROR" ~/grep-lab/application.log

    -n préfixe chaque résultat par son numéro de ligne dans le fichier.

  4. Inverser la recherche. Affichez toutes les lignes sauf celles contenant DEBUG.

    Fenêtre de terminal
    grep -v "DEBUG" ~/grep-lab/application.log

    -v inverse le filtre : il garde les lignes qui ne correspondent pas.

  5. Compter les occurrences. Comptez le nombre de lignes contenant INFO.

    Fenêtre de terminal
    grep -c "INFO" ~/grep-lab/application.log

    -c renvoie le nombre de lignes correspondantes, pas les lignes elles-mêmes.

  6. Contexte après. Affichez chaque ERROR suivi des 2 lignes qui suivent.

    Fenêtre de terminal
    grep -A 2 "ERROR" ~/grep-lab/application.log

    -A N ajoute N lignes de contexte après chaque correspondance. Pour du contexte avant et après : grep -C 1 "ERROR" ~/grep-lab/application.log.

  7. Mot entier. Trouvez INFO sans capturer un éventuel INFORMATION.

    Fenêtre de terminal
    grep -w "INFO" ~/grep-lab/application.log

    -w impose une frontière de mot autour du motif.

  8. Expressions régulières basiques. Trouvez les lignes commençant par une date (2025-).

    Fenêtre de terminal
    grep "^2025-" ~/grep-lab/application.log

    ^ représente le début de ligne en regex.

  9. Regex étendues avec alternance. Trouvez les lignes contenant ERROR ou WARNING.

    Fenêtre de terminal
    grep -E "ERROR|WARNING" ~/grep-lab/application.log

    -E active les regex étendues, où | signifie « ou ».

  10. Exclure les commentaires. Affichez les lignes de config.conf qui ne sont pas des commentaires.

    Fenêtre de terminal
    grep -v "^#" ~/grep-lab/config.conf

    ^# cible les lignes commençant par # ; -v les exclut.

  11. Pipeline avec grep. Listez les processus Python en cours.

    Fenêtre de terminal
    ps aux | grep python | grep -v grep

    grep filtre la sortie de ps ; le second grep -v grep retire la ligne du grep lui-même.

  12. Recherche récursive. Trouvez tous les TODO dans les fichiers du lab.

    Fenêtre de terminal
    grep -r "TODO" ~/grep-lab/

    -r parcourt récursivement tous les fichiers du dossier, les TODO sont dans app.py.

Dix exercices pour valider votre maîtrise. Tous se traitent sur les fichiers du lab ~/grep-lab. Cherchez d'abord par vous-même, puis dépliez la solution pour vous corriger.

Ces quatre exercices ne mobilisent qu'une seule option à la fois. Traitez-les sans consulter les tableaux plus haut : l'objectif est de mémoriser la lettre associée à chaque effet, -i, -v et -c, parce que ce sont celles que vous taperez le plus souvent en production.

Exercice 1, Trouver les erreurs. Affichez toutes les lignes contenant ERROR dans application.log. Indice : syntaxe simple grep "motif" fichier.

Voir la solution
Fenêtre de terminal
grep "ERROR" ~/grep-lab/application.log

grep affiche les lignes contenant le motif spécifié.

Exercice 2, Ignorer la casse. Trouvez toutes les variantes de warning (warning, WARNING, Warning…). Indice : -i pour insensible à la casse.

Voir la solution
Fenêtre de terminal
grep -i "warning" ~/grep-lab/application.log

-i rend la recherche insensible à la casse.

Exercice 3, Lignes sans DEBUG. Affichez toutes les lignes sauf celles contenant DEBUG. Indice : -v inverse la sélection.

Voir la solution
Fenêtre de terminal
grep -v "DEBUG" ~/grep-lab/application.log

-v affiche les lignes qui ne correspondent pas au motif.

Exercice 4, Compter les erreurs. Comptez le nombre de lignes contenant ERROR. Indice : -c pour count.

Voir la solution
Fenêtre de terminal
grep -c "ERROR" ~/grep-lab/application.log

-c renvoie uniquement le nombre de lignes correspondantes.

On monte d'un cran : ces cinq exercices demandent de choisir la bonne option parmi plusieurs candidates plausibles. L'exercice 6 est le plus instructif, puisque la version naïve sans -w renvoie un résultat, mais le mauvais. Un résultat non vide n'est jamais une preuve que le motif était correct.

Exercice 5, Contexte d'erreur. Affichez chaque ligne ERROR avec les 2 lignes suivantes. Indice : -A pour after.

Voir la solution
Fenêtre de terminal
grep -A 2 "ERROR" ~/grep-lab/application.log

-A N affiche N lignes après chaque correspondance.

Exercice 6, Mot entier. Trouvez port dans config.conf sans capturer import ou export. Indice : -w pour word.

Voir la solution
Fenêtre de terminal
grep -w "port" ~/grep-lab/config.conf

-w garantit que le motif est un mot entier, pas une sous-chaîne.

Exercice 7, Regex avec alternance. Trouvez les lignes contenant ERROR ou WARNING. Indice : -E pour les regex étendues, | pour le OU.

Voir la solution
Fenêtre de terminal
grep -E "ERROR|WARNING" ~/grep-lab/application.log

-E active les regex étendues, où | signifie « ou ».

Exercice 8, Exclure les commentaires. Affichez les lignes de config.conf sans les commentaires (#). Indice : ^# cible le début de ligne, -v inverse.

Voir la solution
Fenêtre de terminal
grep -v "^#" ~/grep-lab/config.conf

^# cible les lignes commençant par # ; -v les exclut.

Exercice 9, Recherche récursive. Trouvez tous les TODO dans les fichiers du lab. Indice : -r pour récursif.

Voir la solution
Fenêtre de terminal
grep -r "TODO" ~/grep-lab/

-r parcourt récursivement tous les sous-dossiers.

Dernier exercice, et le seul qui ne porte pas sur un fichier mais sur la sortie d'une autre commande. C'est le cas d'usage le plus fréquent de grep en administration, et celui où le piège de l'auto-correspondance se déclenche systématiquement : le processus grep que vous venez de lancer figure lui-même dans la liste renvoyée par ps.

Exercice 10, Filtrer un processus. Listez les processus contenant ssh sans afficher la ligne du grep lui-même. Indice : un second grep -v grep.

Voir la solution
Fenêtre de terminal
ps aux | grep ssh | grep -v grep

Le second grep -v grep exclut la ligne du processus grep de la sortie.

Quand grep ne renvoie pas ce qu'on attend, le problème vient presque toujours du motif (casse, regex, échappement). Voici comment diagnostiquer.

La démarche consiste à réduire le problème : au lieu de chercher pourquoi le motif échoue sur un fichier de dix mille lignes, testez-le sur une ligne que vous fabriquez avec echo. Si le motif fonctionne là et pas sur le fichier, le motif est bon et c'est le contenu qui diffère de ce que vous imaginez : espaces insécables, retours chariot Windows, caractères invisibles. C'est ce que cat -A révèle, en affichant ^M$ en fin de ligne pour un fichier au format DOS.

Fenêtre de terminal
# Tester le motif sur une ligne simple
echo "test ERROR test" | grep "ERROR"
# Afficher les caractères non imprimables du fichier
cat -A fichier.log | head
# Valider une expression régulière isolément
echo "test123" | grep -E "[0-9]+"
# Voir combien de lignes correspondent avant de filtrer
grep -c "MOTIF" fichier.log

Contrairement aux pièges précédents, ces trois cas produisent un message explicite sur la sortie d'erreur. C'est une bonne nouvelle : la cause est identifiée par grep lui-même. Lisez toujours le message en entier, il contient le chemin ou la portion de motif fautive, ce qui vous évite de chercher au mauvais endroit.

Message d'erreurCause probableSolution
grep: <fichier>: No such file or directoryFichier inexistant ou mauvais cheminVérifier avec ls, contrôler chemin relatif/absolu
grep: Invalid regular expressionSyntaxe regex incorrecte (parenthèse/crochet non fermé)Corriger la regex, ou -F pour une recherche littérale
Binary file <fichier> matchesLe fichier est détecté comme binaireForcer le mode texte avec grep -a

Les deux tableaux ci-dessous condensent tout le guide sur un écran. Le premier regroupe les options de la commande, le second les métacaractères du motif. La distinction compte : une option se place avant le motif et modifie le comportement de grep, un métacaractère vit à l'intérieur du motif et doit être protégé par des guillemets pour que le shell n'y touche pas.

Prenez ce tableau comme une liste de départ, pas comme une référence complète. Les quatre premières lignes couvrent l'essentiel du quotidien ; les options de contexte -A, -B et -C deviennent indispensables dès qu'on lit des traces d'erreur, où la ligne du message ne suffit jamais à comprendre l'enchaînement.

ÉlémentRôleExemple
grep "motif" fichierRecherche simplegrep "ERROR" log.txt
-iIgnorer la cassegrep -i "error" log.txt
-vInverser (exclure)grep -v "DEBUG" log.txt
-nNuméros de lignesgrep -n "ERROR" log.txt
-cCompter les lignesgrep -c "ERROR" log.txt
-wMot entiergrep -w "port" config
-lNoms de fichiers uniquementgrep -rl "TODO" .
-rRecherche récursivegrep -r "TODO" src/
-oAfficher uniquement le matchgrep -o "IP: [0-9.]*"
-A NN lignes aprèsgrep -A 3 "ERROR"
-B NN lignes avantgrep -B 2 "ERROR"
-C NN lignes de contextegrep -C 2 "ERROR"
-ERegex étenduesgrep -E "a|b"
-FTexte littéral (pas de regex)grep -F "*.txt"

Une seule ligne de ce tableau dépend d'une option : l'alternance a|b n'a de sens qu'avec -E. Toutes les autres fonctionnent en BRE, donc sans option. Si vous ne deviez retenir que deux entrées, prenez les ancres ^ et $ : ce sont elles qui transforment une recherche approximative en filtre précis, par exemple pour ne garder que les lignes de commentaire d'un fichier de configuration.

MotifRôleExemple
^motifDébut de lignegrep "^#" config
motif$Fin de lignegrep "done$" log
.Un caractère quelconquegrep "err.r"
*Zéro occurrence ou plus du précédentgrep "ab*c"
[abc]Un caractère parmi la listegrep "[aeiou]"
[^abc]Tout sauf ces caractèresgrep "[^0-9]"
a|ba OU b (avec -E)grep -E "cat|dog"
\<mot\>Mot entier (regex basique)grep "\<port\>"

Vous maîtrisez grep lorsque vous pouvez cocher chacun de ces points :

  • Je sais faire une recherche simple avec grep
  • Je sais ignorer la casse avec -i
  • Je sais inverser la recherche avec -v
  • Je sais compter les lignes avec -c
  • Je sais afficher le contexte avec -A, -B, -C
  • Je sais chercher un mot entier avec -w
  • Je sais utiliser les regex étendues avec -E
  • Je sais faire une recherche récursive avec -r
  • Je sais combiner grep dans un pipeline

La commande grep est l'outil de recherche textuelle le plus utilisé sous Linux. Sa syntaxe simple (grep "motif" fichier) couvre 80% des besoins quotidiens. Les options -i (casse), -v (inverser), -n (numéros), -r (récursif) et -E (regex étendues) permettent de couvrir les cas avancés. Pour du traitement plus complexe (extraction de colonnes, calculs), combinez grep avec awk ou cut.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn