在正则表达式中分组以捕获时间戳和主机名
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]*
但可能有尽可能多的部分
我有以下日志,需要使用正则表达式 (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]*
但可能有尽可能多的部分