Splunk:如何获取每个组的 N 个最新值?
Splunk: How to get N-most-recent values for each group?
我已经为这个查询苦苦思索了几个小时,看起来它应该相当简单,但出于某种原因,我发现它非常困难。我的客户想要查看每个 clientType 的前 2 个最新“密钥”。
(真的是前 N - 但不仅仅是“第一”或“最后”)
虽然在我询问的步骤之前完成了一些翻译,但我的数据看起来像这样作为查询的输出(注意:由于专有原因,我无法提供上面的实际步骤,也不是这是真实的数据,但我认为它应该翻译 OK)。我已经为应该出现在输出中的记录加注星标。
out? clientType key _time
---- ---------- ------------- -----------------
* Mobile asfk129458715 2020-10-13 12:10Z
* Online askg259750505 2020-10-12 11:59Z
* Email dh8iwwih33e99 2020-10-12 11:58Z
Online schf38hrnf98u 2020-10-12 11:00Z
* Online vn8n34rf9v83j 2020-10-12 11:56Z
* Mobile sjvn98h3idv9d 2020-10-12 11:56Z
* Email 92hnfi928rdh9 2020-10-12 11:55Z
* Fax jkcni983iiff4 2020-10-09 06:54Z
现在,我已经能够在更小的范围内(比如 1 天)完成这项工作。但是有些 clientTypes 不是很频繁,我们也需要查看最近的那些。此输出用于某些审计目的,我发现当我将搜索扩展到多天(返回 > 10,000 个事件)时,输出不稳定,我看到的结果是乱序的, 不是最近的,或者是歪斜的。
我想看到的是 - 每个客户类型只有前 2 名,在每个组中按时间降序排列
clientType key _time
---------- ------------- --------------
Mobile asfk129458715 2020-10-13 12:10Z
Mobile sjvn98h3idv9d 2020-10-12 11:56Z
Online askg259750505 2020-10-12 11:59Z
Online vn8n34rf9v83j 2020-10-12 11:56Z
Email dh8iwwih33e99 2020-10-12 11:58Z
Email 92hnfi928rdh9 2020-10-12 11:55Z
Fax jkcni983iiff4 2020-10-09 06:54Z
对于一些“我尝试过的”,我尝试以各种顺序使用一些查询代码,主要围绕 stats list(key)
、sort 0 -_time
等,使用各种“by”子句。此查询的输出还将经过一些额外的转换以用于我们的审计系统,它采用一个键列表,每个键都用单引号括起来并以逗号分隔。
我已经使用 stats delim="','"
和 mvcombine
在查询中取得了一些成功,得到的结果最终看起来像这样。我想将此作为问题的一部分包括在内,以便清楚最终状态需要是什么样子,以防需要在分组和排序部分的某处进行更改以使其更容易。
clientType keys
---------- -------------
Mobile 'asfk129458715','sjvn98h3idv9d'
Online 'askg259750505','vn8n34rf9v83j'
Email 'dh8iwwih33e99','92hnfi928rdh9'
Fax 'jkcni983iiff4'
要按某个字段获取两个(或'N')最近的事件,首先按时间排序然后使用dedup
命令select前N个结果。
<your query>
| sort - _time
| dedup 2 clientType
虽然 @RichG 的 dedup
选项可能有效,但这里有一个使用 stats
和 mvindex
的选项:
index=ndx sourcetype=srctp clientType=* key=*
| eval comb=_time+" | "+key
| stats values(comb) as comb by clientType
在其范围形式中使用 mvindex
,而不是只选择最后一项
| eval mostrecents=mvindex(comb,-1-N,-1)
(当然 - sub-in for N
无论你需要什么)
| fields - comb
| mvexpand mostrecents
| rex field=mostrecent "(?<timemost>\d+)\s\|\s(?<keymost>.+)"
| table clientType timemost keymost
| eval timemost=strftime(timemost,"%c")
我已经为这个查询苦苦思索了几个小时,看起来它应该相当简单,但出于某种原因,我发现它非常困难。我的客户想要查看每个 clientType 的前 2 个最新“密钥”。
(真的是前 N - 但不仅仅是“第一”或“最后”)
虽然在我询问的步骤之前完成了一些翻译,但我的数据看起来像这样作为查询的输出(注意:由于专有原因,我无法提供上面的实际步骤,也不是这是真实的数据,但我认为它应该翻译 OK)。我已经为应该出现在输出中的记录加注星标。
out? clientType key _time
---- ---------- ------------- -----------------
* Mobile asfk129458715 2020-10-13 12:10Z
* Online askg259750505 2020-10-12 11:59Z
* Email dh8iwwih33e99 2020-10-12 11:58Z
Online schf38hrnf98u 2020-10-12 11:00Z
* Online vn8n34rf9v83j 2020-10-12 11:56Z
* Mobile sjvn98h3idv9d 2020-10-12 11:56Z
* Email 92hnfi928rdh9 2020-10-12 11:55Z
* Fax jkcni983iiff4 2020-10-09 06:54Z
现在,我已经能够在更小的范围内(比如 1 天)完成这项工作。但是有些 clientTypes 不是很频繁,我们也需要查看最近的那些。此输出用于某些审计目的,我发现当我将搜索扩展到多天(返回 > 10,000 个事件)时,输出不稳定,我看到的结果是乱序的, 不是最近的,或者是歪斜的。
我想看到的是 - 每个客户类型只有前 2 名,在每个组中按时间降序排列
clientType key _time
---------- ------------- --------------
Mobile asfk129458715 2020-10-13 12:10Z
Mobile sjvn98h3idv9d 2020-10-12 11:56Z
Online askg259750505 2020-10-12 11:59Z
Online vn8n34rf9v83j 2020-10-12 11:56Z
Email dh8iwwih33e99 2020-10-12 11:58Z
Email 92hnfi928rdh9 2020-10-12 11:55Z
Fax jkcni983iiff4 2020-10-09 06:54Z
对于一些“我尝试过的”,我尝试以各种顺序使用一些查询代码,主要围绕 stats list(key)
、sort 0 -_time
等,使用各种“by”子句。此查询的输出还将经过一些额外的转换以用于我们的审计系统,它采用一个键列表,每个键都用单引号括起来并以逗号分隔。
我已经使用 stats delim="','"
和 mvcombine
在查询中取得了一些成功,得到的结果最终看起来像这样。我想将此作为问题的一部分包括在内,以便清楚最终状态需要是什么样子,以防需要在分组和排序部分的某处进行更改以使其更容易。
clientType keys
---------- -------------
Mobile 'asfk129458715','sjvn98h3idv9d'
Online 'askg259750505','vn8n34rf9v83j'
Email 'dh8iwwih33e99','92hnfi928rdh9'
Fax 'jkcni983iiff4'
要按某个字段获取两个(或'N')最近的事件,首先按时间排序然后使用dedup
命令select前N个结果。
<your query>
| sort - _time
| dedup 2 clientType
虽然 @RichG 的 dedup
选项可能有效,但这里有一个使用 stats
和 mvindex
的选项:
index=ndx sourcetype=srctp clientType=* key=*
| eval comb=_time+" | "+key
| stats values(comb) as comb by clientType
在其范围形式中使用 mvindex
,而不是只选择最后一项
| eval mostrecents=mvindex(comb,-1-N,-1)
(当然 - sub-in for N
无论你需要什么)
| fields - comb
| mvexpand mostrecents
| rex field=mostrecent "(?<timemost>\d+)\s\|\s(?<keymost>.+)"
| table clientType timemost keymost
| eval timemost=strftime(timemost,"%c")