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

时间:2019-03-24 17:25:18

标签: 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>[\w]+)\s\|\s*TASK\s*\[(?<task>[^=]*)

这对我来说很困难,就是我需要将“任务”标签准确地匹配到这个: “这是任务名称”。此时,“任务”与“”这是任务名称msg”匹配。 当然,这只是一个示例,单词本身在示例之间会发生变化。

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

因此,我需要进行匹配,直到找到“ =”,然后将其后面的单词取反,在这种情况下,该单词是“ msg”(根据任务的不同,该单词也可能会更改)。

任何想法如何做到这一点?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见regex demo

有趣的是(?<task>[^\]=]*)\s\w+=部分:

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