Gerador de comandos grep e ripgrep

Monte buscas com grep e ripgrep, com inclusão, exclusão e contexto.

Sobre esta ferramenta

Defina o padrão, onde procurar, quais arquivos e pastas incluir ou ignorar e o que mostrar (linhas com contexto, só as correspondências, contagens ou nomes de arquivos). Obtenha os comandos GNU grep e ripgrep correspondentes com cada flag explicada e teste o padrão em um texto de exemplo direto na página.

Como usar

  1. Digite o que procurar. Várias linhas viram vários padrões, e qualquer um deles pode corresponder.
  2. Escolha a sintaxe regex, básica, texto simples ou Perl, e opções como ignorar maiúsculas e minúsculas ou palavras inteiras.
  3. Defina onde pesquisar e quais arquivos e pastas incluir ou ignorar.
  4. Escolha o que mostrar, teste o padrão em um texto de exemplo e copie o comando grep ou ripgrep.

Perguntas

Como pesquiso recursivamente, mas pulando algumas pastas?
Adicione --exclude-dir para cada pasta, por exemplo grep -r --exclude-dir=.git --exclude-dir=vendor pattern . Com o ripgrep, tudo o que está no .gitignore é ignorado automaticamente, e -g '!folder/' ignora mais pastas.
Como pesquiso só determinados tipos de arquivo?
Com o grep, adicione --include='*.log' (entre aspas, para que o shell não expanda o asterisco). Com o ripgrep, use -g '*.log' ou um tipo embutido como -t py ou -t java.
Qual é a diferença entre grep -E e o grep simples?
O grep simples usa expressões regulares básicas, em que + ? | ( ) são caracteres comuns, a menos que sejam escapados com barra invertida. -E muda para a sintaxe estendida, em que eles funcionam como operadores, como na maioria das linguagens de programação.
Devo usar grep ou ripgrep?
O ripgrep (rg) é muito mais rápido em projetos grandes, pesquisa recursivamente por padrão e respeita o .gitignore. O grep vem instalado em todo sistema Unix, o que importa em servidores e scripts.
Como mostro as linhas ao redor de cada correspondência?
Use -C 3 para três linhas de contexto dos dois lados, ou -B e -A para antes e depois separadamente. A pré-visualização aqui mostra as mesmas linhas de contexto.
Como usar o grep com um padrão que começa com hífen?
O grep o leria como uma opção. Coloque -e na frente, como em grep -e "-v" notes.txt, ou encerre as opções com dois hifens: grep -- "-v" notes.txt. A ferramenta adiciona -e automaticamente sempre que um padrão começa com hífen.
Como pesquisar dentro de arquivos de log .gz compactados?
O grep simples só vê bytes compactados, e é por isso que *.gz é excluído por padrão aqui. Use o zgrep, que aceita a maioria das opções do grep, por exemplo zgrep -i "timeout" /var/log/app.log.2.gz. Para uma pasta inteira de logs rotacionados, zgrep -i timeout /var/log/app.log* pesquisa arquivos simples e compactados juntos.
Como contar as correspondências em vez das linhas que correspondem?
grep -c conta linhas, então uma linha com três correspondências conta uma vez. Para contar cada ocorrência, imprima cada correspondência em uma linha própria e conte essas linhas: grep -o "error" app.log | wc -l. Adicione -i nas duas contagens se as maiúsculas e minúsculas variarem.

Como usar o grep para buscar várias palavras

Para encontrar linhas que contenham qualquer uma de várias palavras, use a sintaxe estendida: grep -E "error|warn" app.log. O mesmo funciona com um -e por padrão, grep -e error -e warn app.log, que é o que você obtém aqui ao digitar cada padrão em uma linha própria. Na sintaxe básica você precisaria de error\|warn, uma extensão GNU que o BSD grep do macOS pode não aceitar.

O grep não tem operador AND. Para encontrar linhas que contenham as duas palavras em qualquer ordem, encadeie uma busca na outra com pipe: grep -i payment app.log | grep -i timeout. No GNU grep, -P suporta lookaheads, como em grep -P "^(?=.*payment)(?=.*timeout)", mas o -P não existe no grep padrão do macOS. Para encontrar arquivos, e não linhas, que contenham as duas palavras, encadeie grep -rl com xargs.

Por que o grep não encontra nada?

Primeiro confira as aspas. Sem aspas, o shell expande * e $ antes de o grep ver o padrão, então sempre o envolva em aspas duplas, ou em aspas simples quando ele contiver $. Depois confira a sintaxe: no grep simples, + ? e | são caracteres comuns, a menos que você adicione -E. E um ponto corresponde a qualquer caractere, então procure um número de versão literal com grep -F "1.2.3".

Arquivos com quebras de linha do Windows quebram padrões ancorados com $, porque cada linha termina com um carriage return invisível. Corresponda a ele com grep -P "foo\r?$" ou converta o arquivo antes com dos2unix. Se o grep exibir “binary file matches”, ele encontrou um byte NUL; adicione -a para pesquisar o arquivo como texto. Teste o padrão em um texto de exemplo aqui, ou no Testador de regex, antes de rodá-lo em arquivos reais.

Equivalentes no ripgrep das flags comuns do grep

A maioria das flags é igual nos dois: -i, -w, -v, -c, -l, -o, -m e as opções de contexto -A, -B e -C. As diferenças é que pegam as pessoas. O ripgrep mostra números de linha por padrão no terminal, então -N os esconde. Para esconder os nomes de arquivo, o grep usa -h, mas o ripgrep usa -I, e no grep -I significa ignorar arquivos binários. Para seguir links simbólicos, o grep usa -R e o ripgrep usa -L.

O ripgrep pesquisa de forma recursiva e ignora arquivos ocultos e tudo o que está no .gitignore, então --hidden e --no-ignore desativam isso. Em vez de --include e --exclude, ele tem uma única flag: rg -g "*.py" TODO pesquisa só arquivos Python, e um glob que começa com ! exclui. O comando gerado coloca isso entre aspas simples, para que o bash não trate o ! como histórico. Com -S, smart case, um padrão em minúsculas ignora maiúsculas e minúsculas e um com maiúsculas não. O grep não tem smart case, então o comando grep usa -i.

Algo não está funcionando ou um resultado parece errado? Relatar um problema com esta ferramenta