ripgrep (rg): Busca Rápida em Código
O que é ripgrep (rg)?
Conclusão: ripgrep é uma alternativa extremamente rápida ao grep escrita em Rust.
rg patternbusca no diretório atual recursivamente e respeita.gitignorepara pular ruído. O binário se chamarg.
ripgrep foi criado para buscar em bases de código. A tarefa "buscar em todo um diretório" que você costumava especificar como grep -rn se torna o comportamento padrão, sem flags extras necessárias.
A primeira linha para memorizar
rg TODO
Isso busca no diretório atual recursivamente e automaticamente pula .git/ e artefatos de build (qualquer coisa listada em .gitignore).
Premissas (ambiente alvo)
- SO: Ubuntu / família Debian (nomes de pacotes são quase idênticos em outras distros)
- O binário é
rg(o pacote éripgrep)
Por que é mais rápido que o grep?
Conclusão: Três fatores se somam: o motor de regex rápido do Rust, busca paralela entre arquivos e redução do conjunto de busca antecipadamente via
.gitignoree detecção de binários.
O motivo principal não é apenas a linguagem de implementação -- é que ripgrep busca em menos arquivos. grep -r percorre diligentemente .git/ e node_modules/, enquanto ripgrep os exclui do conjunto de candidatos desde o início.
| Recurso | grep | ripgrep |
|---|---|---|
| Busca recursiva | precisa -r |
padrão |
Respeita .gitignore |
não | sim (padrão) |
| Arquivos binários | escaneados | pulados automaticamente |
| Paralelismo | nenhum | sim |
| Números de linha | precisa -n |
padrão no terminal |
O valor na prática não é apenas "rápido" mas "saída limpa por padrão." Os resultados não ficam enterrados em ruído.
Como instalar?
Conclusão: No Ubuntu/Debian use
apt install ripgrep. Se a versão empacotada for antiga, pegue o.debdo GitHub Releases ou usecargo install ripgrep.
# Ubuntu / Debian sudo apt install ripgrep # Fedora / familia RHEL sudo dnf install ripgrep # macOS (Homebrew) brew install ripgrep # Se voce tem um toolchain Rust cargo install ripgrep
Verifique a instalação:
rg --version
ripgrep 14.1.0 -SIMD -AVX (compiled) +SIMD +AVX (runtime)
A versão apt em Ubuntu antigo (ex. 18.04) é desatualizada e traz menos tipos -t. Para os recursos mais recentes, prefira o .deb do GitHub Releases.
Como executar uma busca básica?
Conclusão:
rg patterné a forma base. Use-ipara ignorar maiúsculas/minúsculas,-wpara corresponder palavras inteiras e-Fpara buscar uma string fixa (desabilitando regex).
# Buscar na arvore atual por "config"
rg config
# Ignorar maiusculas/minusculas
rg -i config
# Palavra inteira ("configure" nao vai corresponder)
rg -w config
# Tratar como string literal, nao regex
rg -F "a.b.c"Por padrão os resultados mostram o nome do arquivo, número da linha e a linha correspondente, tudo colorizado.
src/main.rs 12: let config = load_config(); 48: config.reload();
rg -F é útil quando você quer encontrar uma string contendo . ou * (números de versão, exemplos de regex) literalmente. Nenhum escape necessário.
Como filtrar por tipo de arquivo?
Conclusão: Use
-t TIPOpara um grupo de linguagem/extensão, e-g 'glob'para um padrão arbitrário. Executerg --type-listpara ver os tipos disponíveis.
# Buscar apenas em arquivos Python rg -t py "import requests" # Excluir JavaScript / TypeScript rg -T js "function" # Alvejar uma extensao diretamente com um glob rg -g '*.md' "TODO" # Multiplos globs (! exclui) rg -g '*.rs' -g '!target/*' "unsafe"
Listar os tipos disponíveis:
rg --type-list | head
agda: *.agda, *.lagda asciidoc: *.adoc, *.asc, *.asciidoc asm: *.S, *.a51, *.asm, *.s ...
Minúsculo -t significa "incluir", maiúsculo -T significa "excluir". Mnemônica: T para excluir (ele nega o tipo).
Como mostrar linhas ao redor de uma correspondência?
Conclusão: Use
-A N(após),-B N(antes) e-C N(ambos) para imprimir linhas de contexto. Essencial ao ler ao redor de um erro em logs.
# Tambem mostrar 3 linhas apos a correspondencia rg -A 3 "panic" # Tambem mostrar 2 linhas antes da correspondencia rg -B 2 "Exception" # 3 linhas de cada lado (o mais usado) rg -C 3 "Traceback"
Outros controles de saída:
# Apenas os nomes dos arquivos correspondentes (quando voce quer uma lista) rg -l "deprecated" # Apenas a contagem de correspondencias rg -c "TODO" # Extrair apenas a parte correspondente rg -o 'https?://[^ ]+'
rg -l pattern | xargs ... é poderoso: passa apenas os arquivos com resultados para um comando seguinte.
Quero buscar em arquivos ignorados pelo .gitignore
Conclusão: Use
--hiddenpara arquivos ocultos,-u(--unrestricted) para ignorar.gitignore,-uupara ambos e-uuupara buscar tudo incluindo binários.
ripgrep padrão faz uma busca "limpa", mas às vezes você precisa olhar dentro de logs, .env ou node_modules. Remova os filtros em etapas.
# Incluir arquivos ocultos (.env, etc.) rg --hidden "API_KEY" # Ignorar .gitignore (buscar node_modules e similares) rg -u "lodash" # Arquivos ocultos + ignorar .gitignore rg -uu "TODO" # Tudo, incluindo binarios rg -uuu "magic_bytes"
-uuu escaneia o conteúdo de .git/ e binários, então é mais lento e ruidoso. A regra prática: comece com o padrão, depois adicione um -u por vez apenas conforme necessário.
Ele pode substituir texto?
Conclusão:
-rvisualiza a saída substituída. Ele não modifica arquivos (apenas stdout). Para reescrever arquivos reais, combine com algo comosed -i.
# Mostrar o resultado de substituir foo por bar (arquivos inalterados) rg 'foo' -r 'bar' # Visualizacao de substituicao usando grupos de captura rg '(\w+)@(\w+)' -r '$2.$1'
rg -r é apenas para confirmação. O padrão seguro é revisar o resultado, depois reescrever com sed.
# Confirmar alvos e substituicoes com rg primeiro, depois sed -i 's/foo/bar/g' $(rg -l 'foo')
sed -i é uma operação destrutiva. Sempre confirme a lista de arquivos com rg -l antes de executar.
Referência rápida para migrar do grep
Conclusão: Na maioria dos casos você pode trocar
grep -rnporrge funciona. Aprenda filtragem por tipo e exibição de contexto e suas buscas diárias vivem inteiramente no ripgrep.
| O que você quer | grep | ripgrep |
|---|---|---|
| Busca recursiva em diretório | grep -rn pat . |
rg pat |
| Ignorar maiúsculas/minúsculas | grep -i pat |
rg -i pat |
| Busca de string fixa | grep -F str |
rg -F str |
| Apenas nomes de arquivos | grep -rl pat . |
rg -l pat |
| Filtrar por extensão | grep -r --include='*.py' |
rg -t py pat |
| Contexto ao redor | grep -C 3 pat |
rg -C 3 pat |
Copiar e colar: padrões que você usará muito
# Listar todo TODO no projeto rg -n 'TODO|FIXME' # Encontrar sites de erro apenas em Python, com contexto rg -t py -C 3 'raise ' # Verificar segredos vazados, incluindo arquivos ocultos rg --hidden -g '!.git/*' 'API_KEY|SECRET'