Document

SUBSCRIBE TO GET FULL ACCESS TO THE E-BOOKS FOR FREE 🎁SUBSCRIBE NOW

Professional Dropdown with Icon

SUBSCRIBE NOW TO GET FREE ACCESS TO EBOOKS

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 ripgrep ou sudo 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

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.