Regex char 类-更优雅的解决方案

Regex char 类-更优雅的解决方案

我有两个具有不同日志结构的 barracuda FW 和一个需要解析它们的 Logstash grok 过滤器插件。

值仅日志条目

+02:00 Info     blabla Detect: FWD|TCP|bond0.777|1.1.1.1|53329|00:00:00:00:00:00|20.190.159.32|443||bond1.182||0|80.231.71.252|20.190.159.32|0|1|0|0|0|0||SSL|Microsoft Services Base|graph.microsoft.com||Computing/Technology (82)

字段 + 值日志条目

+02:00 Info     blabla Remove: type=FWD|proto=UDP|srcIF=pvpn0|srcIP=1.1.1.1|srcPort=61661|srcMAC=00:00:00:00:00:00|dstIP=10.248.0.10|dstPort=53|dstService=dns|dstIF=pvpn0|rule=V2L-DNS-IN|info=Balanced Session Idle Timeout|srcNAT=10.248.11.215|dstNAT=127.0.0.1|duration=20|count=1|receivedBytes=444|sentBytes=82|receivedPackets=1|sentPackets=1|user=johba|protocol=|application=|target=|content=|urlcat=

我已经有一个适用于第一种情况的正则表达式。但是,我希望有一个在两种情况下都匹配的正则表达式,无论是否存在文件名。

例如我希望我的正则表达式FWD匹配type=FWD

  1. 我首先尝试使用 char 类,即[type=]*\w+。缺点是,例如,如果我有dstService=dns,并且我的正则表达式的部分是[dstService=]*\w+grok 过滤器只会匹配ns而不是dns
  2. 然后我尝试了一下d*s*t*S*e*r*v*i*c*e*=*\w+,成功了。但是,我在想是否有更优雅的方式来实现这个目标?

答案1

一个字符类匹配该类定义范围内的 1 个字符。

例如,

  • [type=]*\w+t匹配、yp、范围内的 0 个或多个任意字符e,或=后跟 1 个或多个单词字符(即[a-zA-Z0_9_]
  • [dstService=]*\w+d匹配、stServ、范围内的 0 个或多个任意字符ic=后跟 1 个或多个单词字符(即[a-zA-Z0_9_]

您想要匹配的是:

  • 第一(?:type=)?FWD
    • 匹配可选的,type=然后是FWD
  • 第二(?:dstService=)?dns
    • 匹配可选的,dstService=然后是dns

演示与说明

相关内容