Expressoes Regulares: BRE, ERE e grep
O Que Voce Vai Conquistar
- Explicar a diferenca entre Expressoes Regulares Basicas (BRE) e Estendidas (ERE)
- Escrever padroes precisos usando ancoras, classes de caracteres e quantificadores
- Usar regex adequadamente com
grep/egrep/sed - Extrair e excluir linhas correspondentes a padroes especificos de logs
- Parar de cometer o erro frequente no exame "barra invertida em BRE"
Este e o nucleo do objetivo 103.7 do LPIC-1 "Buscar em arquivos de texto usando expressoes regulares". Regex e uma linguagem para descrever padroes de strings e 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 + ? { } ( ) | |
|---|---|---|
| Expressao Regular Basica BRE | grep / sed |
Barra invertida necessaria (\+ \{ \() |
| Expressao Regular Estendida ERE | grep -E / egrep / sed -E |
Usados diretamente (+ { () |
A diferenca "escrever \{3\} em grep mas {3} em grep -E" e frequente no exame. Sempre esteja ciente de qual dialeto voce esta escrevendo.
Referencia de Metacaracteres
| Metacaractere | Significado | Exemplo |
|---|---|---|
. |
Qualquer caractere unico | a.c -> abc, axc |
* |
0 ou mais do precedente | ab* -> a, ab, abb |
^ |
Ancora de inicio de linha | ^root |
$ |
Ancora de fim de linha | bash$ |
[ ] |
Classe de caracteres | [0-9] um digito |
[^ ] |
Classe negada | [^0-9] nao digito |
\+ (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 / alternacao) |
Corresponder a qualquer lado. BRE precisa da barra invertida, ERE nao | cat|dog |
Passo a Passo
Passo 1: Fixar posicao com ancoras
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
^ e inicio de linha e $ e fim de linha, ancoras de largura zero. grep -x corresponde a linha inteira (equivalente a ^pattern$). Esta e a base da extracao de linhas de comentario e busca por correspondencia 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] e um digito e \{1,3\} e 1 a 3 repeticoes (BRE requer barras invertidas). [[:space:]] e uma classe de caracteres POSIX que corresponde a espacos 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) e mais legivel. Fazer o mesmo em BRE requer escaping com barra invertida e reduz a legibilidade.
Passo 4: Combinar extracao e exclusao
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 nao correspondem (remover comentarios/linhas em branco), -o extrai apenas a correspondencia, -c fornece contagens, -i ignora maiusculas/minusculas. Frequentemente usado para extrair linhas efetivas de arquivos de configuracao.
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 e o modo ERE. \1 \2 sao retrorreferencias que reutilizam grupos capturados com ( ) no lado da substituicao. Usado para conversao 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 usa-los como quantificadores, grupos ou OR, voce deve marcar "este e um metacaractere" com uma barra invertida. ERE remove essa sobrecarga tratando caracteres especiais como metacaracteres desde o inicio. grep -E / egrep habilitam ERE.
Sem entender essa diferenca de design, voce nao consegue explicar "grep 'a+' nao corresponde a um-ou-mais de a (ele busca o literal a+)". O LPIC pergunta exatamente sobre essa armadilha.
Solucao de Problemas
Sintoma: grep 'a+' nao corresponde a um-ou-mais
Causa: Em BRE, + e tratado como um caractere literal
Verificacao:
grep 'a\+' file grep -E 'a+' file
Solucao: Use ERE (grep -E), ou escape como \+ em BRE.
Sintoma: Um ponto corresponde a qualquer caractere e causa falsos positivos
Causa: . significa qualquer caractere unico em regex
Verificacao:
grep '192\.168' access.log
Solucao: Escape como \. para buscar um ponto literal. Para busca de string fixa, grep -F (fgrep) e seguro.
Sintoma: Nao consegue buscar uma string contendo caracteres especiais
Causa: [ * $ etc. sao interpretados como metacaracteres
Verificacao:
grep -F '[error]' app.log
Solucao: Se o padrao nao precisa de regex, use grep -F para busca de string fixa. Escape apenas os caracteres necessarios com \.
Lista de Verificacao de Conclusao
- [ ] Verificou correspondencia de inicio/fim de linha com ancoras
^$ - [ ] Combinou classes de caracteres como
[0-9]com quantificadores - [ ] Verificou a diferenca BRE (
\{3\}) vs ERE (grep -E '{3}') em uma maquina real - [ ] Experimentou as opcoes
-v-o-c-i - [ ] Substituiu usando retrorreferencias do
sed -E(\1)
Resumo
| Cenario | Sintaxe | Proposito |
|---|---|---|
| Correspondencia inicio | grep '^pattern' |
Extracao de comentarios/linhas especificas |
| Correspondencia exata | grep -x / ^...$ |
Correspondencia de linha inteira |
| Um ou mais | grep -E 'a+' |
Detectar caracteres repetidos |
| Apenas correspondencia | grep -o |
Obter apenas a parte correspondente |
| Substituir | sed -E 's/.../.../' |
Reformatar com retrorreferencias |
Regex e a base do grep / sed / awk. Em seguida, avance para outras areas do exame como mecanismos de links e prioridades de processos para conectar o conhecimento.