ripgrep (commande rg) est un outil de recherche en ligne de commande ultra-rapide, conçu pour chercher dans du code. Il est 10× plus rapide que grep, ignore automatiquement .git, node_modules et autres fichiers inutiles, et supporte nativement les regex Rust performantes.
Objectifs de l’article :
- Installer
ripgrepsur Linux/macOS/Windows - Comprendre les différences avec
grep - Maîtriser les options essentielles (types de fichiers, contexte, smart-case, regex avancées)
- Découvrir 15 cas pratiques du quotidien
- Intégrer
rgdans vos workflows (fzf, vim, VS Code, scripts)
Pourquoi ripgrep ?
Comparaison avec grep
| Critère | grep | ripgrep (rg) |
|---|---|---|
| Vitesse | Rapide | 10-30× plus rapide |
| Ignore .git/node_modules | Non (besoin –exclude) | Oui (par défaut) |
| Regex | BRE/ERE | Rust (PCRE2 en option) |
| Coloration syntaxe | Basique | Excellente |
| Recherche récursive | -r requis |
Par défaut |
| Types de fichiers | Manuel | Auto-détection |
| Smart case | Non | Oui (-S) |
D’où vient la différence de vitesse ?
- Ignore intelligent :
rgrespecte.gitignoreet ignore.git,node_modules, fichiers binaires — sans configuration - Multithreading natif : utilise tous les cœurs CPU disponibles
- Moteur regex optimisé : le moteur Rust est compilé en automate fini, évitant le backtracking catastrophique
L’écart dépend du projet : sur un dépôt propre avec peu de fichiers ignorés, rg est ~10× plus rapide. Sur un projet avec un gros node_modules ou beaucoup de binaires, le gain peut dépasser 30×.
Installation
Linux
# Debian/Ubuntu
sudo apt install ripgrep
# Fedora
sudo dnf install ripgrep
# Arch
sudo pacman -S ripgrep
Pour installer la dernière version manuellement, récupérez le .deb depuis la page des releases GitHub :
# Exemple pour la version 14.1.1
curl -LO https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep_14.1.1-1_amd64.deb
sudo dpkg -i ripgrep_14.1.1-1_amd64.deb
macOS
brew install ripgrep
Windows
# Scoop
scoop install ripgrep
# Chocolatey
choco install ripgrep
# Winget
winget install BurntSushi.ripgrep.MSVC
# Cargo (si Rust installé)
cargo install ripgrep
Vérification :
rg --version
Les essentiels
Recherche de base
rg pattern # Recherche récursive depuis le répertoire courant
rg pattern path/ # Recherche dans un répertoire spécifique
rg pattern fichier.txt # Recherche dans un fichier
Sortie typique :
src/utils.py
42: # TODO: refactor this function
68: # TODO: add error handling
src/api/routes.py
12: # TODO: implement authentication
Différences clés avec grep :
rgest récursif par défaut (pas besoin de-r)rgignore automatiquement.gitignore, fichiers binaires,.git,node_modules- Les couleurs sont activées par défaut
Casse et mots
rg -i pattern # Insensible à la casse
rg -S pattern # Smart case : insensible si pattern en minuscules,
# sensible dès qu'il y a une majuscule
rg -w test # Mots entiers ("test" mais pas "testing" ni "contest")
rg -v pattern # Inverser : lignes NE contenant PAS pattern
rg -F 'foo(bar)' # Recherche littérale (pas de regex)
-S (smart case) est probablement l’option la plus pratique au quotidien. rg -S todo trouvera “TODO”, “Todo”, “todo”, mais rg -S TODO ne trouvera que “TODO”.
Filtrer par type de fichier
# Uniquement les fichiers Python
rg TODO -t py
# JavaScript et TypeScript
rg TODO -t js -t ts
# Exclure les fichiers Markdown
rg TODO -T md
# Lister les types disponibles
rg --type-list
Types courants : py, js, ts, java, go, rust, c, cpp, md, html, css, json, yaml
Contexte (lignes avant/après)
rg -C 3 TODO # 3 lignes avant et après
rg -B 2 TODO # 2 lignes avant
rg -A 5 TODO # 5 lignes après
Sortie avec contexte :
src/utils.py
39-def process_data(data):
40- """Process incoming data."""
41- validate(data)
42: # TODO: refactor this function
43- result = transform(data)
44- return result
45-
Contrôle de la sortie
rg -l pattern # Uniquement les noms de fichiers
rg -L pattern # Fichiers SANS correspondance
rg -c pattern # Nombre de lignes matchant par fichier
rg --count-matches pattern # Nombre total d'occurrences par fichier
rg -o pattern # Uniquement la partie qui matche
rg --no-line-number pattern # Masquer les numéros de ligne
rg --no-filename pattern # Masquer les noms de fichiers
15 cas pratiques
1) Trouver tous les TODOs et FIXMEs d’un projet
rg 'TODO|FIXME|HACK|XXX' -C 1
Ajoutez -t py ou -t js pour cibler un langage spécifique.
2) Chercher une définition de fonction ou de classe
# Définition Python
rg 'def calculate_total'
# Classe Java
rg 'class UserService'
# Interface TypeScript
rg 'interface UserProps \{'
3) Détecter des secrets en dur dans le code
# Mots de passe en dur
rg -i 'password\s*=\s*["\047][^"\047]{3,}'
# Clés API / tokens suspects
rg -S 'api_key|apiKey|API_KEY|secret_key|access_token' -t py -t js -t ts
Utile en revue de code ou avant un commit, pour éviter de pousser des credentials.
4) Chercher dans des logs ou la sortie d’une commande
# Filtrer les erreurs dans un fichier de log
rg 'ERROR|WARN' /var/log/app.log
# Piping depuis une autre commande
docker logs mon-container 2>&1 | rg 'timeout|connection refused'
# Filtrer la sortie de kubectl
kubectl get pods -A | rg 'CrashLoop|Error'
rg lit stdin quand il ne reçoit pas de fichier en argument, ce qui le rend utilisable partout où vous utiliseriez grep dans un pipe.
5) Chercher des imports et dépendances
# Qui importe ce module Python ?
rg '^from utils import|^import utils'
# Require Node.js
rg "require\(['\"]express"
# Imports Go
rg '"github\.com/.*"' -t go
6) Compter les occurrences dans un projet
# Nombre de lignes contenant "error" par fichier
rg error -c
# Total d'occurrences (pas de lignes) par fichier
rg error --count-matches
# Compter dans tout le projet
rg error --count-matches | awk -F: '{sum+=$NF} END {print sum}'
7) Filtrer par glob / exclure des fichiers
# Uniquement les fichiers .env
rg DATABASE_URL -g '*.env'
# Tous les fichiers sauf les minifiés
rg pattern -g '!*.min.js' -g '!*.min.css'
# Fichiers de config uniquement
rg pattern -g '*.{yaml,yml,json,toml}'
8) Prévisualiser un remplacement
# Voir le résultat d'un remplacement (sans modifier les fichiers)
rg 'old_function' -r 'new_function'
# Avec capture groups
rg 'log\((\w+)\)' -r 'logger.info($1)'
# Appliquer avec sed une fois satisfait
rg -l 'old_function' | xargs sed -i 's/old_function/new_function/g'
rg -rne modifie jamais les fichiers, il affiche juste la sortie transformée. Utilisezsedou votre éditeur pour appliquer.
9) Recherche multi-ligne
# Activer le mode multiline avec -U
rg -U 'try:.*?except' -t py
# Trouver des fonctions vides en JavaScript
rg -U 'function \w+\([^)]*\)\s*\{\s*\}' -t js
Le flag -U permet au . de matcher les retours à la ligne.
10) Regex avancées avec PCRE2
# Activer le moteur PCRE2 (lookahead, lookbehind, backreferences)
rg -P '(?<=def )\w+(?=\()' -t py # Noms de fonctions Python (lookbehind/lookahead)
# Lignes contenant "error" mais PAS "404"
rg -P 'error(?!.*404)'
# Backreference : mots doublés
rg -P '\b(\w+)\s+\1\b'
-Pnécessite queripgrepsoit compilé avec le support PCRE2 (c’est le cas sur la plupart des distributions).
11) Exclure des répertoires
# Exclure les dossiers de test
rg pattern -g '!**/test/**' -g '!**/tests/**' -g '!**/__tests__/**'
# Exclure vendor et build
rg pattern -g '!vendor' -g '!build' -g '!dist'
Note : node_modules et .git sont déjà exclus par défaut via .gitignore.
12) Chercher dans les fichiers cachés et ignorés
# Inclure les fichiers cachés (.dotfiles)
rg pattern --hidden
# Ignorer .gitignore (chercher partout, y compris node_modules)
rg pattern --no-ignore
# Les deux combinés
rg pattern --hidden --no-ignore
Utile pour chercher dans .env, .github/, ou d’autres fichiers cachés.
13) Sortie JSON pour les scripts
# Sortie JSON structurée
rg TODO --json
# Exploitable avec jq
rg TODO --json | jq 'select(.type == "match") | .data.path.text'
La sortie --json donne un objet par ligne, avec le chemin, le numéro de ligne, et le contenu. Idéal pour intégrer rg dans des pipelines de CI ou des scripts d’analyse.
14) Statistiques rapides sur le code
# Nombre de fichiers Python dans le projet
rg --files -t py | wc -l
# Nombre de fonctions Python
rg '^def \w+' -t py -c | awk -F: '{sum+=$NF} END {print sum}'
# Nombre de classes Java
rg 'class \w+' -t java -c | awk -F: '{sum+=$NF} END {print sum}'
15) Utiliser un fichier d’exclusion personnalisé
# Respecter .gitignore (par défaut)
rg pattern
# Utiliser un fichier d'exclusion dédié
rg pattern --ignore-file .rgignore
# Ignorer le fichier de config ripgrep
rg pattern --no-config
Exemple de .rgignore à placer à la racine de votre projet :
*.log
*.tmp
*.min.js
*.min.css
build/
dist/
coverage/
Options essentielles (référence rapide)
Comportement de recherche
| Option | Description |
|---|---|
-i, --ignore-case |
Insensible à la casse |
-S, --smart-case |
Insensible si minuscules, sensible si majuscule dans le pattern |
-w, --word-regexp |
Mots entiers uniquement |
-v, --invert-match |
Lignes NE contenant PAS le pattern |
-U, --multiline |
Recherche multi-lignes |
-P, --pcre2 |
Moteur PCRE2 (lookahead, lookbehind) |
-F, --fixed-strings |
Recherche littérale (pas de regex) |
Contexte et sortie
| Option | Description |
|---|---|
-C NUM |
NUM lignes avant et après |
-B NUM |
NUM lignes avant |
-A NUM |
NUM lignes après |
-l |
Uniquement noms de fichiers |
-c |
Nombre de lignes par fichier |
--count-matches |
Nombre d’occurrences par fichier |
-o |
Uniquement la partie qui matche |
-r TEXTE |
Prévisualiser un remplacement |
--json |
Sortie JSON structurée |
Filtrage de fichiers
| Option | Description |
|---|---|
-t TYPE |
Type de fichier (py, js, etc.) |
-T TYPE |
Exclure un type |
-g GLOB |
Pattern de fichier (ex: *.py) |
-g '!GLOB' |
Exclure un pattern |
--hidden |
Inclure les fichiers cachés |
--no-ignore |
Ignorer .gitignore |
--ignore-file |
Fichier d’exclusion personnalisé |
Performance
| Option | Description |
|---|---|
-j NUM |
Nombre de threads (auto par défaut) |
--no-binary |
Ignorer les fichiers binaires (défaut) |
Configuration personnalisée
Fichier de config
Créez ~/.config/ripgrep/config (ou ~/.ripgreprc avec export RIPGREP_CONFIG_PATH=~/.ripgreprc) :
# ~/.ripgreprc
# Smart case par défaut
--smart-case
# Toujours afficher 2 lignes de contexte
--context=2
# Ignorer les fichiers minifiés
--glob=!*.min.js
--glob=!*.min.css
# Inclure les fichiers cachés
--hidden
# Mais toujours exclure .git
--glob=!.git
Types de fichiers personnalisés
# Ajouter un type "web" (html, css, js)
rg pattern --type-add 'web:*.{html,css,js}' -t web
# Type pour fichiers de config
rg pattern --type-add 'config:*.{yaml,yml,json,toml,ini}' -t config
Ajoutez dans ~/.ripgreprc pour les rendre permanents :
--type-add=web:*.{html,css,js}
--type-add=config:*.{yaml,yml,json,toml,ini}
Aliases utiles
Ajoutez à votre ~/.bashrc ou ~/.zshrc :
# Recherche dans le code uniquement (ignore tests)
alias rgs='rg -g "!**/test/**" -g "!**/tests/**" -g "!**/__tests__/**"'
# Recherche TODO/FIXME rapide
alias todos='rg "TODO|FIXME|HACK|XXX" -C 1'
# Recherche avec fzf interactif
rgf() {
rg --line-number --no-heading --color=always "$@" | fzf --ansi --preview 'echo {}'
}
Intégration avec d’autres outils
Avec fzf (fuzzy finder)
# Recherche interactive de fichiers
rg --files | fzf
# Recherche interactive dans le contenu avec prévisualisation
rg --line-number --no-heading --color=always "" | fzf --ansi \
--preview 'bat --color=always {1} --highlight-line {2}' \
--delimiter ':'
Avec vim/neovim
" .vimrc / init.vim
" Utiliser rg comme grepprg
set grepprg=rg\ --vimgrep\ --smart-case
set grepformat=%f:%l:%c:%m
" Raccourci pour chercher le mot sous le curseur
nnoremap <leader>g :grep <C-R><C-W><CR>
Avec VS Code
VS Code utilise déjà ripgrep en interne pour sa recherche. Pour personnaliser :
{
"search.useRipgrep": true,
"search.ripgrep.args": [
"--hidden",
"--glob=!.git"
]
}
Avec git
# Chercher un pattern dans les fichiers modifiés (non commités)
rg pattern $(git diff --name-only)
# Chercher un pattern dans les fichiers d'un commit
git show --name-only HEAD | tail -n +7 | xargs rg pattern
# Pour chercher dans l'historique git (contenu supprimé), utilisez git log :
git log -S "old_function" --source --all --oneline
Comparaison avec les alternatives
| Outil | Usage | Verdict |
|---|---|---|
rg |
Recherche rapide dans le code | Le meilleur choix général |
grep |
Recherche basique | Scripts POSIX, systèmes sans rg |
ag (silver searcher) |
Recherche dans le code | Correct mais plus lent que rg |
ack |
Recherche Perl-like | Legacy, préférer rg |
Conclusion
ripgrep remplace avantageusement grep pour toute recherche dans du code. Ses points forts : la vitesse, le respect automatique de .gitignore, et le smart case. Une fois installé, il n’y a quasiment aucune raison de revenir à grep pour chercher dans un projet.
Les options à retenir en priorité :
rg pattern: recherche récursive intelligente-S: smart case (à mettre dans votre config)-t TYPE: filtrer par type de fichier-C NUM: contexte avant/après-P: regex avancées (lookahead, lookbehind)--json: sortie structurée pour les scripts