Artigos

Prompt do Linux: Expressões regulares

Continuando a série, vamos tratar de um tema muito útil no ambiente Linux, e que tem sido usado em vários outros softwares, inclusive para Windows: as expressões regulares.

Uma expressão regular (também conhecida por regex) nada mais é do que a especificação de um padrão de texto, algo que segue uma determinada regra de formato. Escrevendo-se a expressão correta, você pode encontrar fragmentos de texto dentro de um arquivo, por exemplo. O como fazer isto vai explicado abaixo:

grep: utilitário de busca de regex

A maioria (se não for todas) das distribuições Linux incluem o grep, que é um buscador de regex.

A sintaxe é bem simples: grep 'padrao' entrada. Se a entrada não for especificada, usa-se a entrada padrão (stdin). Você também pode usar alguns parâmetros, como o “-v”, que mostra o inverso do padrão (ou seja, tudo aquilo que não bate com o padrão passado), e o “-i”, que torna a busca insensível à casa (não diferencia maiúsculas de minúsculas).

Note que usei aspas simples delimitando o padrão. Nem sempre elas são necessárias, mas em alguns casos, um metacaracter pode acabar sendo traduzido pelo shell, causando resultados errôneos, e as aspas simples evitam isto. Não entendeu? Relaxa, tá explicado aí embaixo…

Tá bom, mas como escrevo padrões?!

Nesta parte é bom ir devagar, com carinho, senão dói =)

Primeira coisa, entenda que há caracteres e metacaracteres numa regex. Os caracteres são literais, ou seja, as letras (a-z, A-Z) e números (0-9), além de alguns símbolos e acentos. E os metacaracteres são caracteres que têm um significado especial, como o “^”, que indica começo de linha, e o “$”, que representa final de linha. Se você quer que um símbolo seja tratado literalmente, isto é, sem que seja tratado como um metacaracter, você precisa escapá-lo, colocando uma barra invertida ( \ ) antes do dito cujo. Um exemplo de uso disto é para o ponto ( . ), que é um metacaracter que representa qualquer caracter, e você pode querer tratá-lo como sendo apenas um ponto mesmo.

Aí vai uma listinha com alguns dos metacaracteres mais usados:

  • ^ : começa com
  • $ : término de linha
  • . : qualquer caracter
  • [] : relação de valores possíveis para um caracter. Você pode especificar uma lista ( [abcde] ), uma faixa ( [0-9] ), ou várias faixas ( [a-zA-Z0-9] ).
  • \{\} : especifica quantas vezes o caracter pode se repetir. Por exemplo: “{2}” (duas vezes), “{2,5}” (duas a cinco vezes), “{2,}” (duas ou mais vezes).
  • | : operador lógico ou
  • .* : operador lógico e

Olhe esta “lingüiça”, por exemplo: [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}-[0-9]\{2\}. Adivinha com o que ela casa? Com um número de CPF que esteja formatado com pontos e traço. Leia a expressão com calma que você vai enxergar isto =)

Existe um outro utilitário, o egrep, que é uma versão extendida do grep. A sintaxe de uso é a mesma. Uma coisa legal dele é dispensar o escape para certos metacaracteres, como o “{}”, o que tornaria esta mesma expressão um pouquinho mais curta: [0-9]{3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}. Note que o ponto ainda precisou ser escapado, pois a intenção é tratá-lo apenas como ponto mesmo.

E onde eu uso este tipo de coisa?

Se você só navega na internet e papeia pelo MSN ou algo parecido, aprender este tipo de coisa pode parecer desnecessário. Mas se você costuma ler os logs do sistema, ou se trabalha com arquivos texto, ou se é um admin de sistemas Linux, ou se alguma vez se deparar com a necessidade de achar uma agulha no meio do palheiro, você vai usar regex. E como disse no começo, já há aplicativos no Windows que entendem o conceito de regex – cada um a seu jeito, claro. O Notepad++ é um deles. E até o Microsoft Word =) Pra quem não acredita, aí vai a tela de Pesquisa Avançada dele:

Word - Expressões

Hoje, vou dar 2 exemplos apenas, um onde a entrada é um arquivo, e outro onde a entrada é o stdin. No próximo artigo, vou me dedicar exclusivamente a dar exemplos de uso do grep, egrep e fgrep, incluindo exemplos de uso dos metacaracteres.

– Exemplo 1: achar no arquivo de usuários quem tem “/bin/bash” em sua linha, o que indica que o seu shell é o Bash:
grep '/bin/bash' /etc/passwd

– Exemplo 2: exibir o log do sistema em tempo real, porém filtrar apenas as linhas que contenham o e-mail “[email protected]”:
tail -f /var/log/syslog | grep 'usuario@provedor\.com\.br'

Até mais!

Tags: Linux, Software

Você também vai gostar

Leia também!