⬅ Voltar ao Dashboard 1º Bimestre — Linux Básico
Aula 1.4

🔍 Metacaracteres e Expressões Regulares

Domine padrões de busca no Linux — de wildcards do shell a filtros poderosos com grep.

? Interrogação 1 caractere exato
* Asterisco Zero ou mais chars
[ ] Colchetes Conjunto específico
{ } Chaves Expansão múltipla

📚 O que São Metacaracteres?

Metacaracteres são símbolos especiais que o shell interpreta antes de executar o comando. Em vez de buscar o símbolo literalmente, o shell os usa como padrões de busca.

sem e com metacaracteres
# Sem metacaracteres — só encontra o nome exato user@linux:~$ ls arquivo1.txt arquivo1.txt # Com metacaractere — encontra vários de uma vez! user@linux:~$ ls arquivo*.txt arquivo1.txt arquivo2.txt arquivoX.txt arquivo_backup.txt # O shell expande o padrão antes de executar ls

💡 Como funciona: O shell vê arquivo*.txt, expande para todos os arquivos que combinam, e só então passa a lista para o comando. O comando nunca vê o metacaractere — já recebe os nomes prontos.

❓ Símbolo ? — Exatamente Um Caractere

? Substitui exatamente 1 caractere qualquer

Pode ser letra, número ou símbolo — mas obrigatoriamente um. Não substitui "nada".

exemplos com ?
# 1 interrogação = exatamente 1 caractere user@linux:~$ ls test?.log test1.log test2.log testA.log testX.log # Dois ?? = exatamente 2 caracteres user@linux:~$ ls doc??.pdf doc01.pdf docAB.pdf docXY.pdf # Uso real: backups com data formatada user@linux:~$ ls backup_202?-0?.tar backup_2023-01.tar backup_2024-05.tar backup_2024-09.tar
file?.txt — combina
file1.txt filea.txt fileX.txt file_.txt
file?.txt — NÃO combina
file.txt file12.txt fileABC.txt

✅ Use ? quando você sabe exatamente quantos caracteres podem variar. Para quantidades variáveis, prefira *.

⭐ Símbolo * — Zero ou Mais Caracteres

* Substitui zero ou mais caracteres — o mais flexível

Pode combinar com nada, com um caractere ou com centenas. O curinga mais usado no dia a dia.

exemplos com *
# Tudo que começa com "backup" user@linux:~$ ls backup* backup backup.tar backup_2024.zip backup_completo.tar.gz # Todos os .conf em /etc que começam com 'd' user@linux:~$ ls /etc/d*.conf dhcpd.conf debug.conf dns.conf # Qualquer arquivo que CONTENHA "log" user@linux:~$ ls *log* mylog.txt syslog.conf catalog.db login.sh
file*.txt — combina
file.txt file1.txt file12.txt fileABC.txt file_backup.txt
file*.txt — NÃO combina
file.pdf arquivofile.txt

⚖️ Quando Usar: ? vs *

?
Quantidade definida Sabe exatamente quantos
caracteres mudam
$ ls log??.txt # log01.txt a log99.txt
VS
*
Quantidade indefinida Não importa quantos
caracteres mudam
$ ls *.txt # todos os .txt
? vs * — diferença na prática
# Arquivos disponíveis: file.txt file1.txt file12.txt fileABC.txt user@linux:~$ ls file?.txt file1.txt # Só 1 caractere: pega apenas file1.txt user@linux:~$ ls file*.txt file.txt file1.txt file12.txt fileABC.txt # Zero ou mais: pega todos!

📋 Colchetes [ ] — Conjunto Específico

[ ] Escolhe 1 caractere de um conjunto definido por você

Pode ser uma lista ([abc]), um intervalo ([a-z]) ou uma negação ([^abc]).

[a-z] Letras minúsculas
[A-Z] Letras maiúsculas
[0-9] Dígitos
[a-zA-Z] Qualquer letra
[0-9a-f] Hexadecimal
[^0-9] Não-número (negação)
exemplos com [ ]
# Só aceita 1, 2 ou 3 — lista explícita user@linux:~$ ls file[123].txt file1.txt file2.txt file3.txt # Intervalo: números de 1 a 5 user@linux:~$ ls arquivo[1-5].txt arquivo1.txt arquivo3.txt arquivo5.txt # Logs numerados de 00 a 99 user@linux:~$ ls log[0-9][0-9].txt log01.txt log15.txt log42.txt log99.txt # Negação: arquivos que NÃO começam com 'a' ou 'b' user@linux:~$ ls [^ab]* config.txt documento.pdf foto.jpg

Casos clássicos: logs numerados log[0-9][0-9].txt — versões v[1-3].*.zip — combinar com asterisco [a-z]*[0-9].txt

🗂️ Chaves { } — Expansão Múltipla

{ } Expande em várias opções de uma só vez

Não filtra arquivos existentes — gera os nomes. Perfeito para criar vários arquivos/pastas de uma vez.

