Buscando com grep
A aula aborda o comando grep para busca de padrões em arquivos de texto no Linux/Bash. Explica desde padrões básicos até flags comuns, uso de expressões regulares e casos práticos. Inclui exemplos detalhados, exercícios com respostas colapsáveis e referências a documentação oficial.
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
findpara 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
- GNU Grep Manual
- man grep
- Regular-Expressions.info
- Advanced Bash-Scripting Guide: grep
- GNU Grep: Regular Expressions
Exercícios
- Use grep para listar todas as linhas do arquivo /etc/passwd que contêm o shell /bin/bash.
- Quantas linhas no arquivo /var/log/syslog contêm a palavra "error" (case insensitive)?
- Busque recursivamente no diretório /etc por arquivos que contenham a string "proxy", mas mostre apenas os nomes dos arquivos.
- No arquivo dados.txt, encontre linhas que NÃO contenham números (dígitos).
- 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).
grep "/bin/bash" /etc/passwdgrep -ci "error" /var/log/sysloggrep -rl "proxy" /etc/grep -v "[0-9]" dados.txtgrep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" arquivo.txt