Expressões Regulares no Linux [Guia Básico]
Vamos falar sério. Tirem as crianças da sala. Se você não sabe um tiquim de expressões regulares no Linux, você não sabe Linux ainda. É igual ter um Iate para andar na piscina de casa.
Uma expressão regular é um método formal de se especificar um padrão de texto a ser procurado em um ou mais arquivos.
É uma composição de caracteres com funções especiais (metacaracteres) que agrupados entre si com caracteres literais (de A a Z) e números podem formar uma sequência, uma expressão que o shell e editores de texto podem entender e buscar.
As expressões regulares são úteis para buscar ou validar textos variáveis como:
- Número de endereço IP;
- Endereço de e-mail;
- Endereço de Internet (URL);
- Dados na coluna em um texto;
- Dados que estão entre <tags></tags> de uma linguagem, como o HTML;
- Número de CNPJ, RG, CPF etc.;
- Data e Horário.
Vários editores de texto e linguagens de programação oferecem suporte a expressões regulares. As ferramentas importantes que trabalham com este recurso para a prova CompTIA Linux+ são o grep e o sed.
Comando grep
Uso:
$ grep [opções] expressão-regular arquivos
O comando grep é largamente usado no dia a dia das tarefas administrativas em Linux.
Ele filtra as linhas de um determinado arquivo procurando por uma expressão regular como padrão.
O grep pode ler um ou mais arquivos que são passados como argumento ou pode receber na entrada padrão o redirecionamento da saída de outro processo.
Se o grep receber mais de um arquivo ou um wildcard como argumento para efetuar a sua busca, ele vai indicar o nome do arquivo seguido de dois pontos e a linha encontrada.
Suas opções mais frequentes são:
- -c: Mostra somente a contagem das ocorrências nos arquivos e não as linhas onde as ocorrências foram encontradas;
- -h: Mostra somente as linhas encontradas, sem a indicação do nome dos arquivos;
- -i: Procura as ocorrências ignorando se as letras estão em maiúsculas ou minúsculas;
- -v: Mostra todas as linhas do arquivo procurado menos as ocorrências encontradas. Tem o efeito inverso;
- -n: Mostra, além do texto das linhas encontradas, o número das linhas dentro dos arquivos;
- -B n: Mostra n linhas antes da linha encontrada;
- -A n: Mostra n linhas depois da linha encontrada.
Exemplos:
$ grep uira /etc/passwd
uira:x:500:100:uira:/home/uira:/bin/bash
Procura a palavra uira no arquivo /etc/passwd.
$ grep ‘^u’ /etc/passwd
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
uira:x:500:100:uira:/home/uira:/bin/bash
Procura todas as linhas começadas com a letra u no arquivo /etc/passwd. O acento circunflexo simboliza o início de uma linha.
$ grep ‘false$’ /etc/passwd
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
Procura todas as linhas terminadas com a palavra false. O símbolo $ representa o fim de uma linha.
$ grep ‘^[aeiou]’ /etc/passwd
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
uira:x:500:100:uira:/home/uira:/bin/bash
alias:x:501:1000::/var/qmail:/bin/false
No shell, sempre utilize ‘aspas simples’ quando você for utilizar expressões regulares.
Procura todas as linhas que começam com as vogais. A expressão regular chamada lista procura qualquer um dos caracteres dentro do colchete. Note que a lista somente procura por apenas um caractere, por maior que ela seja.
$ grep ‘^.[aeiou]’ /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
news:x:9:13:News system:/etc/news:/bin/bash
uira:x:500:100:uira:/home/uira:/bin/bash
Procura por todas as linhas em que o primeiro caracter seja qualquer um e o segundo caracter seja uma vogal. O ponto final na expressão regular simboliza “um caractere qualquer”.
$ grep ‘[0-9][0-9][0-9][0-9]’ /etc/passwd
squid:x:31:65534:WWW-proxy squid:/var/cache/squid:/bin/false
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
alias:x:501:1000::/var/qmail:/bin/false
qmaild:x:502:1000::/var/qmail:/bin/false
Procura por linhas que contenham uma sequência de quatro números consecutivos.
$ cat * | grep security
Procura em todos os arquivos em um diretório a ocorrência da palavra security.
Comando egrep
Uso:
$ egrep [opções] expressão-regular arquivos
O comando egrep é muito parecido com o grep, mas ele suporta expressões regulares com os metacaracteres +,?, | e ().
Comando fgrep
Uso:
$ fgrep [opções] chave-procura arquivos
O comando fgrep também é parecido com o grep, mas ele não suporta expressões regulares, procurando somente uma chave de busca ou um texto nos arquivos. Por este motivo, é mais rápido que o grep, mas menos versátil.
Comando sed
Uso:
$ sed [opções] {script}
O comando sed é um editor de textos simples utilizado para fazer pequenas transformações no conteúdo dos arquivos.
O sed recebe um texto de um ou mais arquivos passados como argumento na linha de comando e o transforma enviando a modificação para a saída padrão (monitor de vídeo).
Se quisermos que o sed realmente altere o conteúdo do arquivo é necessário utilizarmos o redirecionador maior-que “>” para um outro arquivo qualquer e depois copiarmos. A opção “-i extensão” também possibilita editar diretamente o arquivo e salvando uma cópia de segurança com a extensão indicada.
$ sed ‘s/\/usr\/local\/bin/\/usr\/bin/’ texto.txt > textonovo.txt
Você pode optar por utilizar o –i, de forma que o sed irá alterar o texto.txt e manter um backup em texto.txtold:
$ sed –i old ‘s/\/usr\/local\/bin/\/usr\/bin/’ texto.txt
Troca a sequência /usr/local/bin por /usr/bin no arquivo texto.txt. Observe que as contra-barras (\) dizem para o interpretador de expressões regulares que o caractere logo em seguida deve ser entendido na sua forma literal e não um símbolo de expressão regular.
$ sed ‘s/uira/carla/’ /etc/passwd
Troca o nome uira pelo nome carla no arquivo /etc/passwd
Resumo das Expressões Regulares
Observe na tabela os principais símbolos que podem ser combinados para formar expressões regulares complexas:
TABELA – Expressões Regulares
Símbolo | Descrição |
‘ | Aspas simples são utilizadas para delimitar o texto dentro delas como caracteres literais não interpretando nenhum caractere que estiver dentro delas como metacaractere. |
“ | Aspas duplas são utilizadas para delimitar o texto dentro delas como caracteres literais exceto os sinais “$” e “\”. |
\ | A contrabarra é utilizada para informar que o caractere imediatamente após deve ser interpretado como literal. |
^ | O acento circunflexo é utilizado para indicar o início de uma linha. |
$ | O cifrão é utilizado para indicar o final de uma linha. |
[aeiou] | Uma sequência de caracteres dentro de colchetes é interpretada como todos os caracteres são válidos para a busca. |
[a-z] | O sinal menos indica que qualquer caractere entre a letra a e a letra z são válidos. |
[^abc] | Indica que qualquer caractere menos as letras a, b, c são válidos na busca. |
/palavra/ | Indica que a palavra procurada deverá estar separada por espaços na esquerda e na direita. |
[0-9] | Indica que qualquer número de zero a nove é válido para a busca. |
. | O ponto final indica qualquer caractere menos uma linha em branco. |
Exemplos:
Para procurar as linhas iniciadas com “Nov 10”:
$ grep “^Nov 10” messages
Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10
Nov 10 01:18:49 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3
Para procurar as linhas terminadas com “terminating.”:
$ grep “terminating.$” messages
Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.
Para contar as linhas em branco no meulog.log, utilizamos o “^$”:
$ grep -c “^$” meulog.log
meulog.log:3
Para buscar todas as ocorrências “.ola” de um arquivo:
$ grep “.ola” arquivo
Mola
Cola
Tola
Hola
Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.
1 Comentário
Excelente conteúdo, Professor. Cheguei no seu conteúdo porque estou cursando Shell Scripting e cheguei na aula de expressões regulares. Estou montando um script para facilitar a análise de Logs do Nginx e cheguei num ponto que eu não estou conseguindo avançar.
Explicação: Quero chamar o script e como primeiro parâmentro eu quero escolher o arquivo de log que eu quero analisar, trazendo como segundo parâmentro o que eu quero ver dentro do log: Error, Severe, IP, HTTP, Data etc etc. No segundo parâmetro eu consegui achar a solução, mas estou tentando caçar uma solução pra conseguir trazer o arquivo de log de minha escolha como primeiro parâmentro.
Meu script está assim e se puder me ajudar agradeceria muito:
cd /web/nginx/log
# Variáveis
regexip=’\b([0-9]{1,3}\.){3}[0-9]{1,3}\b’ # Filtro para buscar por endereço de IP válido dentro do arquivo de log.
regexmail=’\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b’ # Filtro para buscar através de endereço de e-mail válido.
regexdate=’\b^([0-9]+\/[a-zA-Z]{1,3}+\/[0-9]{2,4})\b’ # Filtra pela data Exemplo: 04/Oct/2022
regexlog='([a-zA-Z0-9-._])’ # Filtra por qualquer arquivo de log que será efetuado a pesquisa.
if [[ $1 =~ $regexlog ]]
then
find . -iname $regexlog
else
echo “O arquivo de log especificado é inválido.”
fi