Если ваш XML-файл или файл журнала настолько хорошо сформирован, как вы заявляете, вы можете (ab) использовать awk
и его RS
функцию разделителя записей, чтобы выполнить большую часть анализа для вас:
awk 'BEGIN{ RS="</envelope>"; FS="<envelope>" }; $0 ~ order { print "<envelope>",$2,"</envelope>" }' order=XYZ_123_456 tmp.txt
Это работает, определяя </envelope>
как разделитель записей awk, а затем читая все вещи между </envelope>
строками.Чтобы затем раздеть / разделить другие сообщения журнала, я использую разделитель полей FS
, чтобы разделить «строку» на столбцы, и вывести второй столбец.
Это ужасно не удастся, если произойдет <envelope>
или </envelope>
Строка может появиться где-нибудь еще в ваших данных журнала, но вы уже указали на лучшие парсеры XML.
Поскольку для вышеприведенного решения требуется GNU awk для multi-char RS
, здесь то же самое решениеиспользуя perl
для случая, когда нет подходящей версии awk:
perl -ne 'BEGIN{ $/="</envelope>";$order=shift }; /<envelope>.*$order.*/ms and print $&' XYZ_123_456 tmp.txt