我的真实模式更复杂,但我试图将问题归结为核心问题。我不明白的东西。请在http://grokconstructor.appspot.com/do/match上试试这个
我正在尝试匹配以下几行:
Start-Date: 2017-08-07 06:48:12
End-Date: 2017-08-07 06:48:12
Start-Date: 2017-08-07 12:55:16
End-Date: 2017-08-07 12:56:01
使用附加模式:
DATE_EU2 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[\s]+?%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE_COMB %{DATE_EU2}?%{DATE_EU}?%{DATE_US}?
以及以下主要模式:
Start-Date: %{DATE_COMB:starttime}\nEnd-Date: %{DATE_COMB:endtime}
使用多行过滤器:
^\n (negated)
运行它,你应该(希望!)得到:
Start-Date: 2017-08-07 06:48:12 End-Date: 2017-08-07 06:48:12 Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01
MATCHED
starttime 2017-08-07··06:48:12
endtime 2017-08-07··06:48:12
after match: Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01
所以它匹配第一个记录但不匹配第二个记录。如果我在主模式的末尾添加一个 '\z' ,那么它将匹配第二条记录但不匹配第一条记录。因此,它显然将整个事情视为一条线。但为什么?我的多行过滤器指出,如果一行不以换行符开头,它是上一条记录的一部分,对吗?那么这应该在中间留下一个空白行,显然确实以换行符开头,因此应该包含一个单独的事件,不是吗?
任何指点都感激地接受。
输入
多行过滤器 =
^\n
(否定)多行过滤器将依次查看每一行以查看应该合并的内容。
试图匹配 a
\n
,尤其是在一行的开头是没有意义的。您最好
^End-Date:
将其与以前的匹配和合并。(或者如果一个事件有更多行,并且它总是以 开头Start-Date:
,匹配它并否定。根据 Grok 构造函数的注释和测试进行编辑。
如果使用空行作为记录分隔符更有意义,
^\z
或者^\Z
似乎可以工作。\Z
忽略任何最终终止符,但\z
在我的测试中也可以看到,它似乎确认该行在传递到过滤器时是一个完全空的字符串(没有换行符或任何其他终止字符)。