извлечь уникальное значение из файла журнала log4j - PullRequest
0 голосов
/ 26 января 2012

У меня проблемы с извлечением только подходящей строки: OPER ^ из файла log4j. Я могу получить это значение из двух разных источников внутри моего файла журнала:

2012-01-26 03:06:45,428 INFO  [NP_OSS] OSSBSSGWIMPL6000|**OPR20120126120537008893**|GenServiceDeactivationResponse :: processRequestGenServiceDeactivationResponse() ::

или

2012-01-26 03:06:45,411 INFO  [NP_OSS] MESSAGE_DATA = <?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:ServiceDeactivationResponse xmlns:ns2="urn:ngn:foo"><MessageHeader><MessageTimeStamp>20120126031123</MessageTimeStamp>**<OperatorTrxID>OPR20120126120537008893</OperatorTrxID>**</MessageHeader></ns2:ServiceDeactivationResponse>

Мне нужно извлечь только значение OPR * Я предполагаю, что намного проще извлечь его из первого, так как он не включает анализ XML.

Большое спасибо заранее за вашу помощь!

Ответы [ 3 ]

5 голосов
/ 26 января 2012

может быть, я плохо понял вопрос OP, почему простая команда grep не может выполнить эту работу?

как

grep -Po 'OPR\d+'

вывод для обеих строк одинаков:

OPR20120126120537008893
2 голосов
/ 26 января 2012

awk: Настройка разделителей полей

awk -v FS="[<>]" '{print $13}' logfile

perl: Использование положительного взгляда вперед и взгляда назад

perl -pne 's/.*(?<=\<OperatorTrxID\>)([A-Z0-9]+)(?=\<\/OperatorTrxID\>).*/$1/' logfile

Тест:

[jaypal:~/Temp] cat logfile
2012-01-26 03:06:45,411 INFO  [NP_OSS] MESSAGE_DATA = <?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:ServiceDeactivationResponse xmlns:ns2="urn:ngn:foo"><MessageHeader><MessageTimeStamp>20120126031123</MessageTimeStamp><OperatorTrxID>OPR20120126120537008893</OperatorTrxID></MessageHeader></ns2:ServiceDeactivationResponse>

[jaypal:~/Temp] awk -v FS="[<>]" '{print $13}' logfile
OPR20120126120537008893

[jaypal:~/Temp] perl -pne 's/.*(?<=\<OperatorTrxID\>)([A-Z0-9]+)(?=\<\/OperatorTrxID\>).*/$1/' logfile
OPR20120126120537008893
2 голосов
/ 26 января 2012
$ echo $line | grep OPR | sed -e "s/^.*OPR\([0-9]*\).*$/\1/" 

Edit:

Прочитав ваш комментарий:

$ echo $line | grep OPR | sed -e "s/^.*\(OPR[0-9]*\).*$/\1/" | head -1
...