Guia Completo: Expressões Regulares no Linux com Ferramentas de Linha de Comando
Aprenda a utilizar expressões regulares no Linux com ferramentas essenciais como grep, sed, awk, e find. Descubra como automatizar buscas e manipulações de texto com exemplos práticos e detalhados.
Sumário
- Introdução ao Uso de Expressões Regulares
- Meta Caracteres
- Âncoras
- Representantes
- Quantificadores
- POSIX e Expressões Regulares Estendidas (ER)
- Usando o AWK com Expressões Regulares
- Usando o SED com Expressões Regulares
- Usando o GREP, EGREP e FGREP com Expressões Regulares
- Usando o FIND com Expressões Regulares
- Conclusão
1. Introdução ao Uso de Expressões Regulares
Objetivo
Nesta seção, vamos introduzir o conceito de expressões regulares (regex) e entender sua aplicação em buscas e manipulações de texto no Linux. Vamos explorar como regex é utilizado para realizar filtros e padrões específicos em diferentes arquivos e textos.
O Que São Expressões Regulares?
As expressões regulares, ou regex, são sequências de caracteres que formam um padrão de busca. Esse padrão permite realizar buscas e substituições precisas em grandes volumes de texto ou em arquivos específicos. No Linux, regex é amplamente suportado por várias ferramentas de linha de comando, como grep, sed, awk, find, entre outras.
Principais Aplicações de Regex
- Buscar padrões específicos em arquivos de texto, como endereços de e-mail, números de telefone, datas, etc.
- Filtrar resultados de busca para encontrar correspondências exatas.
- Substituir texto de maneira automatizada e rápida.
- Processar e manipular arquivos de texto, especialmente em análise de logs e dados de grande volume.
Ferramentas que Suportam Regex no Linux
Algumas das ferramentas mais comuns que suportam regex incluem:
- grep: Realiza buscas de texto em arquivos com base em padrões regex.
- sed: Editor de texto de fluxo que utiliza regex para substituições e edições de texto.
- awk: Linguagem de programação para processamento de texto, capaz de usar regex em buscas e filtros.
- find: Utiliza regex para localizar arquivos e diretórios específicos.
Começando a Escrever e Testar Expressões Regulares
Para começar a testar regex, uma boa abordagem é usar o comando grep para buscar padrões em um arquivo ou diretamente em um texto.
Exemplo 1: Procurando Palavras Específicas
No exemplo a seguir, procuramos por uma palavra específica dentro de um arquivo:
1
echo "Este é um teste de regex no Linux" | grep "teste"
Exemplo 2: Procurando Padrões Simples
Você pode usar regex para encontrar padrões complexos em arquivos. Por exemplo, para encontrar todas as linhas de um arquivo documento.txt que contenham números, você pode usar:
1
grep '[0-9]' documento.txt
Práticas Recomendadas ao Trabalhar com Regex
- Comece com Padrões Simples: Entenda como o regex básico funciona antes de avançar para padrões mais complexos.
- Use Ferramentas Interativas: Ferramentas como o
grep,sedeawkpermitem testar e ajustar expressões regulares facilmente. - Conheça as Variantes de Regex: No Linux, você pode encontrar variações, como regex básico (usado em
grep) e regex estendido (usado emegrep).
2. Meta Caracteres
Objetivo
Compreender os meta caracteres das expressões regulares e seu uso em diferentes contextos para realizar buscas precisas no Linux. Vamos explorar como cada um funciona e aplicar exemplos práticos de busca.
O Que São Meta Caracteres?
Os meta caracteres são símbolos especiais usados nas expressões regulares que representam ações específicas. Eles permitem que regex seja mais flexível e poderoso, permitindo buscar padrões complexos com eficiência.
Principais Meta Caracteres e Suas Funções
| Meta Caractere | Descrição | Exemplo de Uso |
|---|---|---|
. | Representa qualquer caractere individual (exceto nova linha). | g.e encontra “gato”, “gite”, “gipe”. |
* | Indica zero ou mais ocorrências do caractere anterior. | a* encontra “a”, “aa”, ou ausência de “a”. |
+ | Indica uma ou mais ocorrências do caractere anterior. | a+ encontra “a”, “aa”, mas não ausência de “a”. |
[ ] | Conjunto de caracteres. Busca qualquer caractere especificado dentro dos colchetes. | [abc] encontra “a”, “b”, ou “c”. |
( ) | Agrupa caracteres. Usado para delimitar partes de um padrão. | (ab)+ encontra “ab”, “abab”, “ababab”. |
| | Operador de alternância. Busca padrões alternativos (OR). | carro|moto encontra “carro” ou “moto”. |
\ | Caracter de escape. Indica que o próximo caractere deve ser interpretado literalmente. | \$ encontra o símbolo “$”. |
Exemplos Práticos de Meta Caracteres
Usando o Ponto (
.) para Encontrar Qualquer CaractereO ponto
.representa qualquer caractere. No exemplo a seguir, ele é usado para buscar palavras que começam com “c” e terminam com “r”, com qualquer caractere entre elas:1
echo -e "caro\ncair\ncor" | grep 'c.r'
Resultado:
1 2
caro cor
Usando o Asterisco (
*) para Zero ou Mais OcorrênciasO asterisco
*representa zero ou mais ocorrências do caractere anterior. No exemplo, ele encontra todas as palavras que contêm “ab”, seguido de zero ou mais letras “c”:1
echo -e "abc\nabcc\nabccc\nab" | grep 'abc*'
Resultado:
1 2 3
abc abcc abccc
Usando o Mais (
+) para Uma ou Mais OcorrênciasO sinal
+indica uma ou mais ocorrências do caractere anterior. No exemplo, ele busca “ab” seguido de uma ou mais letras “c”:1
echo -e "abc\nabcc\nabccc\nab" | grep -E 'abc+'
Resultado:
1 2 3
abc abcc abccc
Usando Colchetes (
[ ]) para Conjunto de CaracteresOs colchetes
[ ]permitem especificar um conjunto de caracteres. No exemplo, ele encontra palavras que contêm qualquer letra entre “a” e “c”:1
echo -e "ana\nbob\ncat\ndog" | grep '[abc]'
Resultado:
1 2 3
ana bob cat
Usando Parênteses (
( )) para AgrupamentoOs parênteses agrupam partes da expressão para aplicar operadores em conjunto. No exemplo, ele encontra uma ou mais ocorrências da sequência “ab”:
1
echo -e "ab\nabab\nababab\nac" | grep -E '(ab)+'
Resultado:
1 2
abab ababab
Usando o Operador Alternativo (
|)O operador
|representa uma alternativa (OR) entre padrões. No exemplo, ele encontra linhas que contêm “cão” ou “gato”:1
echo -e "cão\ngato\npássaro" | grep 'cão|gato'
Resultado:
1 2
cão gato
Usando a Barra Invertida (
\) para Escapar Caracteres EspeciaisA barra invertida
\é usada para indicar que o próximo caractere deve ser interpretado literalmente. Por exemplo, para buscar o símbolo$:1
echo -e "valor1$\nvalor2\nvalor3$" | grep '\$'
Resultado:
1 2
valor1$ valor3$
Prática Recomendada
- Teste Cada Meta Caractere Separadamente: Familiarize-se com o comportamento de cada meta caractere antes de combiná-los.
- Combine Caracteres para Busca Complexa: À medida que ganhar confiança, experimente combinar os meta caracteres para criar padrões mais complexos.
3. Âncoras
Objetivo
Aprender a usar âncoras nas expressões regulares para limitar buscas a posições específicas em uma linha, como o início ou o fim. Isso é muito útil para realizar buscas precisas e filtrar texto de maneira mais eficiente.
O Que São Âncoras?
As âncoras são símbolos usados nas expressões regulares para indicar uma posição específica em uma linha de texto. Elas não correspondem a caracteres reais, mas sim a posições, como o início ou o fim de uma linha. As âncoras mais comuns são:
^: Início de linha$: Fim de linha
Principais Âncoras e Suas Funções
| Âncora | Descrição | Exemplo de Uso |
|---|---|---|
^ | Limita a busca ao início da linha. | ^A encontra linhas que começam com “A”. |
$ | Limita a busca ao fim da linha. | z$ encontra linhas que terminam com “z”. |
Exemplos Práticos de Uso de Âncoras
Usando
^para Encontrar Palavras no Início da LinhaO símbolo
^é usado para limitar a busca ao início da linha. No exemplo abaixo, ele busca linhas que começam com a palavra “início”:1
echo -e "início de uma linha\nfim de outra linha" | grep '^início'
Resultado:
1
início de uma linha
Usando
$para Encontrar Palavras no Fim da LinhaO símbolo
$limita a busca ao final da linha. No exemplo, ele encontra linhas que terminam com a palavra “fim”:1
echo -e "linha no início\noutra no fim" | grep 'fim$'
Resultado:
1
outra no fim
Combinando
^e$para Buscar Linhas EspecíficasAo usar
^e$juntos, é possível buscar uma linha exata. O exemplo abaixo busca linhas que contêm apenas a palavra “exata”:1
echo -e "exata\nexata mesmo\nquase exata" | grep '^exata$'
Resultado:
1
exata
Buscando Palavras que Aparecem no Início e Fim da Linha
Usando âncoras, você pode encontrar palavras em posições específicas. No exemplo a seguir, buscamos palavras que começam com “A” e terminam com “a”:
1
echo -e "Ana\nAmiga\nAmor\naula" | grep '^A.*a$'
Resultado:
1
Ana
Filtrando Linhas Vázias
Para encontrar linhas vazias em um arquivo, usamos
^$, que indica o início e o fim da linha sem conteúdo no meio:1
echo -e "linha 1\n\nlinha 2" | grep '^$'
Resultado:
1
(linha vazia)
Tabela: Resumo de Âncoras Comuns em Expressões Regulares
| Âncora | Descrição | Exemplo |
|---|---|---|
^ | Início de linha | ^início para buscar o início. |
$ | Fim de linha | fim$ para buscar o final. |
^$ | Linha vazia | ^$ para encontrar linhas vazias. |
Exercícios Práticos com Âncoras
Buscar Linhas que Começam com um Número
Busque linhas em um arquivo que comecem com um número:
1
grep '^[0-9]' arquivo.txt
Encontrar Linhas que Terminam com uma Letra Específica
Encontre todas as linhas que terminam com “s”:
1
grep 's$' arquivo.txt
Verificar Linhas Vázias
Verifique se há linhas vazias em um arquivo de texto:
1
grep '^$' arquivo.txt
Dicas de Prática
- Combine Âncoras com Meta Caracteres: Usar âncoras junto com outros meta caracteres, como
*e., permite buscas mais precisas. - Âncoras para Validação de Padrões: Âncoras são ideais para validar entradas que precisam ter um formato específico, como linhas que começam com um prefixo específico ou terminam com um sufixo.
4. Representantes
Objetivo
Nesta seção, vamos explorar o uso de representantes (ou classes de caracteres) em expressões regulares. Eles permitem especificar conjuntos ou intervalos de caracteres e são úteis para definir padrões complexos e altamente personalizados em buscas de texto.
O Que São Representantes?
Os representantes são caracteres e símbolos que permitem a definição de conjuntos de caracteres dentro de uma expressão regular. Em vez de especificar cada caractere individualmente, podemos definir um conjunto ou intervalo, tornando as buscas mais flexíveis e eficientes.
Principais Representantes de Caracteres
| Representante | Descrição | Exemplo de Uso |
|---|---|---|
[abc] | Corresponde a qualquer caractere entre “a”, “b” e “c”. | [aeiou] encontra qualquer vogal. |
[a-z] | Corresponde a qualquer caractere minúsculo entre “a” e “z”. | [0-9] encontra qualquer dígito. |
[^ ] | Exclui caracteres. Corresponde a qualquer caractere exceto os especificados. | [^aeiou] exclui vogais. |
[A-Z] | Corresponde a qualquer caractere maiúsculo entre “A” e “Z”. | [A-Z] encontra letras maiúsculas. |
[a-zA-Z0-9] | Corresponde a qualquer letra ou número (intervalo alfanumérico). | [a-zA-Z0-9] encontra letras e números. |
Exemplos Práticos de Representantes
Encontrar Qualquer Vogal
No exemplo abaixo, usamos
[aeiou]para encontrar qualquer vogal em uma sequência de palavras:1
echo -e "casa\nmesa\nporta" | grep '[aeiou]'
Resultado:
1 2 3
casa mesa porta
Encontrar Qualquer Dígito
Para localizar qualquer número em uma sequência de texto, usamos
[0-9]:1
echo -e "abc123\n456def\nxyz789" | grep '[0-9]'
Resultado:
1 2 3
abc123 456def xyz789
Excluir Conjuntos Específicos com
[^ ]O uso de
[^ ]permite excluir caracteres específicos. No exemplo, excluímos todas as vogais:1
echo -e "casa\nmesa\nporta" | grep '[^aeiou]'
Resultado:
1 2 3
casa mesa porta
Buscar Letras Maiúsculas
Para localizar palavras que contenham letras maiúsculas, podemos usar
[A-Z]:1
echo -e "Casa\nmesa\nPorta" | grep '[A-Z]'
Resultado:
1 2
Casa Porta
Buscar Letras e Números em uma Única Expressão
Para localizar caracteres alfanuméricos (letras e números), usamos
[a-zA-Z0-9]:1
echo -e "abc123\n456DEF\n!@#" | grep '[a-zA-Z0-9]'
Resultado:
1 2
abc123 456DEF
Tabela de Representantes Comuns em Expressões Regulares
| Representante | Descrição | Exemplo de Uso |
|---|---|---|
[aeiou] | Qualquer vogal | [aeiou] |
[0-9] | Qualquer dígito de 0 a 9 | [0-9] |
[A-Z] | Qualquer letra maiúscula | [A-Z] |
[a-zA-Z0-9] | Qualquer caractere alfanumérico | [a-zA-Z0-9] |
[^aeiou] | Exclui caracteres (não-vogais) | [^aeiou] |
Exercícios Práticos com Representantes
Encontrar Linhas com Letras Maiúsculas
Use
[A-Z]para encontrar linhas que contêm pelo menos uma letra maiúscula:1
grep '[A-Z]' arquivo.txt
Buscar Números Telefônicos
Para localizar números de telefone no formato “(XX) XXXX-XXXX”, use
[0-9]para capturar cada dígito:1
grep '[(][0-9][0-9][)] [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' arquivo.txt
Excluir Linhas com Vogais
Para encontrar linhas que não contenham nenhuma vogal, use
[^aeiouAEIOU]:1
grep '^[^aeiouAEIOU]*$' arquivo.txt
Dicas de Prática
- Combine Representantes e Âncoras: Combine representantes com âncoras
^e$para buscas precisas em posições específicas da linha. - Use Intervalos com Cuidado: Definir intervalos como
[a-zA-Z]pode incluir caracteres que não são esperados. Teste bem as expressões regulares para garantir que capturam exatamente o que deseja.
5. Quantificadores
Objetivo
Nesta seção, vamos aprender como os quantificadores permitem controlar o número de ocorrências de um caractere ou grupo em expressões regulares. Isso é útil para ajustar as buscas a padrões que aparecem um número específico de vezes.
O Que São Quantificadores?
Os quantificadores indicam a quantidade de ocorrências de um caractere ou padrão que devem ser consideradas em uma expressão regular. Eles tornam as expressões regulares mais flexíveis, permitindo capturar padrões com diferentes frequências de repetição.
Principais Quantificadores e Suas Funções
| Quantificador | Descrição | Exemplo de Uso |
|---|---|---|
* | Zero ou mais ocorrências do caractere anterior. | a* encontra “”, “a”, “aaa”. |
+ | Uma ou mais ocorrências do caractere anterior. | a+ encontra “a”, “aaa”. |
? | Zero ou uma ocorrência do caractere anterior. | a? encontra “” ou “a”. |
{n} | Exatamente n ocorrências do caractere anterior. | a{3} encontra “aaa”. |
{n,} | n ou mais ocorrências do caractere anterior. | a{2,} encontra “aa”, “aaa”. |
{n,m} | Entre n e m ocorrências do caractere anterior. | a{1,3} encontra “a”, “aa”, “aaa”. |
Exemplos Práticos de Uso dos Quantificadores
Usando
*para Zero ou Mais OcorrênciasO quantificador
*encontra zero ou mais ocorrências do caractere anterior. No exemplo, ele busca linhas com zero ou mais “a” seguidos por “b”:1
echo -e "b\nab\naab" | grep 'a*b'
Resultado:
1 2 3
b ab aab
Usando
+para Uma ou Mais OcorrênciasO quantificador
+busca uma ou mais ocorrências do caractere anterior. No exemplo, ele localiza “b” precedido de uma ou mais letras “a”:1
echo -e "b\nab\naab" | grep -E 'a+b'
Resultado:
1 2
ab aab
Usando
?para Zero ou Uma OcorrênciaO quantificador
?busca zero ou uma ocorrência do caractere anterior. No exemplo, ele encontra “cor” e “cores”, já que “s” é opcional:1
echo -e "cor\ncores\ncorar" | grep 'cores?'
Resultado:
1 2
cor cores
Usando
{n}para ExatamentenOcorrênciasO quantificador
{n}encontra exatamentenocorrências do caractere anterior. No exemplo, ele busca exatamente duas letras “a” seguidas de “b”:1
echo -e "ab\naab\naaab" | grep 'a{2}b'
Resultado:
1
aab
Usando
{n,}paranou Mais OcorrênciasCom
{n,}, o regex buscanou mais ocorrências do caractere anterior. No exemplo, ele encontra “b” precedido de duas ou mais letras “a”:1
echo -e "ab\naab\naaab" | grep 'a{2,}b'
Resultado:
1 2
aab aaab
Usando
{n,m}para EntrenemOcorrênciasO quantificador
{n,m}define uma faixa de ocorrências. No exemplo, ele encontra “b” precedido de uma a três letras “a”:1
echo -e "ab\naab\naaab\naaaab" | grep 'a{1,3}b'
Resultado:
1 2 3
ab aab aaab
Tabela: Quantificadores Comuns em Expressões Regulares
| Quantificador | Descrição | Exemplo |
|---|---|---|
* | Zero ou mais ocorrências | a* |
+ | Uma ou mais ocorrências | a+ |
? | Zero ou uma ocorrência | a? |
{n} | Exatamente n ocorrências | a{3} |
{n,} | n ou mais ocorrências | a{2,} |
{n,m} | Entre n e m ocorrências | a{1,3} |
Exercícios Práticos com Quantificadores
Buscar Palavras com Múltiplas Letras Específicas
Use
o+para encontrar palavras com uma ou mais letras “o”:1
echo -e "ola\noooo\nok" | grep 'o+'
Procurar Códigos de 3 Dígitos
Utilize
[0-9]{3}para encontrar linhas com exatamente três números seguidos:1
grep '[0-9]{3}' arquivo.txt
Encontrar Palavras com Intervalo de Letras Repetidas
Para encontrar palavras que contenham entre duas e quatro letras “a”, use
a{2,4}:1
echo -e "a\naa\naaa\naaaa\naaaaa" | grep 'a{2,4}'
Dicas de Prática
- Teste Quantificadores Individualmente: Familiarize-se com cada quantificador para entender seu efeito antes de combiná-los.
- Combine com Outros Meta Caracteres: Quantificadores são mais eficazes quando usados junto com outros meta caracteres e âncoras, como
^e$.
6. POSIX e Expressões Regulares Estendidas (ER)
Objetivo
Nesta seção, vamos explorar as diferenças entre expressões regulares POSIX e expressões regulares estendidas (ER) no Linux. Compreender essas diferenças ajuda a escolher a forma correta de regex para comandos específicos e ambientes de trabalho distintos.
O Que São POSIX e Expressões Regulares Estendidas?
No Linux, as expressões regulares seguem duas principais convenções:
- POSIX BRE (Basic Regular Expressions): É o padrão básico usado em muitos comandos, incluindo
greppor padrão. - POSIX ERE (Extended Regular Expressions): É uma forma mais avançada, que permite o uso de operadores e caracteres adicionais sem a necessidade de escapes. Comandos como
egrep(ougrep -E) utilizam ER por padrão.
| Tipo | Características | Exemplo de Uso |
|---|---|---|
| POSIX BRE | Usa operadores como ?, +, {}, | e () com escape \. | grep 'a\{2\}' para duas letras “a”. |
| POSIX ERE | Permite o uso direto de operadores como ?, +, {}, |, e () sem escape, simplificando a sintaxe. | grep -E 'a{2}' para duas letras “a”. |
Principais Diferenças entre POSIX BRE e POSIX ERE
| Operador | POSIX BRE | POSIX ERE | Descrição |
|---|---|---|---|
? | Necessita de escape (\?) | Usado diretamente (?) | Indica zero ou uma ocorrência. |
+ | Necessita de escape (\+) | Usado diretamente (+) | Indica uma ou mais ocorrências. |
{n,m} | Necessita de escape (\{n,m\}) | Usado diretamente ({n,m}) | Especifica intervalo de ocorrências. |
| | Necessita de escape (\|) | Usado diretamente (|) | Alternativa lógica (OR). |
() | Necessita de escape (\( \)) | Usado diretamente (( e )) | Agrupa expressões. |
Exemplos Práticos de POSIX BRE e ERE
Usando POSIX BRE com Escape para Quantificadores
Em POSIX BRE, para especificar que uma letra deve aparecer duas vezes consecutivas, você deve usar o escape
\{2\}:1
echo -e "aa\nab\naaa" | grep 'a\{2\}'
Resultado:
1 2
aa aaa
Usando POSIX ERE para Simplificar Expressões
Em POSIX ERE, o mesmo padrão pode ser escrito sem os escapes adicionais, facilitando a leitura e edição das expressões:
1
echo -e "aa\nab\naaa" | grep -E 'a{2}'
Resultado:
1 2
aa aaa
Usando Alternativas (OR) em POSIX BRE e ERE
Para buscar alternativas como “cão” ou “gato” com POSIX BRE, é necessário usar o escape
\|. No POSIX ERE, basta usar|diretamente:- POSIX BRE:
1
echo -e "cão\ngato\npássaro" | grep 'cão\|gato'
- POSIX ERE:
1
echo -e "cão\ngato\npássaro" | grep -E 'cão|gato'
Resultado para ambos:
1 2
cão gato
- POSIX BRE:
Agrupamento com Parênteses em POSIX BRE e ERE
Para agrupar partes de uma expressão em POSIX BRE, você precisa usar
\(e\), enquanto em POSIX ERE basta usar(e):- POSIX BRE:
1
echo -e "aaa\nabc\naac" | grep 'a\(a\|b\)c'
- POSIX ERE:
1
echo -e "aaa\nabc\naac" | grep -E 'a(a|b)c'
Resultado para ambos:
1 2
abc aac
- POSIX BRE:
Tabelas de Referência para POSIX BRE e ERE
Operadores POSIX BRE
| Operador | Função | Exemplo de Uso |
|---|---|---|
\? | Zero ou uma ocorrência | a\? |
\+ | Uma ou mais ocorrências | a\+ |
\| | Alternativa (OR) | a\|b |
\{n,m\} | Intervalo de ocorrências | a\{2,3\} |
\( \) | Agrupamento | \(ab\)+ |
Operadores POSIX ERE
| Operador | Função | Exemplo de Uso |
|---|---|---|
? | Zero ou uma ocorrência | a? |
+ | Uma ou mais ocorrências | a+ |
| | Alternativa (OR) | a|b |
{n,m} | Intervalo de ocorrências | a{2,3} |
( ) | Agrupamento | (ab)+ |
Exercícios Práticos com POSIX BRE e ERE
Buscar Palavras com Intervalos de Caracteres com POSIX BRE
Use
greppara encontrar palavras com exatamente duas letras “a” seguidas de “b”:1
echo -e "ab\naab\naaab" | grep 'a\{2\}b'
Usar Alternativas com POSIX ERE
Com
grep -E, busque por linhas que contenham “carro” ou “moto”:1
echo -e "carro\nmoto\nbarco" | grep -E 'carro|moto'
Agrupando e Usando Quantificadores com POSIX ERE
Busque por linhas que contenham “ana” ou “maria” repetidos uma ou mais vezes:
1
echo -e "ana\nmaria\nanamaria" | grep -E '(ana|maria)+'
Dicas de Prática
- Escolha o Tipo de Regex Certo: Em comandos como
grep, usargrep -Epara POSIX ERE pode simplificar a expressão regular e evitar o uso de escapes desnecessários. - Teste com Diferentes Comandos: Ferramentas como
awkesedsuportam regex com POSIX ERE, o que pode ser útil em scripts e pipelines.
7. Usando o AWK com Expressões Regulares
Objetivo
Explorar o uso de expressões regulares no comando AWK para buscar, filtrar e manipular texto. AWK é uma linguagem de processamento de texto com recursos robustos que permitem criar filtros e transformar dados de maneira avançada.
O Que é AWK?
O AWK é uma linguagem de programação e uma ferramenta poderosa para manipulação de texto em sistemas Unix/Linux. Ele permite processar texto em linhas e colunas, oferecendo suporte a expressões regulares para realizar buscas e transformações complexas.
Sintaxe Básica de AWK
A sintaxe do AWK usa padrões regex para aplicar comandos em textos ou arquivos. A estrutura básica é:
1
awk '/padrão/ { ação }' arquivo.txt
/padrão/: O padrão de expressão regular a ser buscado.{ ação }: A ação a ser realizada quando o padrão for encontrado (ex.: imprimir, substituir, etc.).
Principais Funcionalidades de AWK com Regex
| Comando AWK | Descrição | Exemplo de Uso |
|---|---|---|
/padrão/ { print $0 } | Imprime linhas que correspondem ao padrão regex. | /erro/ { print $0 } |
! /padrão/ { ação } | Aplica a ação a linhas que não correspondem ao padrão. | ! /sucesso/ { print $0 } |
/padrão1|padrão2/ { ação } | Usa alternância para combinar dois padrões diferentes. | /erro|falha/ { print $0 } |
$campo ~ /padrão/ { ação } | Aplica a ação a linhas onde o campo especificado corresponde ao padrão. | $3 ~ /OK/ { print $1, $3 } |
$campo !~ /padrão/ { ação } | Aplica a ação a linhas onde o campo especificado não corresponde ao padrão. | $2 !~ /erro/ { print $0 } |
Exemplos Práticos de Regex com AWK
Imprimir Linhas que Contêm uma Palavra Específica
Para imprimir todas as linhas que contêm a palavra “erro” em um arquivo
log.txt:1
awk '/erro/ { print $0 }' log.txt
Resultado: Todas as linhas que contêm “erro” serão exibidas.
Excluir Linhas com Determinado Padrão
Para imprimir linhas que não contêm a palavra “sucesso”:
1
awk '! /sucesso/ { print $0 }' log.txt
Usar Alternância para Combinar Padrões
Você pode usar
|para buscar várias palavras. No exemplo, buscamos por linhas que contêm “erro” ou “falha”:1
awk '/erro|falha/ { print $0 }' log.txt
Buscar em Campos Específicos com Regex
Se você quiser verificar o terceiro campo de cada linha e buscar por um padrão específico, como “OK”, use
$3 ~ /OK/:1
awk '$3 ~ /OK/ { print $1, $3 }' log.txt
Excluir Linhas com Padrão Específico em um Campo
Para excluir linhas onde o segundo campo contém “erro”:
1
awk '$2 !~ /erro/ { print $0 }' log.txt
Manipulação Avançada de Texto com AWK
AWK permite realizar substituições e manipulações avançadas ao combinar regex com funções internas:
Substituir Texto em um Campo Específico
Use a função
gsub()para substituir um texto específico dentro de uma coluna. No exemplo abaixo, substituímos “ERRO” por “AVISO” no segundo campo:1
awk '{ gsub(/ERRO/, "AVISO", $2); print $0 }' log.txt
Imprimir Apenas Linhas que Começam com um Padrão
Para imprimir linhas que começam com “WARN”:
1
awk '/^WARN/ { print $0 }' log.txt
Imprimir Linhas que Terminam com um Padrão
Para imprimir linhas que terminam com “OK”:
1
awk '/OK$/ { print $0 }' log.txt
Exercícios Práticos com AWK e Regex
Imprimir Linhas com Palavras Específicas
Use AWK para buscar linhas que contenham “erro” ou “falha” em
relatorio.txt:1
awk '/erro|falha/ { print $0 }' relatorio.txt
Substituir uma Palavra em Linhas Selecionadas
Substitua a palavra “pendente” por “em processo” no quarto campo, apenas em linhas que contêm “processo”:
1
awk '/processo/ { gsub(/pendente/, "em processo", $4); print $0 }' relatorio.txt
Imprimir Linhas com Determinado Número de Dígitos em um Campo
Para imprimir apenas as linhas onde o segundo campo contém um número de três dígitos:
1
awk '$2 ~ /^[0-9]{3}$/ { print $0 }' relatorio.txt
Dicas de Prática
- Combine Regex e Campos: Usar regex em campos específicos (
$campo ~ /padrão/) é uma ótima maneira de refinar as buscas. - Aproveite as Funções Internas do AWK: Funções como
gsub()esub()permitem manipulações adicionais de texto, tornando AWK ideal para tarefas avançadas.
8. Usando o SED com Expressões Regulares
Objetivo
Explorar como utilizar expressões regulares com o comando SED para realizar substituições e edições de texto de forma automática. O SED (Stream Editor) permite manipular texto em arquivos ou em fluxo de dados, sendo ideal para automatizar tarefas de busca e substituição.
O Que é o SED?
O SED é um editor de texto em linha de comando que aplica modificações e filtros de forma automatizada. Com o SED, é possível:
- Buscar e substituir textos;
- Deletar linhas que correspondam a um padrão específico;
- Inserir e modificar conteúdos em fluxo, diretamente em arquivos ou comandos.
Sintaxe Básica do SED
A sintaxe básica para o comando SED é:
1
sed 's/padrão/substituição/opções' arquivo.txt
s: Indica o comando de substituição (substitute).padrão: O padrão regex a ser buscado.substituição: O texto que substituirá o padrão encontrado.opções: Controla o comportamento da substituição (ex.:gpara substituição global).
Principais Funcionalidades do SED com Regex
| Comando SED | Descrição | Exemplo de Uso |
|---|---|---|
s/padrão/substituição/g | Substitui todas as ocorrências de padrão por substituição em cada linha. | s/erro/aviso/g |
s/padrão/substituição/gi | Substitui todas as ocorrências de padrão (ignorando maiúsculas/minúsculas) por substituição. | s/teste/exemplo/gi |
/padrão/d | Deleta todas as linhas que correspondem ao padrão. | /erro/d |
/^padrão/ s/antigo/novo/ | Substitui antigo por novo apenas em linhas que começam com padrão. | /^Log/ s/erro/aviso/ |
N; /padrão/ s/antigo/novo/g | Substitui antigo por novo em linhas pares ou ímpares (N representa o número da linha). | 1~2 s/erro/aviso/ para linhas ímpares |
Exemplos Práticos de Regex com SED
Substituir Todas as Ocorrências de uma Palavra em Cada Linha
Para substituir todas as ocorrências de “erro” por “aviso” em
log.txt:1
sed 's/erro/aviso/g' log.txt
Substituir Palavras com Maiúsculas e Minúsculas (Case Insensitive)
Para substituir “Teste” ou “teste” por “Exemplo”, usando o modificador
ipara ignorar maiúsculas e minúsculas:1
sed 's/teste/Exemplo/gi' texto.txt
Deletar Linhas que Contêm um Padrão Específico
Para remover linhas que contenham a palavra “falha” em um arquivo:
1
sed '/falha/d' log.txt
Substituir Texto em Linhas que Começam com um Padrão
Substitua “erro” por “aviso” apenas em linhas que começam com “Log”:
1
sed '/^Log/ s/erro/aviso/' log.txt
Substituir Texto em Linhas Ímpares ou Pares
Para substituir “pendente” por “completo” em linhas ímpares:
1
sed '1~2 s/pendente/completo/' status.txt
Tabelas de Comandos e Opções do SED
Comandos Mais Comuns do SED
| Comando | Descrição |
|---|---|
s/ | Substitui um padrão por outro |
/d | Deleta linhas que correspondem ao padrão |
/p | Imprime apenas as linhas que correspondem ao padrão |
/a | Adiciona texto após a linha correspondente |
/i | Insere texto antes da linha correspondente |
Opções Mais Usadas do SED
| Opção | Descrição |
|---|---|
g | Global, substitui todas as ocorrências em cada linha. |
i | Ignora maiúsculas/minúsculas na busca (insensitive). |
n | Aplica a modificação apenas na n-ésima ocorrência do padrão em cada linha. |
e | Interpreta o resultado como uma expressão de comando (executa o comando após substituição). |
Exercícios Práticos com SED e Regex
Substituir Palavras em Linhas com Padrões Específicos
Substitua “incompleto” por “finalizado” apenas nas linhas que contêm a palavra “processo”:
1
sed '/processo/ s/incompleto/finalizado/' arquivo.txt
Deletar Linhas Vazias de um Arquivo
Para remover todas as linhas vazias do arquivo
documento.txt:1
sed '/^$/d' documento.txt
Inserir Texto Após Linhas com Padrão Específico
Adicione a linha “Processo concluído” após linhas que contenham “ID:” no arquivo:
1
sed '/ID:/ a Processo concluído' relatorio.txt
Transformar Texto em Maiúsculas nas Linhas Selecionadas
Substitua palavras minúsculas por maiúsculas em linhas que contenham “ERRO”:
1
sed '/ERRO/ s/.*/\U&/' log.txt
Dicas de Prática
- Use o SED para Modificar Arquivos em Lote: Com SED, você pode aplicar substituições em massa em múltiplos arquivos usando redirecionamento ou loops.
- Combine SED com Outros Comandos: Ao combinar SED com
grepouawk, é possível filtrar e transformar texto de maneira extremamente precisa.
9. Usando o GREP, EGREP e FGREP com Expressões Regulares
Objetivo
Explorar o uso de expressões regulares com GREP, junto com suas variantes EGREP (Extended GREP) e FGREP (Fixed GREP), para realizar buscas avançadas em arquivos. Vamos entender as diferenças entre cada uma dessas ferramentas e ver exemplos práticos.
O Que São GREP, EGREP e FGREP?
Essas são variantes do comando grep:
- GREP: A versão padrão que utiliza expressões regulares básicas (BRE).
- EGREP: Versão estendida que utiliza expressões regulares estendidas (ERE), o que permite usar quantificadores e operadores sem escapes adicionais. Esse comando é equivalente a
grep -E. - FGREP: Variante que realiza buscas sem expressões regulares (literalmente). Hoje,
fgrepé equivalente agrep -Fe é mais rápido quando precisamos buscar texto exato, sem regex.
Comparação entre GREP, EGREP e FGREP
| Variante | Descrição | Exemplo de Uso |
|---|---|---|
| GREP | Utiliza expressões regulares básicas (BRE), necessitando de escapes para operadores como +, ?, {}. | grep 'a\{2\}' arquivo.txt |
| EGREP | Usa expressões regulares estendidas (ERE), facilitando a escrita de regex complexos sem escapes adicionais. | egrep 'a{2}' arquivo.txt ou grep -E |
| FGREP | Busca texto literal, sem interpretar caracteres especiais como regex. Ideal para buscas rápidas e exatas. | fgrep 'texto.exato' arquivo.txt ou grep -F |
Principais Operadores e Suporte nas Variantes
| Operador | GREP (BRE) | EGREP (ERE) | FGREP |
|---|---|---|---|
. | Sim | Sim | Não |
* | Sim | Sim | Não |
+ | \+ | Sim | Não |
{n,m} | \{n,m\} | Sim | Não |
| | \| | Sim | Não |
() | \( \) | Sim | Não |
Exemplos Práticos de Uso do GREP, EGREP e FGREP
Usando GREP para Expressões Regulares Básicas (BRE)
Procurar por duas letras “a” seguidas em um arquivo com
grep(usando escapes):1
grep 'a\{2\}' texto.txt
Usando EGREP para Regex Estendidas (ERE)
Para realizar a mesma busca, mas sem a necessidade de escapes adicionais, use
egrepougrep -E:1 2 3
egrep 'a{2}' texto.txt # ou grep -E 'a{2}' texto.txt
Usando FGREP para Busca Literal
Para buscar o termo
a{2}, sem que ele seja interpretado como regex (busca literal):1 2 3
fgrep 'a{2}' texto.txt # ou grep -F 'a{2}' texto.txt
Combinação de Padrões com EGREP
Com
egrep, você pode buscar múltiplos padrões ao mesmo tempo usando|. No exemplo abaixo, procuramos “erro” ou “falha”:1 2 3
egrep 'erro|falha' log.txt # ou grep -E 'erro|falha' log.txt
Usando GREP para Buscar em Diversos Arquivos
Para buscar um padrão em múltiplos arquivos
.logno diretório atual, utilize ogrep:1
grep 'ERRO' *.log
Casos de Uso para Cada Variante
- GREP: Ideal para buscas que utilizam expressões regulares básicas. Ele é útil para filtros mais simples e buscas diretas em arquivos grandes.
- EGREP: Recomendado para regex mais complexas, onde operadores avançados, como
{},|, e+, são usados frequentemente. Ele simplifica a escrita de regex sem escapes extras. - FGREP: É a melhor escolha quando você precisa de uma busca rápida por texto exato (sem regex), pois processa caracteres especiais como texto literal, ideal para diretórios grandes.
Exercícios Práticos com GREP, EGREP e FGREP
Buscar por um Padrão com Quantificador em GREP
Use
greppara encontrar todas as linhas emdados.txtcom três dígitos seguidos:1
grep '[0-9]\{3\}' dados.txt
Combinar Padrões com EGREP
Use
egreppara localizar linhas que contenham “aviso” ou “erro” emrelatorio.log:1
egrep 'aviso|erro' relatorio.logBuscar por Textos Literais com FGREP
Utilize
fgreppara buscar o termo “a+b=c” emequacoes.txt, sem interpretação de regex:1
fgrep 'a+b=c' equacoes.txtBuscar Linhas que Terminam com um Padrão
Use
greppara encontrar todas as linhas que terminam com “.com” ememails.txt:1
grep '\.com$' emails.txt
Dicas de Prática
- Escolha a Ferramenta Certa: Use
greppara expressões regulares básicas,egreppara regex avançadas efgreppara texto literal, aproveitando o melhor de cada comando. - Combine com Opções Adicionais: Opções como
-i(case insensitive) e-v(invert match) podem ser usadas para tornar as buscas mais flexíveis.
10. Usando o FIND com Expressões Regulares
Objetivo
Nesta seção, vamos explorar como combinar o comando FIND com expressões regulares para buscar arquivos e diretórios no Linux. O find é uma ferramenta poderosa e flexível que permite localizar arquivos com base em critérios avançados, incluindo nomes, tamanhos, datas, permissões e, claro, padrões regex.
O Que é o FIND?
O comando FIND é usado para localizar arquivos e diretórios dentro de um sistema de arquivos, oferecendo várias opções para filtrar e refinar buscas. Com o find, você pode aplicar filtros para encontrar arquivos por nome, tipo, data de modificação e até mesmo por conteúdo.
Sintaxe Básica do FIND com Regex
No find, você pode utilizar a opção -regex para definir um padrão regex que será aplicado ao caminho completo dos arquivos e diretórios encontrados:
1
find /caminho -regex 'padrão'
/caminho: Diretório onde a busca será iniciada.-regex: Indica que o padrão é uma expressão regular.padrão: A regex que será aplicada para filtrar os arquivos.
Exemplos Práticos de Uso do FIND com Regex
Buscar Arquivos que Correspondem a um Padrão Simples
Para encontrar todos os arquivos que terminam com
.logno diretório/var/log, use:1
find /var/log -regex '.*\.log$'
Buscar Arquivos com Nomes que Contêm Dígitos
Para localizar arquivos que contenham números no nome dentro do diretório
/home/usuario/docs:1
find /home/usuario/docs -regex '.*[0-9]+.*'
Buscar Arquivos com Extensões Específicas
Se quiser buscar apenas arquivos com extensões
.txtou.mdno diretório atual:1
find . -regex '.*\.\(txt\|md\)$'
Buscar Arquivos por Padrões Complexos
Para localizar arquivos que comecem com “rel_” e terminem com quatro dígitos (ex.:
rel_2022):1
find . -regex '.*/rel_[0-9]{4}$'
Buscar Diretórios que Começam com uma Letra Maiúscula
Para listar apenas diretórios que começam com uma letra maiúscula dentro de
/home/usuario:1
find /home/usuario -type d -regex '.*/[A-Z].*'
Opções Úteis do FIND com Regex
| Opção | Descrição | Exemplo de Uso |
|---|---|---|
-regex | Aplica uma regex ao caminho completo do arquivo ou diretório. | find . -regex '.*\.log$' |
-name | Busca por nome exato, sem regex. | find . -name "*.log" |
-iname | Busca por nome, ignorando maiúsculas/minúsculas. | find . -iname "*.txt" |
-type | Especifica o tipo (f para arquivos, d para diretórios). | find . -type d -regex '.*Backup.*' |
-exec | Executa um comando em cada arquivo encontrado. | find . -name "*.log" -exec rm {} \; |
Exercícios Práticos com FIND e Regex
Buscar Arquivos que Contenham Datas no Nome
Use o
findpara localizar arquivos que contenham uma data no formatoYYYY-MM-DD(ex.:2023-11-01) no diretório/home/usuario/projetos:1
find /home/usuario/projetos -regex '.*[0-9]{4}-[0-9]{2}-[0-9]{2}.*'
Localizar Imagens com Extensões
.jpgou.pngPara buscar arquivos de imagem com extensões
.jpgou.png:1
find /imagens -regex '.*\.\(jpg\|png\)$'
Buscar Diretórios que Contêm a Palavra “Backup”
Encontre diretórios que tenham “Backup” no nome dentro de
/var/arquivos:1
find /var/arquivos -type d -regex '.*/Backup.*'
Apagar Arquivos Temporários com Padrão Específico
Localize e exclua arquivos que começam com “temp_” e terminam com
.tmp:1
find . -regex '.*temp_.*\.tmp$' -exec rm {} \;
Dicas de Prática
- Teste as Regex com Cuidado: Use o
findsem-execinicialmente para garantir que apenas os arquivos desejados sejam listados antes de aplicar comandos de modificação ou remoção. - Use
-namee-inamepara Buscas Simples: Para buscas mais simples,-namee-inamepodem ser suficientes, além de serem mais rápidas em alguns casos.
Conclusão
O domínio das expressões regulares abre inúmeras possibilidades para a manipulação de texto, tornando-se uma habilidade indispensável para usuários e administradores de sistemas Linux. Ao longo deste tutorial, você explorou as principais ferramentas que utilizam regex, com exemplos e dicas que demonstram sua flexibilidade e eficiência. Agora, é o momento de praticar o que foi aprendido! Experimente criar seus próprios padrões e aplique-os em arquivos e logs do sistema. A prática com regex permitirá que você automatize tarefas, resolva problemas rapidamente e manipule dados de forma muito mais precisa e eficaz no Linux.