Compor string de IPs usando a linha de comando do bash

5

Eu 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.5 para a primeira linha).

Eu gostaria de canalizar o acima para um comando de análise que mostrará 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?

    
por LinuxLearner 25.06.2016 / 01:57

2 respostas

6

Você pode fazer isso com um comando awk mais facilmente:

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

Para definir como variável, use substituição de comando:

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

-F define o separador de campos de entrada (que é por padrão qualquer espaço em branco) para um valor personalizado; neste caso, uma aspa dupla ( " ).

-v permite que você defina awk variáveis.

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

ORS é o separador de saída record , por padrão, uma nova linha. Nós configuramos isso para um espaço.

Em seguida, imprimimos os 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 
$ 
    
por 25.06.2016 / 02:43
0
myvariable=$(yourmysterycommand |
               sed -e 's/id1=//;
                       s/id5=.*//;
                       s/"//g;
                       s/id.=/./g;
                       s/[[:blank:]]\+//g' |
               paste -sd' ')

Esse é um verso, mas reformatado 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 comando sed remove a string id1= , depois remove id5= e tudo o que segue, 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 comando paste une as linhas com um caractere de espaço como delimitador.

BTW, 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 é qualquer tipo de "id".

    
por 25.06.2016 / 05:31