O comando grep é uma ferramenta essencial no Linux para buscar padrões em arquivos de texto. Ele permite filtrar linhas que correspondem a uma expressão regular, tornando-se indispensável para análise de logs, código-fonte e saída de comandos. Nesta aula, você aprenderá desde o uso básico até técnicas avançadas com regex.

Dominar o grep aumenta sua produtividade no terminal, permitindo localizar rapidamente informações específicas em grandes volumes de dados. Veremos flags que modificam seu comportamento e como combiná-las com expressões regulares para buscas precisas.

Padrões básicos

O uso mais simples do grep é procurar uma string fixa em um arquivo. Por exemplo, grep "erro" log.txt exibe todas as linhas que contêm a palavra "erro". O padrão é interpretado como uma expressão regular básica (BRE), onde caracteres como . e * têm significado especial.

Para usar strings literais sem interpretação de metacaracteres, utilize a flag -F (ou --fixed-strings). Exemplo: grep -F "erro." log.txt busca exatamente a string "erro.".

# Buscar linhas com "erro" no arquivo log.txt
grep "erro" log.txt

# Buscar linhas que começam com "INFO" (usando regex)
grep "^INFO" log.txt

# Buscar linhas que terminam com "finalizado"
grep "finalizado$" log.txt

Flags (-i, -v, -r, -n)

As flags modificam o comportamento do grep:

  • -i: ignora diferenças entre maiúsculas e minúsculas.
  • -v: inverte a seleção, mostrando linhas que não correspondem ao padrão.
  • -r (ou -R): busca recursivamente em diretórios.
  • -n: exibe o número da linha junto com a linha correspondente.

Essas flags podem ser combinadas. Por exemplo, grep -iv "erro" log.txt mostra linhas que não contêm "erro", ignorando maiúsculas/minúsculas.

# Ignorar maiúsculas/minúsculas
grep -i "erro" log.txt

# Mostrar linhas que NÃO contêm "erro"
grep -v "erro" log.txt

# Buscar recursivamente no diretório atual
grep -r "função" .

# Exibir números de linha
grep -n "erro" log.txt

# Combinar flags: recursivo, ignorar case, mostrar números
grep -rin "erro" /var/log/

grep com regex

Expressões regulares (regex) permitem padrões mais flexíveis. O grep suporta três modos: básico (BRE), estendido (ERE com -E) e Perl-compatível (PCRE com -P, se disponível).

No modo básico, meta caracteres como +, ?, {, |, (, ) precisam ser escapados com \. No modo estendido (-E), eles podem ser usados diretamente.

# Modo ERE: busca linhas com "erro" ou "falha"
grep -E "erro|falha" log.txt

# PCRE: busca endereços IP (padrão simplificado)
grep -P "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" log.txt

# BRE: busca linhas com 2 a 4 dígitos consecutivos
grep "[0-9]\{2,4\}" log.txt

Exemplos práticos com regex: buscar linhas que começam com espaço, linhas vazias, ou palavras completas com -w.

# Linhas que começam com espaço (indentação)
grep "^ " arquivo.txt

# Linhas vazias
grep "^$" arquivo.txt

# Palavra exata "erro" (não parte de outra palavra)
grep -w "erro" arquivo.txt

Casos de uso

O grep é frequentemente usado em pipelines com outros comandos. Por exemplo, para filtrar processos de um usuário: ps aux | grep "^joao". Ou para contar ocorrências: grep -c "erro" log.txt.

Outros usos comuns:

  • Buscar em múltiplos arquivos com curingas: grep "TODO" *.py
  • Mostrar contexto com -A (após), -B (antes) e -C (ambos): grep -C 3 "exceção" log.txt
  • Usar com find para buscar em arquivos específicos: find . -name "*.txt" -exec grep -l "importante" {} \;
# Contar linhas com "erro" em todos os .log
grep -c "erro" *.log

# Mostrar 2 linhas antes e depois de cada ocorrência
grep -C 2 "falha" log.txt

# Buscar em arquivos que não são binários (-I)
grep -rI "senha" /etc/

# Usar com ps para filtrar processos
grep "sshd" /var/log/auth.log

Boas práticas

Sempre que possível, use aspas no padrão para evitar que o shell interprete metacaracteres. Prefira grep -E para regex mais legíveis. Em scripts, evite usar grep em saídas de ls; prefira find com -exec. Use -l para listar apenas nomes de arquivos que contêm o padrão.

Referências

Exercícios

  1. Use grep para listar todas as linhas do arquivo /etc/passwd que contêm o shell /bin/bash.
  2. ✓ Resposta:
    grep "/bin/bash" /etc/passwd
  3. Quantas linhas no arquivo /var/log/syslog contêm a palavra "error" (case insensitive)?
  4. ✓ Resposta:
    grep -ci "error" /var/log/syslog
  5. Busque recursivamente no diretório /etc por arquivos que contenham a string "proxy", mas mostre apenas os nomes dos arquivos.
  6. ✓ Resposta:
    grep -rl "proxy" /etc/
  7. No arquivo dados.txt, encontre linhas que NÃO contenham números (dígitos).
  8. ✓ Resposta:
    grep -v "[0-9]" dados.txt
  9. Use grep com regex para extrair todas as linhas de um arquivo que contenham um endereço de e-mail (padrão simples: algo@algo.algo).
  10. ✓ Resposta:
    grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" arquivo.txt