Regex 从符号到上一个空格取反

Regex 从符号到上一个空格取反,regex,logstash,logstash-grok,oniguruma,Regex,Logstash,Logstash Grok,Oniguruma,尝试使用logstash grok过滤器(oniguruma regex)来过滤一些日志。对于如下所示的日志条目: 2019-03-24 17:57:14,202 p=19455 u=root | TASK [this is the task name msg=Debug message] ************************ 我编写了这个过滤器: %{DATE:date}\s%{TIME:time}\sp=(?<id>[\d]+)\su=(?<user>

尝试使用logstash grok过滤器(oniguruma regex)来过滤一些日志。对于如下所示的日志条目:

2019-03-24 17:57:14,202 p=19455 u=root |  TASK [this is the task name msg=Debug message] ************************
我编写了这个过滤器:

%{DATE:date}\s%{TIME:time}\sp=(?<id>[\d]+)\su=(?<user>[\w]+)\s\|\s*TASK\s*\[(?<task>[^=]*)
%{DATE:DATE}\s%{TIME:TIME}\sp=(?[\d]+)\su=(?[\w]+)\s\\\s*任务\s*\[(?[^=]*)
对我来说,这里的困难在于,我需要将“任务”标签与以下内容完全匹配: “这是任务名称”。此时“任务”与“这是任务名称消息”匹配。 当然,这只是一个例子,单词本身会随着例子的不同而变化

这是一个ansible日志,出于某种原因,它将任务名称和任务本身混合在同一个日志行中,并且只使用空格分隔它们。在所有情况下,我都知道任务名称已经完成,任务详细信息正在显示,因为“=”符号

所以我需要进行匹配,直到找到一个“=”,然后否定它后面的单词,在本例中是“msg”(根据任务的不同,这个单词也可能发生变化)

有什么办法可以做到这一点吗?谢谢!

您可以使用

%{DATE:date}\s%{TIME:time}\su=(?<user>\w+)\s\|\s*TASK\s*\[(?<task>[^\]=]*)\s\w+=
%{DATE:DATE}\s%{TIME:TIME}\su=(?\w+)\s\\\s*TASK\s*\[(?[^\]=]*)\s\w+=

(?[^\]=]*)\s\w+=
部分很有趣:

  • (?[^\]=]*)
    -名为“任务”的组:
    [^\]=]*
    匹配除
    ]
    =
    之外的任何0+字符
  • \s
    -一个空格
  • \w+
    -1+字字符
  • =
    -a
    =
    字符

Try
%{DATE:DATE}\s%{TIME:TIME}\su=(?[\w]+)\s\\\s*TASK\s*[(?[^\]=]]]*)\smsg=
Hi Wiktor!在更正了一些小的打字之后,你的过滤器可以工作,但它只能在给定的示例中工作。“msg”并不总是“=”符号前面的单词(我试图解释这一点,但我的英语作为我的正则表达式技能非常有限)。有没有一种方法可以在“=”之前立即否定任何单词?在这种情况下,它正好是“msg”,但它可以是任何形式(“token”、“state”、“path”…谁知道还有什么)。好的。没关系。谢谢你的例子,我能够想象出一个可能的解决方案。“%{DATE:DATE}\s%{TIME:TIME}\sp=(?[\D]+)\su=(?[\w]+)\s\\s\\s\\sTASK s*(?[^]=])\s(\w)*=“这是工作,idk如果这是好的或不好,但它的工作。非常感谢你!!!