grep et ripgrep : chercher dans le code et les logs
À la fin de ce tutoriel, vous saurez utiliser grep linux au quotidien (
-i,-n,-r,-E, contexte-A/-B/-C, exclusions) et basculer sur ripgrep (rg) pour le code et les gros arbres (--type,--glob,--stats) — labs sur un petit jeu de logs factices sous/tmp, sans secrets.Niveau : Intermédiaire · Temps estimé : 40–50 min · Versions testées : Ubuntu 22.04 / 24.04, Debian 12 ; notes Rocky/Alma 9 · Dernière vérification : 2026-09-11
Slug proposé :
linux-grep-ripgrep· Série : Linux Shell & Automation · Remplace / fusionne : N/A — création (chapitre 2)
Prérequis
- Hub Linux Shell & Automation
- Chapitre 1 Bash avancé (
set -euo, guillemets) — utile pour encapsuler grep/rg dans des scripts grep(GNU) déjà présent ; ripgrep :sudo apt install -y ripgrepousudo dnf install -y ripgrep- Lab entièrement dans
/tmp/lab-grep-rg; pas de vrais tokens / mots de passe dans les fichiers exemples
Coût : 0 €. ripgrep = paquet optionnel (fortement recommandé).
Ce que nous allons construire
Arbre lab : logs + mini « code »
→ grep : -i -n -r -E · contexte -A/-B/-C · exclude
→ ripgrep : --type --glob --stats · vitesse
→ Pipelines utiles (avec bash avancé)
→ Nettoyage
(Schéma à remplacer par une image locale Excalidraw / draw.io, alt : « grep et ripgrep : logs, code, contexte, globs, stats ».)
Deuxième chapitre de la série. Après des scripts robustes, on trouve vite dans logs et dépôts — compétence centrale DevOps avant awk (agrégats). Un incident « timeout DB » se résout souvent en trois gestes : rg/grep le motif, élargir avec -C, puis compter / regrouper (prochain tuto).
Étape 1 — Jeu de données lab sous /tmp
mkdir -p /tmp/lab-grep-rg/{logs,src,vendor}
cat > /tmp/lab-grep-rg/logs/app.log << 'EOF'
2026-09-11T10:00:01Z INFO boot ok
2026-09-11T10:00:02Z ERROR db timeout host=db01
2026-09-11T10:00:03Z WARN retry=1
2026-09-11T10:00:04Z ERROR db timeout host=db01
2026-09-11T10:00:05Z INFO user=alice action=login
2026-09-11T10:00:06Z ERROR auth failed user=eve
EOF
cat > /tmp/lab-grep-rg/logs/nginx.access.log << 'EOF'
203.0.113.10 - - [11/Sep/2026:10:00:01 +0000] "GET / HTTP/1.1" 200 512
203.0.113.50 - - [11/Sep/2026:10:00:02 +0000] "POST /login HTTP/1.1" 401 128
203.0.113.50 - - [11/Sep/2026:10:00:03 +0000] "POST /login HTTP/1.1" 401 128
192.0.2.10 - - [11/Sep/2026:10:00:04 +0000] "GET /health HTTP/1.1" 200 2
EOF
cat > /tmp/lab-grep-rg/src/app.py << 'EOF'
def connect():
# TODO: pool
raise TimeoutError("db timeout")
def login(user):
if user == "eve":
raise PermissionError("auth failed")
EOF
cat > /tmp/lab-grep-rg/vendor/noise.txt << 'EOF'
db timeout fake vendor noise
auth failed fake vendor noise
EOF
cd /tmp/lab-grep-rg
find . -type f
Étape 2 — grep classique : flags du quotidien
| Option | Rôle |
|---|---|
-i |
Insensible à la casse |
-n |
Numéro de ligne |
-r / -R |
Récursif |
-E |
Extended regex (équivalent egrep) |
-F |
Fixe (pas de regex) — plus sûr sur du littéral |
-v |
Inverse (lignes qui ne matchent pas) |
-c |
Compter les lignes match |
cd /tmp/lab-grep-rg
# Erreurs dans un fichier
grep -n ERROR logs/app.log
# Insensible à la casse
grep -in error logs/app.log
# Regex étendue : ERROR ou WARN
grep -nE 'ERROR|WARN' logs/app.log
# Récursif sur logs seulement
grep -rn 'db timeout' logs/
# Compter les 401
grep -c ' 401 ' logs/nginx.access.log || true
Astuce scripts : sous set -e, grep sans match retourne 1. Utilisez grep … || true, if grep -q …; then, ou grep -c selon le besoin (bash avancé). Pour un check silencieux dans une condition : grep -q (quiet) ne pollue pas stdout.
Étape 3 — Contexte et exclusions grep
cd /tmp/lab-grep-rg
# 1 ligne après / avant / les deux (-C)
grep -n -A1 'auth failed' logs/app.log
grep -n -B1 'db timeout' logs/app.log
grep -n -C1 'ERROR' logs/app.log
# Exclure un chemin (GNU grep)
grep -rn --exclude-dir=vendor 'db timeout' .
grep -rn --exclude='*.access.log' '401' logs/ || true
# Fichiers dont le *nom* matche (pas le contenu)
grep -rl 'TimeoutError' src/
| Option | Rôle |
|---|---|
-A N |
Affiche N lignes après le match |
-B N |
N lignes avant |
-C N |
Contexte avant et après |
--exclude-dir= |
Ignore un répertoire (ex. vendor, .git) |
--exclude= |
Ignore des globs de fichiers |
-l / -L |
Liste fichiers avec / sans match |
Sur d’énormes /var/log, préférez journalctl + grep, ou rg avec globs — évitez grep -r / sans filtre. Exemple journal : journalctl -u nginx --since today | grep -E ' 5[0-9]{2} ' pour repérer des 5xx du jour.
Étape 4 — ripgrep (rg) : code et arbres
ripgrep ignore par défaut beaucoup de bruit (.gitignore, binaires) et est en général plus rapide que grep -r sur un dépôt.
command -v rg || { echo "Installer : sudo apt install -y ripgrep"; exit 0; }
cd /tmp/lab-grep-rg
# Équivalents familiers
rg -n 'ERROR' logs/app.log
rg -i 'error' logs/
rg -n 'ERROR|WARN' logs/app.log
# Types de fichier (built-in)
rg -n 'TimeoutError' --type py
rg --type-list | head -n 20
# Globs : inclure / exclure
rg -n 'db timeout' --glob '!vendor/**'
rg -n '401' --glob '*.access.log'
# Stats (fichiers scannés, matches)
rg -n 'auth failed' --stats .
# Contexte comme grep
rg -n -C1 'ERROR' logs/app.log
# Remplacer en preview (sans écrire) — aperçu
rg -n 'db timeout' logs/ --replace 'DB_TIMEOUT'
| Feature rg | Équivalent grep approx. |
|---|---|
--type py |
find … -name '*.py' | xargs grep |
--glob '!vendor/**' |
--exclude-dir=vendor |
ignore .gitignore |
Manuel |
--stats |
Pas natif |
--json |
Pour outillage (hors lab) |
Rocky/Alma : dnf install ripgrep (EPEL parfois). Même CLI rg. Sur une machine sans ripgrep, retenez l’équivalent grep des globs ; installez rg dès que vous travaillez souvent dans du code.
Étape 5 — Pipelines utiles (ops)
cd /tmp/lab-grep-rg
# Top des IPs 401 (aperçu avant awk du prochain chapitre)
grep ' 401 ' logs/nginx.access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# Extraire host= des ERROR
grep -oE 'host=[^ ]+' logs/app.log | sort | uniq -c
# rg + scripts : quiet check
if rg -q 'PermissionError' src/; then echo "src contient PermissionError"; fi
# Limiter la profondeur
rg -n 'timeout' --max-depth 2 .
| Besoin | Outil souvent idéal |
|---|---|
| Une regex sur un fichier log | grep -nE |
| Dépot Git / code | rg |
| Compter / regrouper colonnes | grep/rg puis awk (ch. suivant) |
| Journal systemd | journalctl … | grep ou -g |
En pratique, notez vos motifs utiles (ERROR, 5xx, host=) dans un fichier d’équipe ou un alias shell — la valeur n’est pas d’apprendre toutes les options par cœur, mais de retrouver vite le bon flag (-C, --glob, -q).
Étape 6 — Vérification et nettoyage
cd /tmp/lab-grep-rg
grep -c ERROR logs/app.log
rg -c 'ERROR' logs/app.log 2>/dev/null || true
rg --stats -q 'timeout' . 2>&1 | tail -n 5 || true
cd /tmp
rm -rf /tmp/lab-grep-rg
echo "lab grep/rg nettoyé — OK"
Validé si : grep -nE et -C maîtrisés, exclusions vendor OK, rg --type / --glob / --stats testés, comportement exit code de grep connu sous set -e. Gardez ce lab /tmp comme terrain d’essai avant de lancer rg sur un monorepo réel.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
| Script s’arrête sur « pas de match » | set -e + grep exit 1 |
grep -q dans if, ou || true |
Trop de résultats vendor/ |
Pas d’exclude | --exclude-dir / rg --glob '!vendor/**' |
| Regex qui « mange » tout | Oubli -F / caractères spéciaux |
grep -F pour littéral ; échapper |
rg: command not found |
Paquet absent | apt/dnf install ripgrep |
| Accents / locale | Mauvaise locale | locale ; souvent OK en UTF-8 |
| grep lent sur gros arbre | -r sans filtre |
rg, globs, ou limiter le chemin |
Confusion egrep |
Synonyme déprécié | Préférer grep -E |
Quiz (3 questions)
1. Que fait grep -nE 'ERROR|WARN' fichier ?
– A. Compte les fichiers
– B. Affiche les lignes ERROR ou WARN avec numéros de ligne (regex étendue)
– C. Supprime les lignes
2. Avantage typique de ripgrep sur grep -r dans un dépôt ?
– A. Il remplace systemd
– B. Ignore souvent .gitignore / binaires et filtre via --type / --glob, en général plus rapide
– C. Il désactive set -e
3. Sous set -e, comment tester un motif sans tuer le script si absent ?
– A. Impossible
– B. if grep -q motif fichier; then …; fi (ou grep … || true)
– C. chmod 777
Réponses : 1‑B · 2‑B · 3‑B
FAQ
grep ou rg au quotidien ?
grep : toujours là sur un serveur minimal, un fichier, un pipe journalctl. rg : exploration de code, monorepos, exclusions intelligentes. Apprendre les deux. En SSH sur un hôte verrouillé sans paquets, grep sauve ; sur votre laptop de dev, rg devient le réflexe.
Comment ignorer .git et node_modules ?
rg le fait souvent par défaut (gitignore). En grep : --exclude-dir=.git --exclude-dir=node_modules. En rg : --glob '!node_modules/**' si besoin.
Le prochain chapitre awk sert à quoi alors ?
grep/rg filtrent des lignes ; awk découpe et agrège (colonnes, sommes, rapports). Enchaînement classique : rg/grep … | awk ….
Pour aller plus loin
man grep,rg --help, doc ripgrep- Suite : awk pratique : colonnes et rapports
- Hub : Linux Shell & Automation
Maillage série Linux Shell & Automation
| ← Précédent | Bash avancé : fonctions, arrays et set -euo |
| → Suivant | awk pratique : colonnes et rapports |
| Hub | Linux Shell & Automation |
Meta publication (à remplir dans Rank Math / SEO)
- Title SEO : grep et ripgrep : chercher dans code et logs (2026)
- Meta description (≤ 155) : Maîtrisez grep et ripgrep (rg) pour logs et code. Guide Shell Automation DevOps 2026.
- Focus keyphrase : grep linux
- KW secondaires : ripgrep, rg –glob, grep -E, grep contexte
- Schemas Rank Math : Article + HowTo (étapes lab) + FAQ (3 questions ci-dessus)
- Image mise en avant :
assets/web/devopelastichayway/cover-linux-grep-ripgrep-1200x630.webp(Visuels Linux — WebP 1200×630) - Catégorie : Linux · Niveau : Intermédiaire
- Slug :
linux-grep-ripgrep - Statut : HOLD — draft only (ne pas publier)
← Retour parcours Linux — Basics, Admin, Réseau & Sécurité, Shell & Automation.