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).
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 awk
comando 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}')"
-F
define o separador do campo de entrada (que por padrão é qualquer espaço em branco) para um valor personalizado; neste caso, aspas duplas ( "
).
-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 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 sed
comando 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 paste
comando 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”.