Sabe trabalhar com expressões regulares no Linux?

26 Comentários

A utilização de expressões regulares no Linux é algo basta comum. Na prática, as expressões regulares podem definir padrões e ser interpretadas por alguns comentos. Apesar de serem semelhantes ao globbing (utilização de wirldcards), as expressões regulares são sem dúvida mas poderosas.

Vamos a alguns exemplos.

regex_expressao_regular_php


Falar em expressões regulares não é algo novo no Pplware até porque já apresentamos aqui um artigo sobre este tema. Como referido, , as expressões regulares permitem-nos identificar padrões, num determinado texto/palavra. Lembram-se quando usam o ‘*’, como wildcard, para identificar um conjunto de ficheiros?..o principio das expressões  regulares é idêntico.

Na Internet existem alguns sites para “explorar” expressões regulares  dos quais se destaca o Regexr.

Antes de começar o que precisa de saber?

As expressões regulares podem ser definidas em duas formas: básicas ou estendidas. No que diz respeito à forma básica que vamos abordar hoje é fundamental que o utilizador saiba o seguinte:

expression_01

Vamos à prática

Um dos comandos mais poderosos do Linux e que permite trabalhar com expressões regulares é o grep. Este comando permite filtrar dados de várias fontes. Vamos usar para os exemplos o ficheiro /etc/passwd onde está guardada a informação sobre os utilizadores do sistema.

Exemplo1

Saber se existe o utilizador ppinto

grep ‘ppinto’ /etc/passwd

ppinto:x:501:501::/home/ppinto:/bin/bash

Exemplo2

Saber se existe o utilizador root e se aparece logo na primeira posição da linha a pesquisar

grep ^root /etc/passwd

root:x:0:0:root:/root:/bin/bash

Exemplo 3

Saber se existe alguma linha cuja a última palavra termine em ‘h’

grep ‘h$’ /etc/passwd

root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
ppinto:x:501:501::/home/ppinto:/bin/bash

Exemplo 4

Saber se existe alguma palavra que tenha algum dos caracteres definidos

grep [int] /etc/passwd

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
ppinto:x:501:501::/home/ppinto:/bin/bash

Exemplo 5

Saber se existe alguma palavra que comece por ‘p’ tenha 4 caracteres seguidos e termine em ‘o’

grep p….o /etc/passwd

operator:x:11:0:operator:/root:/sbin/nologin
ppinto:x:501:501::/home/ppinto:/bin/bash

Exemplo 6

Saber se existe alguma palavra que comece por ‘mys’

grep ‘mys*’ /etc/passwd

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

Num próximo tutorial iremos mostrar como podemos usar expressões regulares mais complexas, recorrendo a um conjunto de exemplos práticos. Para quem precisar de uma cheat sheet aqui fica a nossa sugestão.

Partilhar:
Tags:

Comentários

