grep est le fondement de la recherche de texte sur Linux. Que vous ayez besoin de trouver une chaîne dans un fichier de log, de filtrer la sortie d’un pipeline ou de rechercher un motif dans des milliers de fichiers source, maîtriser grep et les expressions régulières est l’une des compétences les plus précieuses pour un utilisateur Linux ou un administrateur système. Ce guide couvre l’usage basique, les motifs regex avancés, le filtrage de logs en conditions réelles et une comparaison pratique de grep, ripgrep et ack.

Prérequis

  • Un système Linux (Ubuntu, Debian, CentOS, Arch ou similaire)
  • Familiarité basique avec le terminal (voir Utiliser le Terminal sur Ubuntu)
  • grep préinstallé (présent sur toutes les distributions Linux par défaut)
  • Optionnel : ripgrep (apt install ripgrep ou dnf install ripgrep) et ack (apt install ack)

Utilisation Basique de grep

grep lit un ou plusieurs fichiers (ou l’entrée standard) et affiche les lignes correspondant à un motif. La forme la plus simple est :

grep 'motif' nom_fichier

Options clés utilisées quotidiennement :

OptionSignification
-iCorrespondance sans casse
-nAfficher les numéros de ligne
-cCompter les lignes correspondantes
-lAfficher uniquement les noms de fichiers correspondants
-vInverser — afficher les lignes ne correspondant pas
-wCorrespondance de mots entiers uniquement
-rRécursion dans les répertoires
-A NAfficher N lignes après la correspondance
-C NAfficher N lignes avant et après
--colorMettre en évidence la correspondance

Exemples :

# Trouver toutes les lignes avec "error" (sans casse)
grep -i 'error' /var/log/syslog

# Afficher les numéros de ligne dans le résultat
grep -n 'Failed password' /var/log/auth.log

# Compter le nombre d'occurrences d'un motif
grep -c 'GET /api' access.log

# Recherche récursive dans tous les fichiers .py
grep -r 'import os' --include='*.py' ./projet

Expressions Régulières Basiques (BRE)

Par défaut, grep utilise les Expressions Régulières Basiques. Les métacaractères essentiels :

Métacar.SignificationExemple
.N’importe quel caractèregr.p correspond à grep, grip
*Zéro ou plus du précédentgo*d correspond à gd, god, good
^Début de ligne^ERROR correspond aux lignes débutant par ERROR
$Fin de ligne\.log$ correspond aux lignes finissant par .log
[ ]Classe de caractères[aeiou] correspond à n’importe quelle voyelle
\{n,m\}Plage de répétition[0-9]\{2,4\} correspond à 2–4 chiffres

Expressions Régulières Étendues (ERE) avec grep -E

Les ERE suppriment les antislashes des opérateurs de répétition et de groupement. Utilisez grep -E ou l’alias egrep :

# Correspondre ERROR, WARN ou CRITICAL
grep -E 'ERROR|WARN|CRITICAL' /var/log/app.log

# Correspondre des adresses IP (simplifié)
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log

# Correspondre les lignes avec un code HTTP 4xx ou 5xx
grep -E ' [45][0-9]{2} ' access.log

# Extraire les adresses e-mail d'un fichier
grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt

L’option -o affiche uniquement la partie correspondante, pas la ligne entière — essentiel pour l’extraction de données.

Filtrage des Logs en Temps Réel

Combinez grep avec tail -f pour surveiller les logs en direct :

# Suivre syslog et afficher uniquement les lignes d'erreur
tail -f /var/log/syslog | grep -i 'error'

# Afficher les erreurs nginx en excluant le bruit des healthchecks
tail -f /var/log/nginx/access.log | grep -v '/health'

# Mettre en évidence plusieurs motifs simultanément
tail -f /var/log/app.log | grep --color -E 'ERROR|WARN|INFO'

Les chaînes de pipelines sont le cas d’usage le plus puissant de grep pour les opérations :

