Составьте строку IP-адресов с помощью командной строки bash

Составьте строку IP-адресов с помощью командной строки bash

У меня есть команда, которая возвращает следующее:

 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" />

Первые четыре идентификатора вместе представляют собой IP-адрес (например, 172.17.136.5для первой строки).

Я хотел бы передать вышеизложенное в команду синтаксического анализа, которая выведет одну строку со всеми IP-адресами, разделенными пробелами.

Для приведенного выше примера:

myVariable="172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6"

Как я могу это сделать?

решение1

awkПроще всего это сделать с помощью команды:

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

Чтобы установить его как переменную, используйте подстановку команд:

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

-Fустанавливает разделитель полей ввода (по умолчанию это любой пробел) на пользовательское значение; в данном случае это двойные кавычки ( ").

-vпозволяет устанавливать awkпеременные.

OFSразделитель выходных полей, по умолчанию один пробел. Мы устанавливаем его на точку.

ORSэто выходзаписыватьРазделитель, по умолчанию новая строка. Мы устанавливаем его на пробел.

Затем мы печатаем 2-е, 4-е, 6-е и 8-е поля для каждой строки ввода.


Пример вывода:

$ 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 
$ 

решение2

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

Это однострочный текст, но переформатированный с дополнительными переносами строк и отступами для удобства чтения.

$ echo "$myvariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6

Команда sedудаляет строку id1=, затем удаляет id5=и все, что следует за ней, затем удаляет все символы двойных кавычек ( "), заменяет все вхождения id.=на литерал .и, наконец, удаляет все пустые символы (пробелы и/или табуляции) из строки.

Команда pasteобъединяет строки, используя пробел в качестве разделителя.


Кстати, лучшим решением было бы исправить программу, которая печатает IP-адреса в таком бесполезном и глупом формате. Октет в IP-адресе не является каким-либо "id".

Связанный контент