【问题标题】:Grouping in regex to capture timestamp and hostname在正则表达式中分组以捕获时间戳和主机名
【发布时间】:2017-05-05 14:38:21
【问题描述】:

我有以下日志,需要使用 regex(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] -- 完成任务-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 --

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

【问题讨论】:

  • 分享你的尝试.

标签: regex capturing-group


【解决方案1】:

以下适用于您的示例,它捕获第 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]* 但可能有尽可能多的部分

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

【讨论】:

  • 非常感谢。有效。我所做的唯一更改是多次而不是 \d,我已将其更改为 \d+-\d+ 等。再次非常感谢您的及时回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2019-03-17
  • 2011-03-03
相关资源
最近更新 更多