⬅ Voltar ao Dashboard Módulo 1 — Fundamentos Linux

🔍 Regex e Filtros de Texto

Aula 1.9 — grep, sed, awk e expressões regulares: domine o processamento de texto no Linux

🤔 O que é Regex?

Regex (Expressões Regulares) é uma linguagem de padrões usada para buscar, validar e transformar texto. Em vez de procurar uma palavra exata, você descreve um padrão — por exemplo, "qualquer linha que começa com um número seguido de ponto".

🎯 Para que serve?

  • Buscar texto em arquivos e logs
  • Validar formatos (e-mail, IP, CPF)
  • Substituir texto em massa
  • Extrair colunas e informações
  • Filtrar saída de comandos

🔧 Ferramentas que usam Regex

  • grep — buscar padrões em arquivos
  • sed — substituir texto (stream editor)
  • awk — processar colunas e campos
  • vim — busca e substituição no editor
  • Python, JavaScript, PHP e outras linguagens

💡 Analogia: Regex é como um "curinga super poderoso". Em vez de buscar apenas "gato", você pode buscar "qualquer palavra de quatro letras que começa com g e termina com o".

bash — exemplo motivador
# Encontra todas as linhas que COMEÇAM com "erro" no log usuario@linux:~$ grep "^erro" /var/log/syslog erro: falha na conexão com o servidor erro: timeout ao aguardar resposta # ^ = metacaractere que significa "início da linha"

🔎 grep — Buscando Padrões

grep (Global Regular Expression Print) percorre arquivos linha a linha e imprime as que casam com o padrão informado. É a ferramenta de busca mais usada no Linux.

Uso básico e flags essenciais

bash — grep
# Busca simples usuario@linux:~$ grep "erro" /var/log/syslog # -i Ignorar maiúsculas/minúsculas usuario@linux:~$ grep -i "error" /var/log/syslog # -r Busca recursiva em diretório usuario@linux:~$ grep -r "TODO" /projeto/ # -n Numerar as linhas encontradas usuario@linux:~$ grep -n "^root" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash # -v Inverter: linhas que NÃO contêm o padrão usuario@linux:~$ grep -v "#" /etc/ssh/sshd_config # -c Contar ocorrências usuario@linux:~$ grep -c "warning" /var/log/syslog 47 # -E Regex extendida (+, ?, |, {} sem escape) usuario@linux:~$ grep -E "erro|falha|warning" /var/log/syslog

📌 Flags mais usadas: -i ignora case  |  -n mostra nº linha  |  -r recursivo  |  -v inverte  |  -c conta  |  -l só nomes dos arquivos  |  -E regex extendida  |  -o só o trecho casado

⚡ Metacaracteres Básicos

Metacaracteres são símbolos com significado especial nas expressões regulares. Dominá-los é a chave para escrever padrões precisos e poderosos.

.
Qualquer caractere g.to = gato, geto, gito
*
Zero ou mais ab*c = ac, abc, abbc
^
Início da linha ^root = começa com root
$
Fim da linha bash$ = termina com bash
[ ]
Lista/classe [aei] = a ou e ou i
{}
Quantidade exata [0-9]{3} = três dígitos
+
Um ou mais ab+c = abc, abbc
?
Zero ou um colou?r = color, colour

Classes de caracteres

PadrãoSignificado
[abc]a, b ou c
[a-z]Letras minúsculas
[A-Z]Letras maiúsculas
[0-9]Dígitos
[^abc]NÃO a, b ou c
EscapeEquivale a
\d[0-9] — dígito
\w[a-zA-Z0-9_]
\sEspaço / tab
\.Ponto literal
\\Barra literal

💡 Use grep -E (ou egrep) para poder usar +, ? e | diretamente, sem precisar escapá-los com \.

✏️ sed — Substituição e Edição de Texto

