grep é a espinha dorsal da pesquisa de texto no Linux. Seja para encontrar uma string dentro de um arquivo de log, filtrar a saída de um pipeline ou buscar um padrão em milhares de arquivos fonte, dominar grep e expressões regulares é uma das habilidades mais valiosas que um usuário de Linux ou sysadmin pode ter. Este guia cobre desde o uso básico até padrões de regex avançados, cenários reais de filtragem de logs e uma comparação prática de grep, ripgrep e ack.
Pré-requisitos
- Um sistema Linux (Ubuntu, Debian, CentOS, Arch ou similar)
- Familiaridade básica com o terminal (ver Usar o Terminal no Ubuntu)
- grep pré-instalado (está em todas as distribuições Linux por padrão)
- Opcional: ripgrep (
apt install ripgrepoudnf install ripgrep) e ack (apt install ack)
Uso Básico do grep
grep lê um ou mais arquivos (ou entrada padrão) e imprime as linhas que correspondem a um padrão. A forma mais simples é:
grep 'padrão' nome_arquivo
Opções chave que você usará todos os dias:
| Opção | Significado |
|---|---|
-i | Correspondência sem distinção de maiúsculas |
-n | Mostrar números de linha |
-c | Contar linhas correspondentes |
-l | Imprimir apenas nomes de arquivos que correspondem |
-L | Imprimir arquivos SEM correspondência |
-v | Inverter — imprimir linhas que não correspondem |
-w | Correspondência apenas de palavras inteiras |
-r | Recursão em diretórios |
-A N | Mostrar N linhas após a correspondência |
-B N | Mostrar N linhas antes da correspondência |
-C N | Mostrar N linhas antes e depois |
--color | Destacar correspondência na saída |
Exemplos:
# Encontrar todas as linhas com "error" (sem distinção de maiúsculas)
grep -i 'error' /var/log/syslog
# Mostrar números de linha no resultado
grep -n 'Failed password' /var/log/auth.log
# Contar quantas vezes um padrão aparece
grep -c 'GET /api' access.log
# Pesquisar recursivamente em todos os arquivos .py
grep -r 'import os' --include='*.py' ./projeto
Expressões Regulares Básicas (BRE)
Por padrão, grep usa Expressões Regulares Básicas. Os metacaracteres essenciais:
| Metacarácter | Significado | Exemplo |
|---|---|---|
. | Qualquer caractere | gr.p corresponde a grep, grip |
* | Zero ou mais do anterior | go*d corresponde a gd, god, good |
^ | Início de linha | ^ERROR corresponde a linhas iniciando com ERROR |
$ | Fim de linha | \.log$ corresponde a linhas terminando em .log |
[ ] | Classe de caracteres | [aeiou] corresponde a qualquer vogal |
[^ ] | Classe negada | [^0-9] corresponde a qualquer não-dígito |
\{n,m\} | Intervalo de repetição | [0-9]\{2,4\} corresponde a 2–4 dígitos |
Expressões Regulares Estendidas (ERE) com grep -E
O regex estendido elimina as barras invertidas dos operadores de repetição e agrupamento. Use grep -E ou o alias egrep:
# Corresponder ERROR, WARN ou CRITICAL
grep -E 'ERROR|WARN|CRITICAL' /var/log/app.log
# Corresponder endereços IP (simplificado)
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log
# Corresponder linhas com código de status HTTP 4xx ou 5xx
grep -E ' [45][0-9]{2} ' access.log
# Extrair endereços de e-mail de um arquivo
grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contatos.txt
A opção -o imprime apenas a parte correspondente, não a linha inteira — essencial para extração de dados.
Filtragem de Logs em Tempo Real
Combine grep com tail -f para monitorar logs ao vivo:
# Seguir syslog e mostrar apenas linhas de erro
tail -f /var/log/syslog | grep -i 'error'
# Mostrar erros do nginx mas excluir ruído de healthcheck
tail -f /var/log/nginx/access.log | grep -v '/health'
# Destacar múltiplos padrões simultaneamente
tail -f /var/log/app.log | grep --color -E 'ERROR|WARN|INFO'
Pipelines em cadeia são o caso de uso mais poderoso do grep para operações:
# Contar falhas de login SSH por IP (últimas 1000 linhas)
tail -1000 /var/log/auth.log \
| grep 'Failed password' \
| grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' \
| sort | uniq -c | sort -rn
Comparação: grep vs ripgrep vs ack
| Recurso | grep | ripgrep (rg) | ack |
|---|---|---|---|
| Incluído no Linux | Sim | Não | Não |
| Velocidade em árvores grandes | Boa | Excelente | Boa |
| Respeita .gitignore | Não | Sim | Parcialmente |
| Filtros por tipo de arquivo | --include | -t py | --python |
| Cor padrão | Com --color | Sim | Sim |
| Melhor para | Logs do sistema, scripts | Pesquisa em código | Pesquisa em código |
Quando usar grep: análise de logs do sistema, scripts de shell, pesquisas pontuais em servidores onde só há ferramentas padrão.
Quando usar ripgrep: pesquisa em bases de código, pipelines de CI, onde a velocidade importa. Paraleliza a leitura de arquivos e usa SIMD para correspondência de padrões.
Cenário Real — Triagem de Logs em Produção
Você tem um servidor web em produção gerando 50 GB de logs por dia. Após um alerta de incidente, precisa encontrar todas as requisições que retornaram erros 500 entre 14:00 e 15:00 e extrair IPs únicos dos clientes.
# Passo 1 — isolar a janela de tempo
grep '21/Feb/2026:1[4-5]:' /var/log/nginx/access.log > /tmp/janela.log
# Passo 2 — filtrar apenas erros 500
grep -E ' 500 ' /tmp/janela.log > /tmp/erros_500.log
echo "Total de erros 500 na janela: $(wc -l < /tmp/erros_500.log)"
# Passo 3 — extrair e classificar IPs dos clientes
grep -Eo '^[0-9.]+ ' /tmp/erros_500.log \
| sort | uniq -c | sort -rn | head -20
Armadilhas e Casos Especiais
Pesquisar em arquivos binários: grep imprimirá “Binary file matches” e pulará a saída. Force o modo texto com -a (--text) ou use strings primeiro.
Caracteres especiais em padrões: Se o seu termo de busca contiver ., *, [ ou \, escape-os com \ ou use grep -F (string fixa, sem regex).
Desempenho em arquivos enormes: grep é single-threaded. Para arquivos de vários GB, considere ripgrep (paralelo) ou use zgrep para logs comprimidos.
Problemas de locale: Em alguns sistemas, [a-z] inclui caracteres acentuados dependendo do locale LC_ALL. Use LC_ALL=C grep para comportamento ASCII previsível.
Solução de Problemas
grep retorna código de saída 1 em scripts: Este é o comportamento esperado — grep sai com 1 quando não há correspondências, o que faz scripts com set -e abortarem. Use grep ... || true para lidar com isso.
O padrão não corresponde apesar do texto visível: Verifique se há retornos de carro (\r) em arquivos do Windows. Execute grep -P '\r' para detectá-los e dos2unix para removê-los.
Pesquisa recursiva lenta: Adicione --exclude-dir=.git (ou use ripgrep, que faz isso por padrão) para evitar rastrear o diretório .git.
Resumo
- grep pesquisa em arquivos e stdin linhas que correspondam a um padrão;
-i,-n,-r,-vsão as opções mais usadas - O regex básico (BRE) é o padrão; use
grep -Epara regex estendido com+,?e| -oextrai apenas a parte correspondente — essencial para extração de dados de logs- Combine grep com
tail -fpara monitoramento de logs em tempo real - Use
grep -Fpara pesquisas de strings literais e evitar surpresas com metacaracteres - ripgrep é mais rápido para pesquisa em código; grep continua sendo o rei para logs e scripts