Expressões Regulares: BRE, ERE e grep
O Que Você Vai Conquistar
- Explicar a diferença entre Expressões Regulares Básicas (BRE) e Estendidas (ERE)
- Escrever padrões precisos usando âncoras, classes de caracteres e quantificadores
- Usar regex adequadamente com
grep/egrep/sed - Extrair e excluir linhas correspondentes a padrões específicos de logs
- Parar de cometer o erro frequente no exame "barra invertida em BRE"
Este é o núcleo do objetivo 103.7 do LPIC-1 "Buscar em arquivos de texto usando expressões regulares". Regex é uma linguagem para descrever padrões de strings e é a base do grep / sed / awk.
Decidindo Entre BRE e ERE
Regex tem dialetos. O LPIC pergunta sobre dois tipos POSIX.
| Tipo | Comandos | Tratamento de + ? { } ( ) | |
|---|---|---|
| Expressão Regular Básica BRE | grep / sed |
Barra invertida necessária (\+ \{ \() |
| Expressão Regular Estendida ERE | grep -E / egrep / sed -E |
Usados diretamente (+ { () |
A diferença "escrever \{3\} em grep mas {3} em grep -E" é frequente no exame. Sempre esteja ciente de qual dialeto você está escrevendo.
Referência de Metacaracteres
| Metacaractere | Significado | Exemplo |
|---|---|---|
. |
Qualquer caractere único | a.c -> abc, axc |
* |
0 ou mais do precedente | ab* -> a, ab, abb |
^ |
Âncora de início de linha | ^root |
$ |
Âncora de fim de linha | bash$ |
[ ] |
Classe de caracteres | [0-9] um dígito |
[^ ] |
Classe negada | [^0-9] não dígito |
\+ (ERE +) |
1 ou mais do precedente | a\+ |
\? (ERE ?) |
0 ou 1 do precedente | colou\?r |
\{n,m\} (ERE {n,m}) |
Entre n e m vezes | [0-9]\{1,3\} |
| (OR / alternação) |
Corresponder a qualquer lado. BRE precisa da barra invertida, ERE não | cat|dog |
Passo a Passo
Passo 1: Fixar posição com âncoras
grep '^#' /etc/ssh/sshd_config grep 'bash$' /etc/passwd grep -x 'root' users.txt
# $OpenBSD: sshd_config #Port 22 root:x:0:0:root:/root:/bin/bash root
^ é início de linha e $ é fim de linha, âncoras de largura zero. grep -x corresponde à linha inteira (equivalente a ^pattern$). Esta é a base da extração de linhas de comentário e busca por correspondência exata.
Passo 2: Especificar faixas com classes de caracteres
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log
grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log
grep '[[:space:]]' config.txt192.168.1.10 - - [17/May/2026] 10.0.0.5 - - [17/May/2026]
[0-9] é um dígito e \{1,3\} é 1 a 3 repetições (BRE requer barras invertidas). [[:space:]] é uma classe de caracteres POSIX que corresponde a espaços em branco.
Passo 3: Usar BRE e ERE adequadamente
grep 'colou\?r' notes.txt grep -E 'colou?r' notes.txt grep -E 'error|warning|fatal' app.log
color theme favourite colour [ERROR] disk full [WARNING] high load
Ao usar ? + | {} (), grep -E (ERE) é mais legível. Fazer o mesmo em BRE requer escaping com barra invertida e reduz a legibilidade.
Passo 4: Combinar extração e exclusão
grep -v '^#' /etc/fstab | grep -v '^$'
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log | sort -u
grep -ci 'timeout' app.logUUID=xxxx / ext4 defaults 0 1 192.168.1.10 10.0.0.5 7
-v mostra linhas que não correspondem (remover comentários/linhas em branco), -o extrai apenas a correspondência, -c fornece contagens, -i ignora maiúsculas/minúsculas. Frequentemente usado para extrair linhas efetivas de arquivos de configuração.
Passo 5: Substituir com regex no sed
echo "2026-05-17" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
sed -n '/^ERROR/p' app.log17/05/2026 ERROR connection refused
sed -E é o modo ERE. \1 \2 são retrorreferências que reutilizam grupos capturados com ( ) no lado da substituição. Usado para conversão de formato de data e similares.
Por Que BRE Precisa de Barras Invertidas
BRE historicamente preserva a sintaxe antiga do grep / ed, tratando + ? { ( | como "sem significado especial (literal)". Para usá-los como quantificadores, grupos ou OR, você deve marcar "este é um metacaractere" com uma barra invertida. ERE remove essa sobrecarga tratando caracteres especiais como metacaracteres desde o início. grep -E / egrep habilitam ERE.
Sem entender essa diferença de design, você não consegue explicar "grep 'a+' não corresponde a um-ou-mais de a (ele busca o literal a+)". O LPIC pergunta exatamente sobre essa armadilha.
Solução de Problemas
Sintoma: grep 'a+' não corresponde a um-ou-mais
Causa: Em BRE, + é tratado como um caractere literal
Verificação:
grep 'a\+' file grep -E 'a+' file
Solução: Use ERE (grep -E), ou escape como \+ em BRE.
Sintoma: Um ponto corresponde a qualquer caractere e causa falsos positivos
Causa: . significa qualquer caractere único em regex
Verificação:
grep '192\.168' access.log
Solução: Escape como \. para buscar um ponto literal. Para busca de string fixa, grep -F (fgrep) é seguro.
Sintoma: Não consegue buscar uma string contendo caracteres especiais
Causa: [ * $ etc. são interpretados como metacaracteres
Verificação:
grep -F '[error]' app.log
Solução: Se o padrão não precisa de regex, use grep -F para busca de string fixa. Escape apenas os caracteres necessários com \.
Lista de Verificação de Conclusão
- [ ] Verificou correspondência de início/fim de linha com âncoras
^$ - [ ] Combinou classes de caracteres como
[0-9]com quantificadores - [ ] Verificou a diferença BRE (
\{3\}) vs ERE (grep -E '{3}') em uma máquina real - [ ] Experimentou as opções
-v-o-c-i - [ ] Substituiu usando retrorreferências do
sed -E(\1)
Resumo
| Cenário | Sintaxe | Propósito |
|---|---|---|
| Correspondência início | grep '^pattern' |
Extração de comentários/linhas específicas |
| Correspondência exata | grep -x / ^...$ |
Correspondência de linha inteira |
| Um ou mais | grep -E 'a+' |
Detectar caracteres repetidos |
| Apenas correspondência | grep -o |
Obter apenas a parte correspondente |
| Substituir | sed -E 's/.../.../' |
Reformatar com retrorreferências |
Regex é a base do grep / sed / awk. Em seguida, avance para outras áreas do exame como mecanismos de links e prioridades de processos para conectar o conhecimento.