COMMANDLINE · TEXT PROCESSING · LINUX
La commande grep Linux est l’outil incontournable pour rechercher, filtrer et extraire du texte dans des fichiers et des flux. Ce guide couvre toutes les options essentielles avec des exemples concrets de production.
📋 Au programme

Réponse rapide
La commande grep Linux recherche des motifs textuels dans des fichiers ou des flux. Sa syntaxe de base :
grep [options] "motif" fichier
Exemple rapide :
# Chercher "erreur" dans un fichier de logs
grep "erreur" /var/log/application.log
# Chercher en ignorant la casse
grep -i "warning" /var/log/syslog
# Chercher récursivement dans un dossier
grep -r "TODO" /home/user/projet/
Les options les plus utilisées : -i (ignorer la casse), -r (récursif), -n (numéros de ligne), -v (inverser), -E (regex étendue).
Qu’est-ce que la commande grep ?
grep (Global Regular Expression Print) est un utilitaire en ligne de commande qui filtre les lignes d’un texte selon un motif. Il fait partie de la famille GNU Core Utilities et est présent sur quasiment toutes les distributions Linux et UNIX.
Concrètement : tu lui donnes un mot ou une expression régulière, il te retourne toutes les lignes qui correspondent. C’est l’outil de base pour fouiller des logs, auditer des configs, ou scripter des traitements sur des fichiers texte.
À savoir
grep trouve ses origines dans ed, l’éditeur de ligne de UNIX. La commande g/re/p (global / regular expression / print) est devenue un programme à part entière écrit par Ken Thompson en 1973.
Syntaxe de base de grep
grep "motif" fichier.txt
Si aucun fichier n’est spécifié, grep lit l’entrée standard (stdin), ce qui permet de le combiner avec d’autres commandes :
cat /var/log/nginx/access.log | grep "404"
ps aux | grep "nginx"
Recherche dans plusieurs fichiers :
grep "database" config.yml .env docker-compose.yml
Les options essentielles de grep
grep -i : ignorer la casse
grep -i "error" /var/log/app.log
# Match : Error, ERROR, error, ErRoR
Indispensable pour les logs où le format de message varie.
grep -v : inverser le résultat
# Afficher tout SAUF les lignes contenant "debug"
grep -v "debug" /var/log/app.log
# Filtrer les commentaires et lignes vides d'un fichier de config
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
grep -r / -R : recherche récursive
# Chercher dans tous les fichiers d'un dossier
grep -r "password" /etc/
# -R suit aussi les liens symboliques (à utiliser avec précaution)
grep -R "TODO" ~/projects/
grep -n : afficher les numéros de ligne
grep -n "listen" /etc/nginx/sites-available/default
# 42: listen 80;
# 43: listen [::]:80;
Utile pour localiser précisément un motif dans un fichier de configuration.
grep -c : compter les occurrences
grep -c "GET" /var/log/nginx/access.log
# 1847
# Compter par fichier dans une recherche récursive
grep -rc "Exception" /var/log/application/
grep -l : lister les fichiers correspondants
# Afficher uniquement les noms de fichiers contenant le motif
grep -rl "deprecated" /home/user/codebase/
# Idéal pour trouver quels fichiers utilisent une vieille API
grep -rl "mysql_connect" /var/www/
grep -A / -B / -C : contexte autour du match
# Afficher 3 lignes après le match
grep -A 3 "ERROR" /var/log/app.log
# Afficher 2 lignes avant le match
grep -B 2 "started" /var/log/app.log
# Afficher 2 lignes avant et après (contexte complet)
grep -C 2 "timeout" /var/log/app.log
Bonnes pratiques
-C est l’option la plus utile en production pour comprendre le contexte d’une erreur dans un log. Privilégie -C 3 ou -C 5 pour avoir assez de contexte sans noyer l’info.
grep -E : expressions régulières étendues
# Chercher une adresse IP
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /var/log/access.log
# Chercher plusieurs motifs avec |
grep -E "ERROR|WARN|CRITICAL" /var/log/app.log
egrep est un alias historique de grep -E, toujours disponible pour compatibilité.
grep -o : extraire uniquement le motif
# Extraire toutes les adresses email d'un fichier
grep -oE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contacts.txt
# Extraire toutes les URLs d'une page HTML
grep -oE 'https?://[^ "]+' index.html
# Compter les occurrences exactes d'un mot
grep -o "erreur" /var/log/app.log | wc -l
–include / –exclude : filtrer par type de fichier
# Chercher uniquement dans les fichiers .py
grep -r --include="*.py" "import os" ~/project/
# Exclure les fichiers minifiés
grep -r --exclude="*.min.js" "debugger" /var/www/
# Combiner les deux
grep -r --include="*.yml" --exclude-dir=".git" "image:" ./
Cheat sheet grep
| Option | Description | Exemple |
|---|---|---|
-i |
Ignorer la casse | grep -i "error" log.txt |
-v |
Inverser le résultat | grep -v "debug" log.txt |
-r |
Recherche récursive | grep -r "TODO" ./src/ |
-n |
Numéros de ligne | grep -n "listen" nginx.conf |
-c |
Compter les occurrences | grep -c "200" access.log |
-l |
Noms de fichiers seulement | grep -rl "secret" /etc/ |
-A N |
N lignes après le match | grep -A 5 "ERROR" log.txt |
-B N |
N lignes avant le match | grep -B 2 "started" log.txt |
-C N |
N lignes avant et après | grep -C 3 "timeout" log.txt |
-E |
Regex étendue | grep -E "ERR|WARN" log.txt |
-o |
Extraire le motif seul | grep -oE "[0-9.]+" data.txt |
-w |
Mot entier uniquement | grep -w "port" config.yml |
-x |
Ligne entière doit matcher | grep -x "true" config |
--include |
Filtrer par extension | grep -r --include="*.py" "def " ./ |
--exclude |
Exclure une extension | grep -r --exclude="*.log" "error" ./ |
--exclude-dir |
Exclure un dossier | grep -r --exclude-dir=node_modules "require" ./ |
grep en production : exemples concrets
📊
Analyser des logs HTTP
Codes statut, IPs problématiques, erreurs 5xx dans les access logs Nginx/Apache.
🔍
Auditer des configurations
Trouver des mots de passe en clair, des ports ouverts, des configs obsolètes.
📄
Filtrer des fichiers CSV
Extraire des lignes par client, compter des entrées par statut.
⚙️
Automatiser avec xargs
Remplacer un terme dans tous les fichiers trouvés, supprimer des fichiers de cache.
Analyser des logs HTTP
# Compter les codes statut d'un access log Nginx
grep -oE '" [0-9]{3} ' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# Trouver les erreurs 5xx récentes
grep -E " (50[0-9]) " /var/log/nginx/access.log | tail -20
# Extraire les IPs avec le plus de requêtes 404
grep " 404 " /var/log/nginx/access.log | grep -oE '^[0-9.]+' | sort | uniq -c | sort -rn | head -10
Filtrer un fichier CSV
# Extraire les lignes d'un client spécifique
grep ";client_a;" commandes.csv
# Compter les entrées par statut (colonne 3)
grep -oE '[^;]*;[^;]*;[^;]*' data.csv | grep -oE '[^;]*$' | sort | uniq -c
Auditer des configurations
# Trouver les ports ouverts dans les configs
grep -rn "listen" /etc/nginx/sites-enabled/
# Vérifier les mots de passe en clair (audit de sécurité)
grep -rn "password\s*=" /etc/application/
# Lister les tâches cron actives
grep -v "^#" /etc/crontab | grep -v "^$"
Combinaisons avancées
grep + xargs : agir sur les résultats
# Remplacer un terme dans tous les fichiers .md d'un dossier
grep -rl "ancien_terme" ./docs/ | xargs sed -i 's/ancien_terme/nouveau_terme/g'
# Supprimer les fichiers de cache trouvés
grep -rl "CACHE_MARKER" /var/cache/app/ | xargs rm -f
grep dans des archives compressées : zgrep
# Chercher dans un log gzippé
zgrep "ERROR" /var/log/syslog.2.gz
# Chercher dans tous les logs compressés
zgrep -c "timeout" /var/log/syslog.*.gz
zgrep est un wrapper qui décompresse à la volée. Il existe aussi bzgrep pour les fichiers bz2 et xzgrep pour les fichiers xz.
fgrep : recherche de chaînes fixes
# Recherche rapide sans interprétation des caractères spéciaux
fgrep "[debug]" /var/log/app.log
# Cherche littéralement "[debug]", pas une classe de caractères
Performance
fgrep (alias de grep -F) est plus rapide car il ne compile pas de regex. Parfait pour les recherches de chaînes littérales contenant des métacaractères.
Expressions régulières avec grep
grep supporte deux niveaux de regex :
- Basique (BRE) — par défaut :
.,*,^,$,[ ] - Étendue (ERE) — avec
-E: ajoute+,?,|,( ),{ }
Exemples de regex utiles
# Ligne commençant par "server"
grep -E "^server" nginx.conf
# Ligne se terminant par un point-virgule
grep -E ";$" config.yml
# Motif avec quantificateur
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" log.txt
# Groupe de capture (ERE) - chercher user OU admin
grep -E "(user|admin):" /etc/passwd
# Négation de classe
grep -E "^[^#]" config.conf # Lignes ne commençant PAS par #
Limites et alternatives à grep
grep est parfait pour les recherches simples à modérées. Pour des cas plus avancés :
- awk — quand tu dois filtrer et transformer les données (calculs, reformattage, champs)
- sed — quand tu dois filtrer et modifier le contenu (remplacement, insertion)
ripgrep (rg)— alternative moderne, plus rapide, ignore.gitignorepar défautag (the_silver_searcher)— optimisé pour la recherche dans du code source
Pour l’analyse de logs en production, grep reste l’outil le plus immédiatement disponible et prévisible.
Questions fréquentes
▶ Quelle est la différence entre grep, egrep et fgrep ?
grep -E) active les regex étendues (+, ?, |, groupes). fgrep (grep -F) désactive l’interprétation regex et cherche des chaînes littérales — plus rapide pour les recherches de texte fixe.
▶ Comment chercher dans plusieurs fichiers avec grep ?
-r pour une recherche récursive : grep -r "motif" /chemin/. Pour lister uniquement les fichiers qui contiennent le motif, ajoute -l : grep -rl "motif" /chemin/.
▶ Comment ignorer la casse avec grep ?
-i : grep -i "error" /var/log/app.log. Cela matchera error, Error, ERROR et toutes les variantes de casse.
▶ Comment afficher le contexte autour d’un résultat grep ?
-A N (après), -B N (avant) ou -C N (les deux). Par exemple, grep -C 5 "ERROR" /var/log/app.log affiche 5 lignes avant et 5 lignes après chaque match.
▶ Comment exclure un dossier ou un type de fichier avec grep ?
--exclude-dir pour les dossiers et --exclude pour les fichiers : grep -r --exclude-dir=node_modules --exclude="*.log" "motif" ./ pour chercher en excluant node_modules et les fichiers .log.
Besoin d’aide sur votre infrastructure Linux ?
La maîtrise des outils comme grep, awk et sed fait partie du quotidien en administration système. Linux-Man accompagne les TPE et PME sur toutes les problématiques d’infogérance et DevOps.