У меня есть команда, которая возвращает следующее:
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".