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 rootapanhaUSER=rootmas nãochrootnemrootkit.-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ÃOe-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;-Rfaz 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;-Limprime os que não têm nenhuma.
O que mostrar
-n— antepõe o número da linha. Com-robtém-se o formatoficheiro: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 Npá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.lognão faz o que parece: a shell interpreta o|como pipe. Escreva sempregrep -E 'Failed|Accepted' auth.log. - Esquecer a sensibilidade a maiúsculas. Uma pesquisa por
passwordnão encontraDB_PASSWORD. Em investigação, comece com-ie restrinja depois. - Confundir regex básica e estendida. Sem
-E, os carateres+,?,|e()são literais na regex básica; com-Epassam a operadores. Escolha um modo e seja consistente. - Procurar texto com metacarateres sem
-F. Cadeias como[preauth]ou1.2.3.4contêm carateres especiais de regex; com-Fsã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?» numif— mais claro e mais rápido do que comparar saídas de texto. - Recursivo sem filtros.
grep -rnuma árvore grande atravessa binários e diretórios irrelevantes; combine com--include/--excludepara 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.
