Я не думаю, что awk - правильный инструмент для этого, потому что он предназначен для работы построчно. Поскольку ваш шаблон занимает несколько строк, и у вас есть файл XML, извлеките выгоду из мощной структуры XML.
Итак, если вы хотите напечатать текстовый узел под тегом, который удовлетворяет некоторому условию, выберите его с помощью выражения xpath .
Согласно приведенному выше регулярному выражению, я предполагаю, что вы ищете тег <key>
, содержащий текст "NetworkServices", затем вы go переходите к следующему узлу с тегом <dict>
, затем вы находите нужный вам узел <key>
, запоминаете текст (это то, что вы ищете) и проверяете, что за ним следует <key>Interface</key>
, далее вы go переходите к следующему узлу с тегом <dict>
, где вы необходимо проверить наличие узла <key>DeviceName</key>
, за которым следует <string>ip1</string>
.
Вот код, который я бы использовал для выбора с xpath в соответствии с этим:
/usr/bin/xpath -q -e '
//key[text()="NetworkServices"]/following-sibling::dict[1]
/key[
following-sibling::dict[1]/key[
text()="Interface" and
following-sibling::dict[1]/key[
(text()="DeviceName") and (following-sibling::string[1]/text()="ip1")
]
]
]
/text()
' input.xml