# grep, ripgrep e mgrep: qual busca seus Agents deveriam usar (e por que eu fico com o ripgrep)

> Comparei grep, ripgrep e mgrep para uso em Agents de IA: bônus, ônus e por que o ripgrep, que o Claude Code usa por baixo dos panos, segue como meu padrão.

- URL: https://iagofrota.com.br/blog/grep-ripgrep-mgrep-agents/
- Data: 2026-07-11
- Tags: grep, ripgrep, mgrep, agents, cli

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.

```bash
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ã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?