# Compter les échecs de connexion SSH par IP (1000 dernières lignes)
tail -1000 /var/log/auth.log \
  | grep 'Failed password' \
  | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' \
  | sort | uniq -c | sort -rn

Comparaison: grep vs ripgrep vs ack

Fonctionnalitégrepripgrep (rg)ack
Intégré à LinuxOuiNonNon
Vitesse sur grands arbresBonneExcellenteBonne
Respecte .gitignoreNonOuiPartiellement
Filtres par type de fichier--include-t py--python
Couleur par défautAvec --colorOuiOui
Meilleur pourLogs système, scriptsRecherche dans le codeRecherche dans le code

Quand utiliser grep : analyse des logs système, scripts shell, recherches ponctuelles sur des serveurs disposant uniquement des outils standard.

Quand utiliser ripgrep : recherche dans des bases de code, pipelines CI, partout où la vitesse importe. Il parallélise la lecture des fichiers et utilise SIMD pour le matching.

Scénario Réel — Triage des Logs en Production

Vous avez un serveur web en production générant 50 Go de logs par jour. Après une alerte d’incident, vous devez trouver toutes les requêtes retournant des erreurs 500 entre 14h00 et 15h00 et extraire les IPs uniques des clients.

# Étape 1 — isoler la fenêtre temporelle
grep '21/Feb/2026:1[4-5]:' /var/log/nginx/access.log > /tmp/fenetre.log

# Étape 2 — filtrer les erreurs 500 uniquement
grep -E ' 500 ' /tmp/fenetre.log > /tmp/erreurs_500.log

echo "Total d'erreurs 500 dans la fenêtre : $(wc -l < /tmp/erreurs_500.log)"

# Étape 3 — extraire et classer les IPs des clients
grep -Eo '^[0-9.]+ ' /tmp/erreurs_500.log \
  | sort | uniq -c | sort -rn | head -20

Pièges et Cas Particuliers

Recherche dans les fichiers binaires : grep affichera “Binary file matches” et ignorera la sortie. Forcez le mode texte avec -a (--text) ou utilisez strings d’abord.

Caractères spéciaux dans les motifs : Si votre terme contient ., *, [ ou \, échappez-les avec \ ou utilisez grep -F (chaîne fixe, sans regex).

Performance sur les fichiers volumineux : grep est mono-thread. Pour les fichiers de plusieurs Go, utilisez ripgrep (parallèle) ou zgrep pour les logs compressés.

Problèmes de locale : Sur certains systèmes, [a-z] inclut des caractères accentués selon le locale LC_ALL. Utilisez LC_ALL=C grep pour un comportement ASCII prévisible.

Résolution de Problèmes

grep retourne le code de sortie 1 dans les scripts : C’est le comportement attendu — grep sort avec 1 quand aucune ligne ne correspond, ce qui fait avorter les scripts avec set -e. Utilisez grep ... || true pour gérer cela.

Le motif ne correspond pas malgré le texte visible : Vérifiez la présence de retours chariot (\r) dans les fichiers Windows. Exécutez grep -P '\r' pour les détecter et dos2unix pour les supprimer.

Recherche récursive lente : Ajoutez --exclude-dir=.git (ou utilisez ripgrep qui le fait par défaut) pour éviter d’analyser le répertoire .git.

Résumé

  • grep recherche dans les fichiers et stdin les lignes correspondant à un motif ; -i, -n, -r, -v sont les options les plus utilisées
  • Le regex basique (BRE) est le défaut ; utilisez grep -E pour le regex étendu avec +, ? et |
  • -o extrait uniquement la partie correspondante — essentiel pour l’extraction de données
  • Combinez grep avec tail -f pour la surveillance des logs en temps réel
  • Utilisez grep -F pour les recherches de chaînes littérales afin d’éviter les surprises des métacaractères
  • ripgrep est plus rapide pour la recherche dans le code ; grep reste le roi pour les logs et scripts

Articles Connexes