我有以下日志,需要使用正则表达式(pcre)
提取时间,主机名2017-05-05T13:03:10.004595 + 00:00 VMware ESX部分,abc.hostname.co.uk Vpxa:[fcec63d0] info' commonvpxLro' opID = host @ 127454-101-20] [VpxLRO] - FINISH task-internal-3548957 --- - vmod1.query.PropertyCollector.Filter.destroy -
2017-05-05T13:04:10.7568945 + 00:00 abc.hostname.co.uk,Vpxa:[fcec63d0] info' commonvpxLro' opID = host @ 89459-13-20] [VpxLRO] - FINISH task-internal-3548957 --- - vmod1.query.PropertyCollector.Filter.destroy -
2017-05-05T13:05:10.785895 + 00:00 VMware ESX部分,abc.hostname.co.uk Vpxa:[fcec63d0] info' commonvpxLro' opID = host @ 12748-101-20] [VpxLRO] - FINISH task-internal-3548957 --- - vmod1.query.PropertyCollector.Filter.destroy -
2017-05-05T13:13:11.986532 + 00:00 VMware ESX部分,abc.hostname.co.uk Vpxa:[fcec63d0] info' commonvpxLro' opID = host @ 12748-101-20] [VpxLRO] - FINISH task-internal-3548957 --- - vmod1.query.PropertyCollector.Filter.destroy -
例如:Timestamp = 2017-05-05T13:13:11.986532 + 00:00 hostname = abc.hostname.co.uk我需要使用单个正则表达式从上述4个日志中提取。这里棘手的部分是时间戳之后的每个备用日志"适用于VMware ESX的部分,"正在增加。有人告诉我,我可以将它分组,称时间戳为一个捕获组,下一组为主机名。我能够编写一个用于捕获时间戳的正则表达式但是如何为主机名创建捕获组?
答案 0 :(得分:0)
以下适用于您的示例,它捕获组1中的时间和组2中的主机名:
(\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{1,7}\+\d\d:\d\d)[^\.]*(\s[\w]*\.[\w]*[\.[\w]*]*)
这是什么意思:
\d\d\d\d-\d\d-\d\dT\d\d:\d\d
捕获类似0000-00-00T00:00
.\d{1,7}+\d\d:\d\d
捕获类似.0x1-7+00:00
的内容,其中0x1-7表示必须介于1到7位数之间
[^.]*
表示"字符串由不是.
"的任何字符组合组成。请注意,我在此假设在日期之后出现的第一个点字符位于主机地址中。如果你不知道它是否会成为第一个点,这个正则表达式会变得更复杂
(\s[\w]*\.[\w]*[\.[\w]*]*)
表示空格(或制表符或输入),然后是text.text.text.text.text
,.text
出现至少2次(前两个[\w]*
但可能有尽可能多的部分