ripgrep (rg): Busca Rapida em Codigo
O que e ripgrep (rg)?
Conclusao: ripgrep e uma alternativa extremamente rapida ao grep escrita em Rust.
rg patternbusca no diretorio atual recursivamente e respeita.gitignorepara pular ruido. O binario se chamarg.
ripgrep foi criado para buscar em bases de codigo. A tarefa "buscar em todo um diretorio" que voce costumava especificar como grep -rn se torna o comportamento padrao, sem flags extras necessarias.
A primeira linha para memorizar
rg TODO
Isso busca no diretorio atual recursivamente e automaticamente pula .git/ e artefatos de build (qualquer coisa listada em .gitignore).
Premissas (ambiente alvo)
- SO: Ubuntu / familia Debian (nomes de pacotes sao quase identicos em outras distros)
- O binario e
rg(o pacote eripgrep)
Por que e mais rapido que o grep?
Conclusao: Tres fatores se somam: o motor de regex rapido do Rust, busca paralela entre arquivos e reducao do conjunto de busca antecipadamente via
.gitignoree deteccao de binarios.
O motivo principal nao e apenas a linguagem de implementacao -- e que ripgrep busca em menos arquivos. grep -r percorre diligentemente .git/ e node_modules/, enquanto ripgrep os exclui do conjunto de candidatos desde o inicio.
| Recurso | grep | ripgrep |
|---|---|---|
| Busca recursiva | precisa -r |
padrao |
Respeita .gitignore |
nao | sim (padrao) |
| Arquivos binarios | escaneados | pulados automaticamente |
| Paralelismo | nenhum | sim |
| Numeros de linha | precisa -n |
padrao no terminal |
O valor na pratica nao e apenas "rapido" mas "saida limpa por padrao." Os resultados nao ficam enterrados em ruido.
Como instalar?
Conclusao: No Ubuntu/Debian use
apt install ripgrep. Se a versao 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 instalacao:
rg --version
ripgrep 14.1.0 -SIMD -AVX (compiled) +SIMD +AVX (runtime)
A versao apt em Ubuntu antigo (ex. 18.04) e desatualizada e traz menos tipos -t. Para os recursos mais recentes, prefira o .deb do GitHub Releases.
Como executar uma busca basica?
Conclusao:
rg patterne a forma base. Use-ipara ignorar maiusculas/minusculas,-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 padrao os resultados mostram o nome do arquivo, numero da linha e a linha correspondente, tudo colorizado.
src/main.rs 12: let config = load_config(); 48: config.reload();
rg -F e util quando voce quer encontrar uma string contendo . ou * (numeros de versao, exemplos de regex) literalmente. Nenhum escape necessario.
Como filtrar por tipo de arquivo?
Conclusao: Use
-t TIPOpara um grupo de linguagem/extensao, e-g 'glob'para um padrao arbitrario. Executerg --type-listpara ver os tipos disponiveis.
# 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 disponiveis:
rg --type-list | head
agda: *.agda, *.lagda asciidoc: *.adoc, *.asc, *.asciidoc asm: *.S, *.a51, *.asm, *.s ...
Minusculo -t significa "incluir", maiusculo -T significa "excluir". Mnemonica: T para excluir (ele nega o tipo).
Como mostrar linhas ao redor de uma correspondencia?
Conclusao: Use
-A N(apos),-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 saida:
# 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 ... e poderoso: passa apenas os arquivos com resultados para um comando seguinte.
Quero buscar em arquivos ignorados pelo .gitignore
Conclusao: Use
--hiddenpara arquivos ocultos,-u(--unrestricted) para ignorar.gitignore,-uupara ambos e-uuupara buscar tudo incluindo binarios.
ripgrep padrao faz uma busca "limpa", mas as vezes voce 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 conteudo de .git/ e binarios, entao e mais lento e ruidoso. A regra pratica: comece com o padrao, depois adicione um -u por vez apenas conforme necessario.
Ele pode substituir texto?
Conclusao:
-rvisualiza a saida substituida. Ele nao 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 e apenas para confirmacao. O padrao seguro e 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 e uma operacao destrutiva. Sempre confirme a lista de arquivos com rg -l antes de executar.
Referencia rapida para migrar do grep
Conclusao: Na maioria dos casos voce pode trocar
grep -rnporrge funciona. Aprenda filtragem por tipo e exibicao de contexto e suas buscas diarias vivem inteiramente no ripgrep.
| O que voce quer | grep | ripgrep |
|---|---|---|
| Busca recursiva em diretorio | grep -rn pat . |
rg pat |
| Ignorar maiusculas/minusculas | 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 extensao | grep -r --include='*.py' |
rg -t py pat |
| Contexto ao redor | grep -C 3 pat |
rg -C 3 pat |
Copiar e colar: padroes que voce usara 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'