touch arquivo{1,2,3}.txt → arquivo1.txt, arquivo2.txt, arquivo3.txt
touch test{1..5}.txt → test1.txt, test2.txt ... test5.txt
mkdir -p projeto/{src,docs,tests} → 3 pastas criadas de uma vez
cp config.txt{,.backup} → config.txt.backup (backup rápido!)
chaves avançadas
# Passo: de 2 em 2 user@linux:~$ echo {0..10..2} 0 2 4 6 8 10 # Estrutura de projeto completa user@linux:~$ mkdir -p empresa{1,2}/{vendas,ti,rh} # Cria: empresa1/vendas, empresa1/ti, empresa1/rh, empresa2/... # Listar .conf OU .allow em /etc user@linux:~$ ls /etc/*{conf,allow} httpd.conf hosts.allow syslog.conf tcp.allow # Renomear extensão user@linux:~$ mv foto{.jpg,.jpeg} # foto.jpg → foto.jpeg

⚖️ Diferença Crucial: [ ] vs { }

📋 [ ] Colchetes — FILTRA

  • Escolhe 1 caractere do conjunto
  • Só mostra se o arquivo já existir
  • Usa: buscar/filtrar arquivos

🗂️ { } Chaves — EXPANDE

  • Gera várias palavras completas
  • Mostra todos os nomes, existindo ou não
  • Usa: criar/nomear arquivos e pastas
[ ] vs { } na prática
# [ ] = FILTRA — só mostra o que existe user@linux:~$ ls file[123].txt file1.txt file3.txt # file2.txt não existe → não aparece # { } = EXPANDE — gera todos os nomes user@linux:~$ echo file{1,2,3}.txt file1.txt file2.txt file3.txt # Mostra todos, existam ou não

🔎 grep — Filtro com Expressões Regulares

Enquanto wildcards operam em nomes de arquivo, o grep filtra o conteúdo de arquivos usando Expressões Regulares (regex).

💡 Sintaxe: grep [opções] "padrão" arquivo
O grep retorna as linhas que combinam com o padrão.

grep básico
# Buscar "root" em /etc/passwd user@linux:~$ grep "root" /etc/passwd root:x:0:0:root:/root:/bin/bash # Ignorar maiúsculas/minúsculas (-i) user@linux:~$ grep -i "erro" /var/log/syslog Nov 12 erro: disk I/O Nov 13 ERRO: network timeout # Contar ocorrências user@linux:~$ grep -c "failed" /var/log/auth.log 47

⚑ Flags mais usadas

-i
Case insensitive
(ignora maiús./minús.)
-r
Recursivo em
subdiretórios
-n
Mostra número
da linha
-c
Conta ocorrências
(não mostra linhas)
-v
Inverte: mostra
o que não combina
-E
Regex estendida
(+, ?, |)

🧩 Expressões Regulares (Regex)

Regex é uma linguagem de padrões muito mais poderosa que os wildcards do shell. Usada dentro do grep, sed e awk.

^ e $
⚓ Âncoras de posição
^root → linha começa com root admin$ → linha termina com admin ^$ → linha vazia
[ ] e .
📋 Classes de caractere
[0-9] → qualquer dígito [a-zA-Z] → qualquer letra . → qualquer caractere
* + ? {}
🔢 Quantificadores
a* → zero ou mais 'a' a+ → um ou mais 'a' a? → zero ou um 'a' a{3} → exatamente 3 'a'
| e ( )
🔀 Alternativas e grupos
cat|dog → cat OU dog (ha)+ → ha, haha, hahaha... [^abc] → NÃO é a, b ou c
grep com regex
# Linhas que COMEÇAM com "root" user@linux:~$ grep "^root" /etc/passwd root:x:0:0:root:/root:/bin/bash # Linhas que TERMINAM com "/bash" user@linux:~$ grep "/bash$" /etc/passwd root:x:0:0:root:/root:/bin/bash cesar:x:1000:1000::/home/cesar:/bin/bash # Buscar "error" OU "fail" (grep -E = regex estendida) user@linux:~$ grep -E "error|fail" /var/log/syslog Nov 12 10:23 error: connection refused Nov 12 11:45 fail: authentication failed # Mostrar número da linha + recursivo em /etc user@linux:~$ grep -rn "PermitRootLogin" /etc/ssh/ /etc/ssh/sshd_config:38:PermitRootLogin yes

🆚 Wildcards do Shell vs Regex

⚠️ Atenção! O * do shell e o * do regex são diferentes! No shell, * = zero ou mais caracteres. No regex, * = zero ou mais rep. do caractere anterior.

Símbolo No Shell (Wildcard) No Regex (grep)
* Zero ou mais caracteres Zero ou mais do char anterior
? Exatamente 1 caractere Zero ou um do char anterior
. Literal (ponto mesmo) Qualquer 1 caractere
[abc] Um de: a, b ou c (igual) Um de: a, b ou c (igual)
^ Não tem equivalente Início da linha
mesmo símbolo, comportamento diferente
# Shell: * = qualquer coisa nos nomes dos arquivos user@linux:~$ ls *.txt a.txt documento.txt relatorio_final.txt # Regex: .* = qualquer coisa no conteúdo da linha user@linux:~$ grep "^root.*bash$" /etc/passwd root:x:0:0:root:/root:/bin/bash # ^root = começa com root | .* = qualquer coisa | bash$ = termina com bash