26

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Rocha
    Rocha

    Excelente.
    Ainda dizem que o windows é fácil.
    Mais fácil do que isto não há……ha..ha..

  2. Avatar de Sergio J
    Sergio J

    O artigo está bom , mas acho que o estás a castrar demasiado ao cola-lo à bash do Linux. A maior parte dos utilizadores nem sequer sabe o que é uma expressão regular. Até muitos programadores não sabem o que é, ou pelo menos como utiliza-la.
    As expressões regulares podem ser encontradas em muitos locais, sendo de facto na bash do Linux muito utilizada por power users. Pelo menos na altura do meu mestrado aqueles users mais fundamentalistas (principalmente aqueles professores mais marados) gostavam de se gabar do que conseguiam fazer com ela.

    Normalmente utilizo um pouco nas minhas aplicaçoes em C#, mas onde utilizo mais é no notepad++. Essa é umas principais razões porque uso este editor.

  3. Avatar de Pedro Almeida
    Pedro Almeida

    Um programador tinha 1 problema,
    Para o resolver utilizou expressões regulares…
    O programador tem 2 problemas…. ;-P

    1. Avatar de Melo
      Melo

      Quem não sabe…

  4. Avatar de Melo
  5. Avatar de Miguel Horta
    Miguel Horta

    Dois erros logo no primeiro paragrafo, «*são sem* dúvida *mais* poderosas.». Isto para não falar da pontuação repetida.

    Já agora poderiam referir que as expressões regulares são usadas em muitos mais sítios, e não apenas em linux…

  6. Avatar de Ivan Teixeira
    Ivan Teixeira

    Isto dá muito jeito para algumas coisas,
    Uma delas limpar ficheiros, ex:

    cat /etc/samba/smb.conf | egrep -v ‘^[[:space:]]*$|^[[:space:]]*[;#]’

    Explicação do comando:
    cat /etc/samba/smb.conf —> mostrar o conteúdo do ficheiro smb.conf
    egrep —> (egrep) ou (grep -e) para expressões regulares
    egrep -v–> a opção -v faz o contrario de um grep, ou seja, não escolhes o que queres ver mas sim o que não queres ver.
    egrep -v ‘^[[:space:]]*$|^[[:space:]]*[;#]’ –> vai limpar o ficheiro em que a linha contenha: espaços (linhas vazias), comecem por (;) , (#) e (espaço)

    Isto para mim é muito util 😉
    Cumprimentos a todos

    1. Avatar de lmx
      lmx

      usa sempre o grep -E, o egrep está deprecated e se fizeres um cat ao mesmo, vais perceber que está lá por motivo de compatibilidade apenas com aplicações antigas 😉

      MAs boa onda 😉

      1. Avatar de Carlos Silva
        Carlos Silva

        já para não falar no cat | grep ser um overuse do pipe 😉

        1. Avatar de lmx
          lmx

          hehhee,
          sim neste caso é porque o ficheiro a fazer parse é pequeno 🙂

          Se fosse um ficheiro gigante ai até poderia fazer sentido, terias um processo para carregar o buffer(que não é mais que um driver do tipo productor-consumidor), e a seguir outro processo para o grep .

          Ou seja garantias uma probabilidade maior de pelo menos um dos dois estar a correr no cpu,
          gastaria mais recursos, mas acabaria de processar mais rápido.

          No caso acima não era necessario, bem visto 😉

  7. Avatar de Jonas Tamagochi
    Jonas Tamagochi

    Sim Sei.

    Só vim responder ao titulo XD

  8. Avatar de SpeedyAlmeida
    SpeedyAlmeida

    Associar regex ao Linux é um bocado forçado. Já utilizava isto e ainda não havia Linux.

    1. Avatar de SpeedyAlmeida
      SpeedyAlmeida

      Mas não deixa de ser uma iniciativa de louvar.

    2. Avatar de R o B
      R o B

      O artigo exemplifica a facilidade da utilização regex em linux “out of the box”. Se já usava este tipo de álgebra antes do Linux significa que você é velho mas não obsoleto

  9. Avatar de humberto costa
    humberto costa

    colar expressoes regulares ao linux pode criar confusão a quem nunca ouviu falar nas mesmas.
    utilizava-as em C e em Perl, muito antes de existir o primeiro linux. a bem dizer qualquer linguagem de programaçao de jeito aceita expressoes regulares.
    expressoes regulares conseguem poupar NNN linhas de código se bem aplicadas, mas tambem sao das mais dificeis de fazer em qualquer linguagem de programacao. felizmente sei o basico para as usar diariamente em codigo que envolva texto.

  10. Avatar de djx
    djx

    O exemplo 6 está mal. Se querem uma palavra que comece por “mys” a regex é “mys.*”

    $ echo ‘my’ > pplware
    $ grep ‘mys*’ pplware
    my

    1. Avatar de Andrey Oliveira
      Andrey Oliveira

      Na verdade os dois exemplos estão errados:

      – Se quiser uma palavra que contenha “mys” basta usar “mys” sem nenhuma expressão regular.
      – Se quiser uma palavra que COMECE com “mys” basta usar “<mys" (em algumas shell "\<mys")
      – O exemplo do artigo tem um erro grave já que usar "mys*" vai casar qualquer palavra que contenha "my" seguido de de "s" ou não. Se no texto tivesse as palavras "mylena", "mycaela", "myui", seria incluído como coincidencias.

      1. Avatar de Pedro Pinto

        1) Sim, podes usar apenas mys ou mys* (o conter para mim é ter isso e outras coisas)
        2) resposta do primeiro
        3) O terceiro ponto não percebi

        1. Avatar de Andrey Oliveira
          Andrey Oliveira

          “Saber se existe alguma palavra que comece por ‘mys’”

          O asterisco serve para indicar “nenhum ou vários caracteres”. Neste caso está se referindo aquele caracter que precede o sinal “*”.

          Ao usar expressão “mys*” vai retornar tudo que tenha “my”.

          Crie um texto com “mysql” “mylena”, “mycaela”, “myui” e faça o teste. Ele vai coincidir com todos e não só com mysql como sugere o exemplo.

    2. Avatar de Andrey Oliveira
      Andrey Oliveira

      Em tempo, pra testar pode fazer da seguinte forma:

      echo “XmysqlX” |grep ‘mys.*’

      Com o seu exemplo, ele vai trazer o resultado acima como válido. O que não é para quem quer palavras que comecem com a sentença.

    3. Avatar de Pedro Pinto

      Não percebi djx, como está mal?

  11. Avatar de sakura
    sakura

    isso comeca a ser interecante quando se le codigo fonte com !@#$#@!!^^^%$%^^ mais10 linhas ninguem sabe o que aquilo faz……….
    que e poderoso ee.

  12. Avatar de André Déo
    André Déo

    Para mim o melhor material de Expressões Regulares que já li, são do Aurélio Marinho Jargas (Verde), o livro dele é divertido, didático e totalmente mão na massa. E em português:
    http://aurelio.net/regex/

    Abraços do Brasil 😉

    1. Avatar de lmx
      lmx

      Obrigado pela partilha, e sempre muito bom encontrarmos documentação na nossa lingua 😉

      Dá sempre jeito, até porque ninguém sabe tudo e muitas das vezes não te lembras de tudo o que sabes na hora que precisas 😉