[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]