Quantcast

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
  1. RO
    Rocha

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

  2. SJ
    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. PA
    Pedro Almeida

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

    1. ME
      Melo

      Quem não sabe…

  4. ME
    Melo

    Regex101.com

  5. MH
    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. IT
    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. LM
      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. CS
        Carlos Silva

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

        1. LM
          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. JT
    Jonas Tamagochi

    Sim Sei.

    Só vim responder ao titulo XD

  8. SP
    SpeedyAlmeida

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

    1. SP
      SpeedyAlmeida

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

    2. RB
      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. HC
    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. DJ
    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. AO
      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. PP

        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. AO
          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. FT
        FTeixeira

        My two cents 😛

        https://ibb.co/qpDpf7b

    2. AO
      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. PP

      Não percebi djx, como está mal?

  11. SA
    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. AD
    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. LM
      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 😉

Deixe um comentário