Pôster de terminal escuro comparando grep, ripgrep e mgrep, com ripgrep em destaque laranja e a marca 'default'.
Pôster de terminal escuro comparando grep, ripgrep e mgrep, com ripgrep em destaque laranja e a marca 'default'.

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.

Iago Frota
ferramentas

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, varre node_modules, .git e 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 .gitignore por padrão. Nada de varrer node_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.

Terminal window
npm install -g @mixedbread/mgrep
mgrep login
cd meu-repo
mgrep watch # indexa e fica sincronizando
mgrep "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 watch roda 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 mgrep com grep.” 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ãogrepripgrepmgrep
Tipo de buscaexata (regex)exata (regex)semântica
Velocidade em base grandelentarápidadepende do índice
Respeita .gitignorenãosimsim
Precisa instalarnãosimsim
Funciona offline / localsimsimnão (nuvem)
Pergunta em linguagem naturalnãonãosim
Refactor / símbolo em base grandeokbom (lexical)fraco
Já embutido no Claude Codesimnã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?