Expressões regulares com grep e egrep
1. Introdução às expressões regulares no contexto do grep
Expressões regulares (regex) são padrões de busca que permitem localizar, extrair e manipular texto de forma poderosa no Bash. Elas são essenciais para administradores de sistemas e desenvolvedores que precisam filtrar logs, validar entradas ou processar arquivos de configuração.
O grep trabalha com dois tipos principais de regex:
- BRE (Basic Regular Expressions): sintaxe padrão do grep, onde metacaracteres como +, ?, {, }, (, ) precisam ser escapados com \ para terem significado especial
- ERE (Extended Regular Expressions): sintaxe do egrep ou grep -E, onde esses metacaracteres funcionam sem escape
Use grep para padrões simples e egrep (ou grep -E) quando precisar de quantificadores, agrupamento ou alternância.
2. Sintaxe básica do grep com regex
A estrutura fundamental é:
grep [opções] 'padrão' arquivo
Opções essenciais:
- -i: ignora diferenças entre maiúsculas e minúsculas
- -v: inverte a correspondência (mostra linhas que NÃO contêm o padrão)
- -c: conta o número de linhas correspondentes
- -n: exibe o número da linha
- -l: lista apenas nomes de arquivos com correspondências
Exemplo prático filtrando logs:
# Encontrar erros em um log, ignorando case
grep -i 'error' /var/log/syslog
# Contar quantas vezes "failed" aparece
grep -c 'failed' /var/log/auth.log
# Mostrar linhas que NÃO contêm "#" (comentários) em config
grep -v '^#' /etc/ssh/sshd_config
3. Metacaracteres e âncoras no grep (BRE)
As âncoras delimitam posições na linha:
- ^ : início da linha
- $ : fim da linha
- . : qualquer caractere único (exceto nova linha)
Classes de caracteres usam colchetes:
- [abc] : qualquer um dos caracteres a, b ou c
- [^abc] : qualquer caractere EXCETO a, b ou c
- [a-z] : intervalo de a até z
Exemplos práticos:
# Linhas que começam com "192.168"
grep '^192\.168' /etc/hosts
# Linhas que terminam com ".conf"
grep '\.conf$' /etc
# Validar IPs simples (formato xxx.xxx.xxx.xxx)
grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}$' ips.txt
# Encontrar emails (padrão básico)
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' emails.txt
4. Quantificadores e agrupamento com egrep (ERE)
No ERE (egrep ou grep -E), os quantificadores funcionam sem escape:
- * : zero ou mais ocorrências
- + : uma ou mais ocorrências
- ? : zero ou uma ocorrência
- {n,m} : entre n e m ocorrências
Agrupamento e alternância:
- (padrão) : agrupa parte da expressão
- padrão1|padrão2 : corresponde a um ou outro
Exemplos:
# Extrair URLs http ou https
egrep -o 'https?://[^ "]+' arquivo.txt
# Encontrar números de telefone (formato (XX) XXXX-XXXX)
egrep '\([0-9]{2}\) [0-9]{4}-[0-9]{4}' contatos.txt
# Palavras com 3 a 5 letras
egrep -o '\b[a-zA-Z]{3,5}\b' texto.txt
# Linhas que contêm "error" OU "warning"
egrep 'error|warning' /var/log/syslog
5. Classes predefinidas e escapes especiais
Classes POSIX tornam as regex mais portáveis:
- [:alnum:] : letras e dígitos
- [:digit:] : apenas dígitos
- [:space:] : espaços, tabs, etc.
- [:punct:] : pontuação
- [:alpha:] : letras
Escapes para caracteres literais:
- \. : ponto literal
- \* : asterisco literal
- \\ : barra invertida literal
Uso de \b para bordas de palavra (suportado no GNU grep):
# Encontrar a palavra "port" completa, não "portal" ou "porta"
grep '\bport\b' /etc/services
# Extrair apenas números (dígitos)
grep -o '[[:digit:]]\+' dados.txt
# Linhas com apenas letras e espaços
grep '^[[:alpha:] ]\+$' frases.txt
# Filtrar dados numéricos (inteiros ou decimais)
grep -E '^[0-9]+(\.[0-9]+)?$' numeros.txt
6. Combinações avançadas: grep + pipes + regex
O verdadeiro poder surge ao combinar grep com outros comandos:
# Múltiplos filtros encadeados
grep -i 'error' /var/log/syslog | grep -v 'database' | grep '2024-01'
# Extrair apenas IPs de um log de servidor
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log | sort | uniq -c
# Grep recursivo em diretórios
grep -r --include="*.py" 'def main' /home/projetos/
# Extrair campos específicos de CSV
grep -oP '^[^,]+' dados.csv # primeiro campo de cada linha
# Analisar logs de autenticação
grep -E 'Failed password|Accepted password' /var/log/auth.log | \
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
sort | uniq -c | sort -rn | head -10
7. Diferenças práticas entre grep e egrep no dia a dia
A escolha entre BRE e ERE depende da complexidade:
# BRE: precisa escapar + e ()
grep '\(error\|warning\)' log.txt
# ERE: mais legível
egrep '(error|warning)' log.txt
# BRE: quantificador "uma ou mais" com \+
grep 'a\+' texto.txt
# ERE: sem escape
grep -E 'a+' texto.txt
Armadilhas comuns:
- Esquecer de escapar +, ?, (, ) no BRE
- Usar ERE sem a opção -E (o grep interpretará literalmente)
- Diferenças entre GNU grep (Linux) e BSD grep (macOS) no suporte a \b e -P
8. Boas práticas e dicas de depuração
Teste suas regex antes de aplicá-las em arquivos reais:
# Testar com echo
echo "teste@email.com" | grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
# Usar --color para visualizar correspondências
grep --color=always 'padrão' arquivo.txt
# Evitar padrões gulosos - seja específico
# Ruim: .* (muito genérico)
# Bom: [^;]+ (mais específico)
# Checklist para regex robustas:
# 1. Teste em múltiplos casos (válidos e inválidos)
# 2. Escape caracteres especiais quando necessário
# 3. Use âncoras ^ e $ para correspondência exata
# 4. Prefira classes POSIX para portabilidade
# 5. Documente regex complexas com comentários
Referências
- GNU Grep Manual — Documentação oficial completa do GNU grep, incluindo todas as opções e sintaxe de expressões regulares
- Regular-Expressions.info - grep Tutorial — Tutorial abrangente sobre expressões regulares com grep, com exemplos práticos e explicações detalhadas
- Linuxize - Grep Command in Linux — Guia prático sobre o comando grep no Linux, com exemplos de uso de regex
- DigitalOcean - Using Grep & Regular Expressions — Tutorial da DigitalOcean cobrindo expressões regulares com grep e egrep
- IBM Documentation - grep and egrep Commands — Documentação da IBM sobre os comandos grep e egrep no AIX, com referência de sintaxe
- O'Reilly - sed & awk (Chapter: Regular Expressions) — Livro de referência que inclui capítulo detalhado sobre expressões regulares usadas com grep, sed e awk