AWK: извлечь значение между двумя тегами html 'из вывода, содержащего html все в одной строке - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть вывод html, который все в одной строке;Я пытался извлечь серийные номера с помощью awk, но по какой-то странной причине я получаю только один вывод.Выходные данные curl выводятся в формате xml.

curl -sSku user:somepass https://somewebsite.com/computergroups/id/4
-X GET | awk 'BEGIN{IGNORECASE=1;FS="<serial_number>|</serial_number>";RS=EOF} {print $2}'

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

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Не позволяйте никому терять силу awk, Хорем.

Я сгенерировал некоторые тестовые данные, подобные этой.

for n in {101..107}; do echo -n "a b c <serial_number>$n</serial_number>"; done > data

Тогда это,

cat data | awk -- 'BEGIN{IGNORECASE=1;FS=">";RS="</serial_number"};/<serial/{print $NF}'

производит это.

101
102
103
104
105
106
107
0 голосов
/ 13 февраля 2019

если у вас есть gawk

$ ... | awk -v RS='</?serial_number>' '!(NR%2)'

предполагает, что открытый тег предшествует закрытому тегу.

0 голосов
/ 13 февраля 2019

Awk будет хрупким решением (то есть, скорее всего, в будущем произойдет сбой при изменении выходного XML).

Если вы хотите сделать это в любом случае только один раз, используйте rs, чтобы привязать каждый тег к строкеи возьмите куски после в awk с регулярным выражением.

$ echo '<serialnumber>098456</serialnumber><serialnumber>095444></serialnumber>' | rs -c\> 0 1
<serialnumber
098456</serialnumber
<serialnumber
095444
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...