我将用户ID与regex(在Splunk中)匹配,并遇到了混合结果:
正则表达式 ^[^=\n]*
Splunk提取 ^[^=\n]*=(?P<user>[^ ]+)
规则/测试数据
日志样本
Oct 3 23:33:00 2019 wc1 authmgr[4111]: <522008> <4904> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname MAC=d0:c6:25:79:e7:c6 IP=192.168.16.26 role=Authenticated VLAN=600 AP=43:4a:e3:c9:ec:0c SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv
Oct 3 22:42:27 2019 wc1 authmgr[4111]: <522008> <4111> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname initial MAC=b2:09:cf:4c:80:1e IP=192.168.16.27 role=Authenticated VLAN=600 AP=34:fc:b2:c1:be:dc SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv
期望
username=lastname, firstname
username=lastname, firstname initial
匹配在regex.com上有效,但lastname, firstname
在Splunk中不匹配。似乎当前的正则表达式在逗号处停止。
答案 0 :(得分:1)
您的Regex在一个地方而不是另一个地方工作的原因可能是由于regexr.com和Splunk中使用的Regex风格/引擎不同。
以下正则表达式适用于您的用例:
^[^=]*=([^=]*)(?=\s)
但是,用户名不能包含等号以使Regex正常工作。这可以通过将用户输入清理为字母数字以及指定的特殊字符(“。”,“ \”,空格)等来实现。
const logEntries = `Oct 3 23:33:00 2019 wc1 authmgr[4111]: <522008> <4904> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname MAC=d0:c6:25:79:e7:c6 IP=192.168.16.26 role=Authenticated VLAN=600 AP=43:4a:e3:c9:ec:0c SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv
Oct 3 22:42:27 2019 wc1 authmgr[4111]: <522008> <4111> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname initial MAC=b2:09:cf:4c:80:1e IP=192.168.16.27 role=Authenticated VLAN=600 AP=34:fc:b2:c1:be:dc SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv`;
let result;
logEntries.split(/\n/).map((entry) => {
result = entry.match(/^[^=]*=([^=]*)(?=\s)/);
if (result) {
console.log(result[1]);
}
});
在上面的示例中,请注意,我首先将日志分成单独的条目,然后分别对每个条目进行正则表达式匹配。
正则表达式的解释:
^
-在行的开头声明位置
[^=]
-匹配任何非文字等号(=)
*
-零到无限次匹配
=
-与文字等号匹配
([^=]*)
-与任何非文字等号匹配的捕获组
(?=\s)
-一个积极的前瞻性断言,字符串中当前位置之后紧跟的是空格字符
答案 1 :(得分:1)