sed (Stream Editor) processa texto linha a linha, aplicando transformações. O uso mais comum é a substituição com a sintaxe s/padrão/novo/flags.

bash — sed
# Substituir primeira ocorrência em cada linha usuario@linux:~$ sed 's/old/new/' arquivo.txt # /g = global: substituir TODAS as ocorrências usuario@linux:~$ sed 's/old/new/g' arquivo.txt # -i = editar o arquivo diretamente (cuidado!) usuario@linux:~$ sed -i 's/http/https/g' config.txt # Ignorar case com /gi usuario@linux:~$ sed 's/erro/ERRO/gi' log.txt # Deletar linhas que contêm um padrão usuario@linux:~$ sed '/comentario/d' arquivo.txt # Deletar linhas vazias usuario@linux:~$ sed '/^$/d' arquivo.txt # Múltiplas substituições com -e usuario@linux:~$ sed -e 's/a/A/g' -e 's/b/B/g' arquivo.txt

⚠️ Atenção com -i: o flag -i modifica o arquivo original permanentemente. Sempre teste o comando sem -i primeiro para verificar o resultado antes de salvar.

📊 awk — Processamento de Colunas

awk é uma linguagem de processamento de texto orientada a campos (colunas). Ele divide cada linha em campos separados por espaço (ou outro delimitador) e permite trabalhar com cada campo individualmente.

bash — awk
# Arquivo de exemplo usuario@linux:~$ cat funcionarios.txt João Vendas 3500 Maria TI 4200 Pedro RH 3800 # $1 = 1ª coluna, $2 = 2ª, $NF = última coluna usuario@linux:~$ awk '{print $1}' funcionarios.txt João Maria Pedro # Imprimir nome e salário usuario@linux:~$ awk '{print $1, $3}' funcionarios.txt # Filtrar linhas onde salário > 4000 usuario@linux:~$ awk '$3 > 4000 {print $1, $3}' funcionarios.txt Maria 4200 # -F define separador (ex: CSV com vírgula) usuario@linux:~$ awk -F':' '{print $1}' /etc/passwd # BEGIN = antes de processar; END = depois usuario@linux:~$ awk 'BEGIN{print "--- Relatório ---"} {print $1} END{print "--- Fim ---"}' funcionarios.txt # Somar valores da coluna 3 usuario@linux:~$ awk '{soma += $3} END {print "Total:", soma}' funcionarios.txt Total: 11500

📌 Variáveis especiais do awk: $0 = linha inteira  |  $1 a $N = campos  |  $NF = último campo  |  NR = nº da linha  |  FS = separador de campos

💫 Pipes — Encadeando Filtros

O pipe | conecta a saída de um comando à entrada do próximo. Combinando grep, sed e awk com pipes, você constrói pipelines de processamento extremamente poderosos.

bash — pipes
# Filtrar falhas e extrair o usuário (coluna 4) usuario@linux:~$ grep "failed" /var/log/auth.log | awk '{print $4}' # Contar tentativas por usuário usuario@linux:~$ grep "failed" auth.log | awk '{print $4}' | sort | uniq -c | sort -rn # Os 10 IPs que mais acessaram o servidor web usuario@linux:~$ awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 # Remover comentários e linhas vazias de um config usuario@linux:~$ grep -v "^#\|^$" /etc/ssh/sshd_config # Extrair IPs de um log com regex extendida usuario@linux:~$ grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log | sort -u

💡 Filosofia Unix: cada ferramenta faz uma coisa bem feita. A combinação delas via pipe cria soluções elegantes. grep filtra, awk processa, sed transforma, sort ordena, uniq deduplica.

🎯 Exemplos Práticos com Logs de Sistema

Logs de sistema são a principal aplicação cotidiana de regex e filtros. Veja como extrair informações úteis de arquivos como /var/log/syslog e /var/log/auth.log.

