Componha uma sequência de IPs usando a linha de comando bash

Componha uma sequência de IPs usando a linha de comando bash

Tenho um comando que retorna o seguinte:

 id1="172" id2="17" id3="136" id4="5" id5="0" />
 id1="172" id2="17" id3="128" id4="2" id5="0" />
 id1="172" id2="17" id3="128" id4="4" id5="0" />
 id1="172" id2="17" id3="128" id4="6" id5="0" />

Os primeiros quatro IDs combinados representam um endereço IP (por exemplo, 172.17.136.5para a primeira linha).

Gostaria de canalizar o texto acima para um comando de análise que gerará uma única string com todos os endereços IP separados por espaços.

Para o exemplo acima:

myVariable="172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6"

Como posso fazer isso?

Responder1

Você pode fazer isso com um awkcomando mais facilmente:

your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}'

Para defini-lo como uma variável, use a substituição de comando:

myVariable="$(your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"

-Fdefine o separador do campo de entrada (que por padrão é qualquer espaço em branco) para um valor personalizado; neste caso, aspas duplas ( ").

-vpermite que você defina awkvariáveis.

OFSé o separador do campo de saída, por padrão um único espaço. Nós definimos um período.

ORSé a saídaregistroseparador, por padrão uma nova linha. Nós o configuramos para um espaço.

Em seguida imprimimos o 2º, 4º, 6º e 8º campos para cada linha da entrada.


Exemplo de saída:

$ cat temp
 id1="172" id2="17" id3="136" id4="5" id5="0" />
 id1="172" id2="17" id3="128" id4="2" id5="0" />
 id1="172" id2="17" id3="128" id4="4" id5="0" />
 id1="172" id2="17" id3="128" id4="6" id5="0" />
$ myVariable="$(cat temp | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
$ echo "$myVariable" 
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6 
$ 

Responder2

myvariable=$(yourmysterycommand |
               sed -e 's/id1=//;
                       s/id5=.*//;
                       s/"//g;
                       s/id.=/./g;
                       s/[[:blank:]]\+//g' |
               paste -sd' ')

É uma linha, mas reformatada com novas linhas extras e recuo para facilitar a leitura.

$ echo "$myvariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6

O sedcomando remove a string id1=, depois remove id5=tudo o que vem a seguir, depois remove todos os caracteres de aspas duplas ( "), altera todas as ocorrências de id.=para um literal .e, finalmente, remove todos os caracteres em branco (espaços e/ou tabulações) da linha.

O pastecomando une as linhas com um caractere de espaço como delimitador.


Aliás, uma solução melhor seria consertar qualquer programa que esteja imprimindo endereços IP em um formato tão inútil e estúpido. Um octeto em um endereço IP não é nenhum tipo de “id”.

informação relacionada