从log4j日志文件中提取唯一值

时间:2012-01-26 09:34:18

标签: bash sed awk grep

我无法从log4j文件中提取匹配的字符串:OPER ^。 我可以从日志文件中的两个不同来源获取此值:

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 个答案:

答案 0 :(得分:5)

也许我不太了解OP的问题,为什么一个简单的grep命令无法完成这项工作?

grep -Po 'OPR\d+'

两行的输出相同:

OPR20120126120537008893

答案 1 :(得分:2)

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

修改

阅读评论后:

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

答案 2 :(得分:2)

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