bash — análise de logs
# 1. Buscar erros no syslog sem distinção de case usuario@linux:~$ grep -i "error" /var/log/syslog | tail -20 # 2. Encontrar endereços IP específicos usuario@linux:~$ grep -rE "192\.168\.[0-9]+" /etc/ # 3. Listar usuários com UID >= 1000 (usuários reais) usuario@linux:~$ awk -F: '$3 >= 1000 {print $1}' /etc/passwd # 4. Substituir datas no formato americano para brasileiro usuario@linux:~$ sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/g' log.txt # 5. Extrair e-mails de um arquivo de contatos usuario@linux:~$ grep -Eo "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contatos.txt # 6. Contar erros por hora no syslog usuario@linux:~$ grep "error" /var/log/syslog | awk '{print $3}' | cut -d':' -f1 | sort | uniq -c

⚠️ Regex e segurança: analise logs regularmente em busca de tentativas de acesso suspeitas. Múltiplos "failed" do mesmo IP indicam possível ataque de força bruta. Use grep -c "Failed password" no auth.log para monitorar.

📌 Dica de ouro: teste suas expressões regulares em regex101.com antes de aplicar em produção — o site explica cada parte do padrão em tempo real.

🎯 Exercício — Arraste e Conecte

Arraste cada descrição para o comando ou expressão correspondente.

Descrição
Busca 'error' sem distinção de maiúsculas
Busca linhas que começam com 'root' numerando-as
Substitui todas as ocorrências no arquivo
Imprime apenas a primeira coluna
Busca IPs recursivamente com regex extendida
Lista usuários com UID >= 1000
Comando
grep -i "error" /var/log/syslog
grep -n "^root" /etc/passwd
sed 's/old/new/g' arquivo.txt
awk '{print $1}' arquivo.txt
grep -rE "192\.168\.[0-9]+" /etc/
awk -F: '$3 >= 1000 {print $1}' /etc/passwd

🛠️ Atividade Prática — Análise de Logs com grep, sed e awk

⏱ ~35 min 💻 Ubuntu Server / Terminal 📸 Tirar screenshot da saída
1
Buscar erros no syslog com grep
Execute grep -i "error" /var/log/syslog | tail -20. Observe as últimas 20 linhas com erros. Em seguida, use grep -c "error" /var/log/syslog para contar o total de ocorrências e registre o número.
2
Filtrar por IP específico
Use grep -rE "192\.168\.[0-9]+" /etc/ para localizar arquivos de configuração que referenciam endereços IP da rede local. Depois experimente grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /etc/hosts para extrair apenas os IPs.
3
Substituir texto com sed
Crie um arquivo de teste: echo -e "erro: disco cheio\nerro: memória baixa\ninfo: tudo ok" > teste.log. Depois aplique sed 's/erro/ALERTA/g' teste.log e observe a substituição. Tente também deletar as linhas de info: sed '/^info/d' teste.log.
4
Extrair colunas com awk
Use awk -F: '{print $1, $3}' /etc/passwd | head -10 para listar nome e UID dos usuários. Em seguida filtre apenas os usuários do sistema: awk -F: '$3 >= 1000 {print $1}' /etc/passwd.
5
Combinar filtros com pipe
Monte um pipeline completo: grep -i "error" /var/log/syslog | awk '{print $3}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -5. Este comando conta quantos erros ocorreram em cada hora do dia, mostrando os 5 horários com mais problemas.
6
Criar relatório de acesso
Se existir /var/log/auth.log, execute: grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn > ~/relatorio_acesso.txt && cat ~/relatorio_acesso.txt. Isso gera um relatório com os usuários que tiveram mais tentativas de login falhas.
📌 Para refletir: grep, sed e awk são ferramentas de 1970 ainda indispensáveis em 2025. Todo administrador de sistemas Linux usa esses comandos diariamente para monitorar servidores, investigar incidentes e automatizar relatórios. Dominar regex é uma das habilidades mais valorizadas no mercado de TI.