Comando grep: encontrar padrões em ficheiros e logs

Terminal Linux a executar o comando grep sobre um ficheiro de log, com as linhas correspondentes realçadas

Quem administra sistemas ou trabalha em segurança passa uma parte considerável do dia a fazer a mesma pergunta: onde é que isto aparece? Um endereço IP suspeito num log de autenticação, uma palavra-passe esquecida num ficheiro de configuração, uma diretiva perdida algures em /etc. O grep é a ferramenta que responde a essa pergunta em segundos: lê a entrada linha a linha, compara cada linha com um padrão e imprime as que correspondem.

É um dos comandos mais antigos do mundo Unix e continua a ser um dos mais usados — precisamente porque faz uma coisa só e fá-la depressa. Dominar meia dúzia de opções do grep transforma horas de leitura manual de logs em consultas de um segundo.

O que faz o grep

O nome vem do editor ed: g/re/p, «global / regular expression / print». E é exatamente isso que o comando faz: percorre um ou mais ficheiros (ou o que chega pelo pipe), avalia cada linha contra uma expressão regular e imprime a linha inteira quando há correspondência. A forma geral é:

grep [OPÇÕES] 'PADRÃO' [FICHEIRO...]

Três detalhes importam desde o primeiro dia. Primeiro, o padrão deve ir entre plicas, para a shell não interpretar carateres como *, $ ou | antes de o grep os ver. Segundo, o grep distingue maiúsculas de minúsculas por omissão — password e PASSWORD são padrões diferentes. Terceiro, o código de saída tem significado: 0 quando encontrou pelo menos uma correspondência, 1 quando não encontrou nenhuma e 2 em caso de erro — o que torna o grep perfeito para condições em scripts.

As opções que interessam

