1. 程式人生 > >grok正則表示式一行多個結果匹配

grok正則表示式一行多個結果匹配

  • 原理介紹

    • grok內建了一些常用正則的表示式,其在grok-pattern檔案中;
    • 你可以自己定義一些喜歡的正則表示式,用於匹配自己需求的內容:

例如:中國式的時間匹配2018/9/11 9:46:32 

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

其中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,待研究原始碼再詳細說這個問題