shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Manipulação de string


From: Fernando Mercês
Subject: Re: [shell-script] Manipulação de string
Date: Fri, 7 Oct 2011 00:46:49 -0300

Oi Rodrigo. Vamos lá.

Se você tem a $zona, pode usá-la no awk para capturar os caracteres até que
ela apareça:

$ registro='spf-25.dominio.net.br. 3600 IN TXT "v=spf1 ip4:XXX.XXX.XXX.0/24
ip4:YYY.YYY.YYY.0/24 exists:%{h}.%{p}.%{l}.%{i}._spf-25.dominio.net.br~all"'

$ zona=dominio.net.br

$ echo $registro | awk '{print substr($1, 1, index($1, z)-2)}' z=$zona
spf-25

Explicando:

index(string1, string2) ---> função que retorna a posição da string2 na
string1. No caso, estou procurando a string z (que é a zona) no primeiro
campo ($1).

substr(string1, inicio, fim) ---> retorna uma substring da string1 que
começa em 'inicio' e termina em 'fim'. Usei o início como sendo 1 (primeiro
caractere de $1) e o fim sendo a posição da $zona na string, -2 para remover
o ponto antes do nome do domínio.

z=$zona ---> recurso para criar uma variável que poderá ser usada dentro do
bloco de código do awk. Eu chamei de 'z' uma variável com o conteúdo de
$zona.

Na outra mensagem eu também usei a função length(string) que retorna o
tamanho (quantidade de caracteres) de uma string.

> $ echo $a | awk 'BEGIN {FS = "."}; {printf "%s ", $1}; {print substr($0,
> index($0, "\""), length($0))}'
Nesse trecho aqui, eu setei FS (variável interna do awk que significa Field
Separator) para ser o ponto, aí imprimi o campo 1 com o printf. É como fazer
"cut -d. -f1". Daria certo, se não fosse o problema que você levantou com os
registros que tenham ponto no nome. Depois foi a mesma lógica da explicação
anterior, usando substr(), index() e length(). ;-)

Abração.

Att,

Fernando Mercês
Linux Registered User #432779
www.mentebinaria.com.br
softwarelivre-rj.org
@MenteBinaria
------------------------------------
Participe do I Hack'n Rio
                 hacknrio.org
------------------------------------


2011/10/6 M. Rodrigo Monteiro <address@hidden>

> **
>
>
> Oi!
>
> 2011/10/6 Fernando Mercês <address@hidden>:
>
> > Se quiser pegar um de cada vez, o cut resolve:
> >
> > $ a='spf-25.dominio.net.br. 3600 IN TXT "v=spf1 ip4:XXX.XXX.XXX.0/24
> > ip4:YYY.YYY.YYY.0/24 exists:%{h}.%{p}.%{l}.%{i}._spf-25.dominio.net.br
> ~all"'
> >
> > $ echo $a | cut d. -f1
> > spf-25
> >
> > $ echo $a | cut -d\" -f2
> > v=spf1 ip4:XXX.XXX.XXX.0/24 ip4:YYY.YYY.YYY.0/24
> > exists:%{h}.%{p}.%{l}.%{i}._spf-25.dominio.net.br ~all
>
> Pode haver ponto também no registro, ou seja, poderia ser
> teste.spf-25.dominio.net.br. Nesse caso tanto o cut quanto o AWK daria
> erro pois o separador não é o ponto, e sim $zona
>
>
> >
> >
> > Agora, para imprimir os dois de uma vez só, consegui com o awk:
> >
> > $ echo $a | awk 'BEGIN {FS = "."}; {printf "%s ", $1}; {print substr($0,
> > index($0, "\""), length($0))}'
> > spf-25 "v=spf1 ip4:XXX.XXX.XXX.0/24 ip4:YYY.YYY.YYY.0/24
> > exists:%{h}.%{p}.%{l}.%{i}._spf-25.dominio.net.br ~all"
> >
>
> Você poderia explicar essa sintaxe do AWK?
>
> Abraços,
> Rodrigo.
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]