如何根据字符串中的相似性对字符串进行分组

问题描述

我有一个 splunk 查询,它按频率生成错误汇总

index="pc_1" LogLevel=ERROR 
   | eval Message=split(_raw,"|") 
   | stats count(LogLevel) as Frequency by Message 
   | sort -Frequency

这会以形式产生结果

留言 频率
没有该用户 137
无法将邮件发送到 example@email.com:无法访问服务器 70
无法将邮件发送到 example1@email.com:无法访问服务器 43
无法验证用户 3456 8
无法将邮件发送到 example2@email.com:无法访问服务器 6
无法验证用户 2321 5
无法验证用户 13321 3
... .
... .
... .
无法将邮件发送到 examplen@email.com:无法访问服务器 1

正如您在生成的结果中所注意到的,一些类似的错误正在根据用户电子邮件 ID 和机器 ID 的差异进行拆分。 我正在寻找一种方法,可以根据字符串的相似性对其进行分组。目前我使用的是用普通的正则表达式替换字符串,然后找到频率

index="pc_1" LogLevel=ERROR 
   | eval Message=split(_raw,"|")

   | eval Message=replace("unable to deliver mail to (.)* Unable to reach server","unable to deliver mail to [email]: Unable to reach server")
   | eval Message=replace("unable to authenticate user \d+","unable to authenticate user [userId]")

   | stats count(LogLevel) as Frequency by Message 
   | sort -Frequency

这种方法有效,但非常麻烦,因为存在许多不同类型的错误,如果要实施此解决方案,则需要检查每个错误并为每个错误开发正则表达式。

有没有办法通过查询更有效地总结此错误来改善这种情况?

解决方法

子孙后代的答案:

也许 cluster 命令会有所帮助。它将类似的消息分组在一起。