🚨 Erros Comuns e Como Evitar

🔥 PERIGOSO: rm com wildcard sem verificar

O rm *.txt deleta arquivos de forma irreversível no Linux. Sempre use ls primeiro para ver o que será afetado!

regra de ouro — ls antes do rm
# ❌ PERIGOSO: pode deletar arquivos importantes! rm *.txt # ✅ SEGURO: veja o que vai ser afetado primeiro user@linux:~$ ls *.txt arquivo1.txt importante.txt teste.txt # Confirme que são os arquivos certos user@linux:~$ rm *.txt # Agora sim!

⚠️ Erro 1 — Confundir ? com *: file?.txt não encontra file.txt (zero caracteres). Use file*.txt para incluir zero chars.

⚠️ Erro 2 — Intervalo invertido: [z-a] está errado (ordem decrescente). Use sempre [a-z] (ordem crescente).

⚠️ Erro 3 — Confundir [ ] com { }: [1,2,3] não é lista de opções, é conjunto de chars. Para lista de opções use {1,2,3}.

🎯 Caso Prático: Administrando um Servidor

Você é o administrador. Precisa organizar logs, criar estrutura de projeto e investigar acessos.

admin@servidor — situações reais
# 1. Ver todos os logs de 2024 admin@srv:~$ ls log_2024*.txt log_2024-01.txt log_2024-02.txt log_2024-03.txt ... # 2. Logs só do primeiro semestre (meses 01 a 06) admin@srv:~$ ls log_2024-0[1-6].txt log_2024-01.txt log_2024-02.txt ... log_2024-06.txt # 3. Criar estrutura de projeto em 1 comando admin@srv:~$ mkdir -p projeto_web/{html,css,js,img}/{dev,prod} # Cria 8 pastas organizadas de uma vez! # 4. Investigar tentativas de login falhas admin@srv:~$ grep -c "Failed password" /var/log/auth.log 247 # 5. Ver de quais IPs vieram as tentativas admin@srv:~$ grep "Failed password" /var/log/auth.log | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" 192.168.1.100 10.0.0.55 203.0.113.42 # 6. Backup das configs de apache, nginx e mysql admin@srv:~$ cp /etc/{apache2,nginx,mysql}/*.conf /backup/ # Copia configs dos 3 serviços de uma vez!

📋 Referência Rápida

? 1 char exato file?.txt
* 0 ou + chars *.log
[ ] Conjunto [0-9].txt
{ } Expansão {src,docs}
Metacaractere Significado Exemplo Resultado
?Exatamente 1 charfile?.txtfile1.txt, filea.txt
*Zero ou + chars*.logsystem.log, error.log
[abc]Um de: a, b ou ctest[123].txttest1.txt, test2.txt, test3.txt
[a-z]Intervalo: a até zfile[a-c].txtfilea.txt, fileb.txt, filec.txt
[^a]Qualquer, EXCETO a[^f]*Não começa com f
{a,b}Expande: a e b{doc,img}.zipdoc.zip, img.zip
{1..5}Intervalo automáticofile{1..5}.txtfile1.txt até file5.txt
^ (regex)Início da linhagrep "^root"Linhas que começam com root
$ (regex)Fim da linhagrep "bash$"Linhas que terminam com bash

🛡️ Regra de Ouro: Sempre teste com ls ou echo antes de usar rm, mv ou cp com metacaracteres!

❓ Verifique seu Conhecimento

O que representa o metacaractere * no shell Bash?

AQualquer caractere exatamente uma vez
BZero ou mais caracteres quaisquer (wildcard)
CApenas dígitos numéricos
DO início de uma linha
* no shell = zero ou mais caracteres: ls *.txt lista todos os .txt. Cuidado: no regex, * significa zero ou mais do caractere anterior.

Qual metacaractere representa exatamente um único caractere qualquer no shell?

A*
B+
C?
D.
✓ O ? no shell substitui exatamente 1 caractere: ls arquivo?.txt encontra arquivo1.txt, arquivoA.txt, mas não arquivo10.txt (2 chars).

O que faz o comando ls [abc]*.txt?

ALista arquivos .txt que começam com a, b ou c
BLista arquivos cujos nomes contêm [abc] literalmente
CLista arquivos .txt que terminam com a, b ou c
DLista arquivos com extensão abc.txt
[abc] combina um único caractere que seja a, b ou c. Combinado com * = tudo que começa com a, b ou c. Use [a-z] para intervalos.

Qual comando usa expressão regular para buscar linhas que começam com ‘root’ em /etc/passwd?

Afind /etc/passwd -name "^root"
Bls /etc/passwd | filter "^root"
Ccat /etc/passwd | match "^root"
Dgrep "^root" /etc/passwd
✓ O grep aceita regex: ^ ancora ao início da linha. Use grep -E (ou egrep) para regex estendida com +, ?, |.