grok正则表达式一行多个结果匹配

  • 原理介绍

    • grok内置了一些常用正则的表达式,其在grok-pattern文件中;
    • 你可以自己定义一些喜欢的正则表达式,用于匹配自己需求的内容:

例如:中国式的时间匹配2018/9/11 9:46:32 

TIMESTAMP_CHS %{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}

 在grok官网有相应的在线正则匹配测试,不过需要翻墙,地址是http://grokdebug.herokuapp.com/#

其中Add custom patterns 是自定义正则,如果grok表达式中包含自定义正则而网站又不知道你的自定义正则是什么意思,就会编译报错。

 

  • 一行包含n个数据结果,取第m个匹配到的结果

案例:要匹配的内容str:{a=one,b=3},{a=two,b=4},{a=three,b=9},{a=four,b=10}

要匹配a=one,使用%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})即可。但若要挨个匹配各个a的值,需要挨个匹配:

(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){1}  --> one

(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){2}  --> two

(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){3}  --> three

(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){4}  --> four

这样做实际上是把一行匹配多个结果的问题,转化成了一条日志匹配多次取不同段数据的问题。

另外作者在实际测试过程中,发现了一个问题,就是匹配的内容str其中包括了大量的数据,其中包含了回车和换行,导致grok表达式匹配直接卡死,并最终未匹配到结果。究其原因,是%{DATA}和.*实际上都匹配不到回车和换行,按理说匹配不到应该直接返回null,但实际上却卡了很久,不知道是不是grok的一个bug,待研究源码再详细说这个问题

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值