Como comparar

  • -i — ignora a diferença entre maiúsculas e minúsculas. Indispensável quando não se sabe como o texto foi escrito.
  • -v — inverte a lógica: imprime as linhas que não correspondem. Ótimo para limpar ruído.
  • -w — exige palavras inteiras: grep -w root apanha USER=root mas não chroot nem rootkit.
  • -x — a linha inteira tem de corresponder ao padrão, do primeiro ao último caráter.
  • -E — ativa a expressão regular estendida: |, +, () e {n,m} funcionam sem escape.
  • -F — trata o padrão como texto literal, sem regex. É a forma segura de procurar cadeias com [, . ou $.
  • -P — usa regex Perl (PCRE), com lookaheads e classes como \d. Disponível no GNU grep.
  • -e PADRÃO e -f FICHEIRO — vários padrões na mesma execução, indicados um a um ou lidos de um ficheiro (um por linha).
grep -E 'Failed|Accepted' auth.log
grep -F '[preauth]' auth.log
grep -w 'root' auth.log

Contexto à volta da correspondência

Numa investigação, a linha que corresponde raramente conta a história toda. As opções de contexto juntam as linhas vizinhas: -A N mostra N linhas depois de cada acerto, -B N mostra N linhas antes e -C N mostra N de cada lado. Grupos separados de resultados aparecem divididos por --.

grep -A 1 'Accepted' auth.log
# Jul 25 06:15:02 srv sshd[2020]: Accepted password for aluno ...
# Jul 25 06:15:02 srv sshd[2020]: pam_unix(sshd:session): session opened ...

Onde procurar

  • -r — desce recursivamente por uma pasta e antepõe o nome do ficheiro a cada resultado; -R faz o mesmo mas segue ligações simbólicas.
  • --include='*.php' e --exclude='*.log' — filtram, por glob, os ficheiros considerados no modo recursivo.
  • -l — imprime apenas os nomes dos ficheiros que têm pelo menos uma correspondência; -L imprime os que não têm nenhuma.

O que mostrar

  • -n — antepõe o número da linha. Com -r obtém-se o formato ficheiro:linha:conteúdo, ideal para relatórios.
  • -c — não imprime linhas: conta as correspondências por ficheiro.
  • -o — imprime só a parte da linha que correspondeu, uma correspondência por linha de saída.
  • -H / -h — força ou esconde o nome do ficheiro na saída, independentemente do número de alvos.
  • --color=auto — realça a correspondência dentro da linha quando a saída vai para o terminal.
  • -q — modo silencioso: não imprime nada, só devolve o código de saída; -m N pára após N correspondências.
grep -rn 'DB_PASSWORD' /var/www
grep -c 'Failed' auth.log
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' auth.log

grep em cibersegurança

Triagem de ataques de força bruta ao SSH. A primeira pergunta perante um servidor exposto é quem está a tentar entrar. Um encadeamento clássico de análise de auth.log extrai os IPs das tentativas falhadas e ordena-os por volume — os candidatos a bloquear na firewall ficam no topo:

grep 'Failed password' /var/log/auth.log | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | sort -rn

Caça a segredos em código e configurações. Em auditorias e testes de intrusão, grep -ri 'password' . sobre uma árvore de projeto continua a revelar credenciais esquecidas em ficheiros de configuração, scripts de cópia de segurança e históricos. O -i é decisivo: DB_PASSWORD em maiúsculas escapa a uma pesquisa sensível a maiúsculas.

Deteção de padrões de ataque em logs web. Pedidos com ../ (travessia de diretórios), /wp-login.php em rajada ou chamadas a ficheiros como shell.php saltam à vista com uma pesquisa dirigida, por exemplo grep -E '\.\./|wp-login|shell\.php' access.log — um primeiro filtro rápido antes de escalar para um SIEM.

Verificações de hardening em scripts. Graças ao código de saída, grep -q '^PermitRootLogin no' /etc/ssh/sshd_config serve de teste automático numa rotina de conformidade: se devolver 1, a configuração não está como devia e o script pode alertar.

Experimente no simulador interativo

A simulação abaixo mostra, lado a lado, o ficheiro de origem com as linhas assinaladas e a saída real do grep num terminal. Clique nas opções (-i, -v, -n, -r, contexto, e muitas mais) para as combinar e ver o comando e o resultado a mudar em tempo real; o botão Demonstrar tudo percorre automaticamente uma sequência guiada com explicações, e Anterior/Seguinte permitem avançar ao seu ritmo. A tabela de referência no fim indica que opções são demonstráveis na página.

Erros comuns e boas práticas

  • Padrão sem plicas. grep Failed|Accepted auth.log não faz o que parece: a shell interpreta o | como pipe. Escreva sempre grep -E 'Failed|Accepted' auth.log.
  • Esquecer a sensibilidade a maiúsculas. Uma pesquisa por password não encontra DB_PASSWORD. Em investigação, comece com -i e restrinja depois.
  • Confundir regex básica e estendida. Sem -E, os carateres +, ?, | e () são literais na regex básica; com -E passam a operadores. Escolha um modo e seja consistente.
  • Procurar texto com metacarateres sem -F. Cadeias como [preauth] ou 1.2.3.4 contêm carateres especiais de regex; com -F são tratadas literalmente (e um ponto num IP deixa de corresponder a «qualquer caráter»).
  • Ignorar o código de saída em scripts. grep -q é a forma correta de testar «existe?» num if — mais claro e mais rápido do que comparar saídas de texto.
  • Recursivo sem filtros. grep -r numa árvore grande atravessa binários e diretórios irrelevantes; combine com --include/--exclude para pesquisas mais rápidas e limpas.

Conclusão

O grep é a lupa do administrador e do analista: um padrão, um alvo, e as linhas certas aparecem — com contexto, número de linha e realce quando fazem falta. Junte-lhe -r para varrer árvores inteiras, -o para extrair exatamente o que interessa e -q para automatizar decisões, e tem uma ferramenta de análise de logs, resposta a incidentes e auditoria que cabe numa linha de comando.

Se quer levar estas competências mais longe — da linha de comandos à análise de incidentes e ao hardening de sistemas — conheça os serviços de formação e consultoria da HJFR no nosso catálogo de serviços. E se está a construir a sua base de administração Linux, veja também o artigo sobre o comando useradd.

Este artigo faz parte da série “Comandos Linux, um a um” do blog HJFR — fique atento aos próximos comandos.