Sabe trabalhar com expressões regulares no Linux?
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.
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:
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.
Este artigo tem mais de um ano
Excelente.
Ainda dizem que o windows é fácil.
Mais fácil do que isto não há……ha..ha..
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.
Um programador tinha 1 problema,
Para o resolver utilizou expressões regulares…
O programador tem 2 problemas…. ;-P
Quem não sabe…
http://txt2re.com/
Regex101.com
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…
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
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 😉
já para não falar no cat | grep ser um overuse do pipe 😉
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 😉
Sim Sei.
Só vim responder ao titulo XD
Associar regex ao Linux é um bocado forçado. Já utilizava isto e ainda não havia Linux.
Mas não deixa de ser uma iniciativa de louvar.
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
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.
O exemplo 6 está mal. Se querem uma palavra que comece por “mys” a regex é “mys.*”
$ echo ‘my’ > pplware
$ grep ‘mys*’ pplware
my
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) 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
“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.
My two cents 😛
https://ibb.co/qpDpf7b
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.
Não percebi djx, como está mal?
isso comeca a ser interecante quando se le codigo fonte com !@#$#@!!^^^%$%^^ mais10 linhas ninguem sabe o que aquilo faz……….
que e poderoso ee.
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 😉
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 😉