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 ripgrepoudnf 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 :
| Option | Signification |
|---|---|
-i | Correspondance sans casse |
-n | Afficher les numéros de ligne |
-c | Compter les lignes correspondantes |
-l | Afficher uniquement les noms de fichiers correspondants |
-v | Inverser — afficher les lignes ne correspondant pas |
-w | Correspondance de mots entiers uniquement |
-r | Récursion dans les répertoires |
-A N | Afficher N lignes après la correspondance |
-C N | Afficher N lignes avant et après |
--color | Mettre 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. | Signification | Exemple |
|---|---|---|
. | N’importe quel caractère | gr.p correspond à grep, grip |
* | Zéro ou plus du précédent | go*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é | grep | ripgrep (rg) | ack |
|---|---|---|---|
| Intégré à Linux | Oui | Non | Non |
| Vitesse sur grands arbres | Bonne | Excellente | Bonne |
| Respecte .gitignore | Non | Oui | Partiellement |
| Filtres par type de fichier | --include | -t py | --python |
| Couleur par défaut | Avec --color | Oui | Oui |
| Meilleur pour | Logs système, scripts | Recherche dans le code | Recherche 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,-vsont les options les plus utilisées - Le regex basique (BRE) est le défaut ; utilisez
grep -Epour le regex étendu avec+,?et| -oextrait uniquement la partie correspondante — essentiel pour l’extraction de données- Combinez grep avec
tail -fpour la surveillance des logs en temps réel - Utilisez
grep -Fpour 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