grep, ripgrep e mgrep: qual busca seus Agents deveriam usar (e por que eu fico com o ripgrep)
Comparei grep, ripgrep e mgrep pensando no uso dentro de Agents de IA. Bônus, ônus e por que o ripgrep — que o próprio Claude Code já usa por baixo dos panos — segue sendo meu padrão.
Há um tempo venho colocando Agents de IA para trabalhar dentro de repositórios de verdade — código legado, milhares de arquivos, aquele monorepo que ninguém quer abrir. E toda vez esbarro no mesmo gargalo: antes de o Agent editar qualquer coisa, ele precisa encontrar o que vai editar.
Parece detalhe. Não é. A ferramenta de busca que o Agent usa define quão rápido ele responde, quantos tokens ele queima e — o mais importante — se ele acha o trecho certo ou o trecho quase certo. Então resolvi comparar três: o grep de sempre, o ripgrep e o mgrep, esse carinha novo da mixedbread que faz busca semântica.
Bora lá.
grep: o veterano que está em toda máquina
O grep é o padrão POSIX. Está instalado em qualquer Unix, funciona offline, não depende de nada. Você joga um regex, ele varre linha por linha e devolve o que casou.
Bônus:
- Ubiquidade. Não precisa instalar. Se é uma máquina Linux, tem
grep. - Previsibilidade. Regex é regex. O comportamento é conhecido há décadas.
- Zero setup. Nenhum índice, nenhum daemon, nenhum login.
Ônus:
- Lento em base grande. Ele não pula o que não interessa. Com
-r, varrenode_modules,.gite afins sem dó. - Não respeita
.gitignore. Você acaba filtrando na mão com--exclude-dir. - Busca lexical, não semântica. Ele casa o que você descreve por regex, mas não entende intenção: se você não sabe como aquilo foi nomeado, o regex chuta no escuro.
Para um Agent, o problema é o segundo ponto: sem filtro de .gitignore, ele traz lixo. E lixo no contexto é token desperdiçado.
ripgrep: o padrão silencioso (inclusive do Claude Code)
O ripgrep (comando rg) é um buscador em Rust no espírito do grep — não é um port do código dele, é ferramenta própria —, com paralelismo e uma decisão de design que muda tudo no dia a dia: por padrão, ele ignora o que o .gitignore ignora. Ou seja, ele só olha o que importa.
Bônus:
- Rápido de verdade. Paralelo, com autômato de regex otimizado. Em repositório grande a diferença é gritante.
- Respeita
.gitignorepor padrão. Nada de varrernode_modules. Menos ruído, menos token. - Continua sendo exato. Regex, localizar ocorrências de um símbolo, dar suporte a refactor — o que você precisa quando quer o local certo, não o parecido.
E aqui vem a parte que me fez confiar de vez: o Claude Code já usa ripgrep por baixo dos panos. A ferramenta Grep dele é construída sobre o rg — e dá para confirmar no próprio binário instalado (v2.1.206): as strings ripgrep e RIPGREP_CONFIG_PATH estão lá. Ou seja: a Anthropic tomou a mesma decisão que eu tomaria no terminal.
Ônus:
- Precisa instalar (embora venha embutido em várias ferramentas, como o próprio Claude Code).
- Continua sendo busca lexical. Ele acha o texto, não a ideia. “Onde a gente configura autenticação?” não é uma query para o
rg.
mgrep: quando você não sabe a palavra exata
O mgrep, da mixedbread, resolve justamente esse último ponto. Ele é busca semântica: indexa seus arquivos — código, texto, PDF, imagem — num store vetorial e deixa você perguntar em linguagem natural.
npm install -g @mixedbread/mgrepmgrep logincd meu-repomgrep watch # indexa e fica sincronizandomgrep "onde a gente configura autenticação?" src/Note a query: não é um regex, é uma pergunta. Isso, para um Agent, é sedutor. O benchmark deles afirma ~2x menos tokens que fluxos baseados em grep, com qualidade igual ou melhor no julgamento por LLM.
Bônus:
- Entende intenção. Acha o conceito mesmo sem a palavra exata.
- Multimodal. Vai além de código — PDF, imagem, e por aí.
- Economia de token. O reranking (ligado por padrão) devolve menos resultado e mais relevante.
Ônus — e aqui preciso ser honesto:
- Não é local. Ele sincroniza seus arquivos para um store na nuvem da mixedbread. Isso exige login (ou
MXBAI_API_KEY) e, dependendo do seu código, é um “não” imediato por compliance. - Tem índice para manter.
mgrep watchroda um processo em background. Índice desatualizado é resposta errada. - Limites por padrão. 1MB por arquivo, 1.000 arquivos por diretório.
- É complemento, não substituto. A própria doc diz: “a melhor busca de código combina
mgrepcomgrep.” Para localizar símbolo, dar suporte a refactor e rodar regex, você volta para o exato.
Minha experiência com ele ainda é curta — estou avaliando, não rodei meses em produção. Então trato o que digo aqui como primeira impressão honesta, não como veredito.
Comparando de frente
| Dimensão | grep | ripgrep | mgrep |
|---|---|---|---|
| Tipo de busca | exata (regex) | exata (regex) | semântica |
| Velocidade em base grande | lenta | rápida | depende do índice |
Respeita .gitignore | não | sim | sim |
| Precisa instalar | não | sim | sim |
| Funciona offline / local | sim | sim | não (nuvem) |
| Pergunta em linguagem natural | não | não | sim |
| Refactor / símbolo em base grande | ok | bom (lexical) | fraco |
| Já embutido no Claude Code | — | sim | não |
Por que, para Agent, eu fico com o ripgrep
Um Agent trabalha por iteração: busca, lê, edita, testa, repete. Nesse ciclo, o que mais importa é acertar o trecho certo, não o quase certo. Quando o Agent procura getUserById, ele quer aquela ocorrência exata — e o rg devolve o texto certo, que é o mais perto de uma garantia que dá para ter sem um LSP.
E o token? Foi um dos critérios que abri lá em cima, então preciso ser honesto: no token puro, o mgrep pode até levar vantagem — o benchmark deles sugere isso. Mas repare no que esse benchmark mede: relevância julgada por LLM, não acerto determinístico de símbolo. E é o acerto determinístico que um refactor exige. Um resultado semanticamente “próximo” que manda o Agent editar o arquivo errado custa muito mais token — e mais confiança — do que um rg que devolve exatamente a linha certa. Por isso fico com precisão.
Some a isso o fato de o ripgrep respeitar .gitignore, ser rápido e já vir pronto no Claude Code, e você tem o padrão certo para a maior parte do que um Agent faz num repositório: navegar, localizar, editar com cirurgia.
O mgrep entra na parte que sobra — e é uma parte real. Quando o Agent (ou você) chega num código que não conhece e precisa perguntar “onde isso acontece?” em vez de “qual é o nome disso?”, a busca semântica ganha. É o momento de exploração, não o de precisão. Não é ou-um-ou-outro: é rg para o bisturi, mgrep para a bússola.
Por fim
Se eu tivesse que configurar um Agent hoje para mexer num repositório sério, deixaria o ripgrep como busca padrão — que é, aliás, o que o Claude Code já faz por mim — e plugaria o mgrep como ferramenta secundária, para as perguntas exploratórias em que eu não sei a palavra exata. O grep puro eu guardo para a máquina crua onde não dá para instalar nada.
No fim do dia, a pergunta não é “qual é a melhor busca?”, e sim “que tipo de pergunta o Agent está fazendo agora?”. Match exato pede rg. Intenção pede mgrep. E saber a diferença é o que separa um Agent que acha do Agent que quase acha.
E você, já colocou seus Agents para buscar com semântica ou ainda está no bom e velho match exato?