在正则表达式中分组以捕获时间戳和主机名

Grouping in regex to capture timestamp and hostname

我有以下日志,需要使用正则表达式 (pcre) 提取时间、主机名

2017-05-05T13:03:10.004595+00:00 VMware ESX 部分,abc.hostname.co.uk Vpxa: [fcec63d0] 信息 'commonvpxLro' opID=host@127454-101-20] [ VpxLRO] -- 完成 task-internal-3548957 --- -- vmod1.query.PropertyCollector.Filter.destroy --

2017-05-05T13:04:10.7568945+00:00 abc.hostname.co.uk, Vpxa: [fcec63d0] 信息 'commonvpxLro' opID=host@89459-13-20] [VpxLRO] --完成 task-internal-3548957 --- -- vmod1.query.PropertyCollector.Filter.destroy --

2017-05-05T13:05:10.785895+00:00 VMware ESX 部分,abc.hostname.co.uk Vpxa: [fcec63d0] 信息 'commonvpxLro' opID=host@12748-101-20] [ VpxLRO] -- 完成 task-internal-3548957 --- -- vmod1.query.PropertyCollector.Filter.destroy --

2017-05-05T13:13:11.986532+00:00 VMware ESX 部分,abc.hostname.co.uk Vpxa: [fcec63d0] 信息 'commonvpxLro' opID=host@12748-101-20] [ VpxLRO] -- 完成 task-internal-3548957 --- -- vmod1.query.PropertyCollector.Filter.destroy --

例如:时间戳=2017-05-05T13:13:11.986532+00:00 hostname=abc.hostname.co.uk 我需要使用单个正则表达式从上述 4 个日志中提取。这里棘手的部分是添加时间戳 "Section for VMware ESX," 之后的每个备用日志。有人告诉我可以将它分组,将时间戳记作为一个捕获组,下一组是主机名。我能够编写用于捕获时间戳的正则表达式,但我如何为主机名创建捕获组?

以下适用于您的示例,它捕获组 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 个数字

[^.]* 表示 "string consisting of any combination of characters that are not a ."。请注意,我在这里假设日期之后出现的第一个点字符位于主机地址中。如果你不知道它是否是第一个点,这个正则表达式会变得更复杂

(\s[\w]*\.[\w]*[\.[\w]*]*) 表示 space (或 tab 或输入)然后类似 text.text.text.text.text.text 至少出现 2 次(前两个 [\w]* 但可能有尽可能多的部分

在这里试试:https://regex101.com/r/we04e6/2