logstash 仅使用Grok或ruby代码过滤第一个匹配项

zzlelutf  于 2022-12-09  发布在  Logstash
关注(0)|答案(1)|浏览(145)

我有一个包含以下数据的字段

"REQUEST-941-APPLICATION-ATTACK-XSS, REQUEST-941-APPLICATION-ATTACK-XSS, REQUEST-941-APPLICATION-ATTACK-XSS, REQUEST-942-APPLICATION-ATTACK-SQLI, REQUEST-949-BLOCKING-EVALUATION, RESPONSE-980-CORRELATION

我只想退回第一件商品,即:(请求-941-应用程序-攻击-XSS),但当我使用这个grok过滤器

grok
    {
        match => {"attack_names" => "(?<attack>^[A-Z1-9-]+)"}
        remove_field => ["attack_names"]
    }

它返回所有匹配项

"REQUEST-941-APPLICATION-ATTACK-XSS, REQUEST-941-APPLICATION-ATTACK-XSS, REQUEST-941-APPLICATION-ATTACK-XSS, REQUEST-942-APPLICATION-ATTACK-SQLI, REQUEST-949-BLOCKING-EVALUATION, RESPONSE-980-CORRELATION

所以,我尝试了这个ruby代码:

ruby 
    {
    code => "
            saveid = event.get('attack_names').split(',')[0]
            event.set('attack',saveid)
            "
    }

但这似乎没有任何作用,并且文件没有添加到数据中。
我做错了什么?

2uluyalo

2uluyalo1#

如果你的字段以"REQUEST开头,那么将模式锚定到字段内容开头的^将阻止你的模式匹配。在可能的情况下,锚定模式 * 总是 * 是一个good idea,因为它使匹配失败的速度更快,并且当匹配失败时回溯的成本会使grok模式非常昂贵。
你可以试试

grok { match => { "attack_names" => '^\"(?<attack>[A-Z1-9-]+)' } }

您不需要尝试在匹配的模式结尾之后使用任何其他字符。

相关问题