小ネタ。
はじめに
eval ConditionalFunctionsの一つであるmatch()
match(SUBJECT, "REGEX")
Description
This function returns TRUE or FALSE based on whether REGEX matches SUBJECT.
This function compares the regex string REGEX to the value of SUBJECT and returns a Boolean value. It returns TRUE if the REGEX can find a match against any substring of SUBJECT.
ということで、SUBJECT
が_multi value_と_single value_どちらでも一致してくれるので、とても使える。
| makeresults
| eval _raw="AllUsers ModifiedUsers
Usr1 Usr4
Usr3 Usr2
Usr2 Usr1
Usr4"
| multikv forceheader=1
| stats values(*) as *
| table AllUsers ModifiedUsers
`comment("this is your result sample. from here, the logic")`
| stats values(*) as * by AllUsers
| eval check=if(match(ModifiedUsers,AllUsers),1,0)
| stats values(eval(if(check=0,AllUsers,NULL))) as AllUsers
このクエリーだと _ModifiedUsers_がmultivalueだけど問題なく一致している。
match()がマッチしすぎる
| makeresults
| eval _raw="AllUsers,ModifiedUsers
admin,splunk
splunk,tenable.admin
tenable.admin,"
| multikv forceheader=1
| stats values(*) as *
| table AllUsers ModifiedUsers
`comment("this is your result sample. from here, the logic")`
| stats values(*) as * by AllUsers
| eval check = if(match(ModifiedUsers,AllUsers),1,0)
| stats values(eval(if(check=0,AllUsers,NULL))) as AllUsers
admin
がtenable.admin
に一致してしまうので、これはうまく動かない。
とはいえどうすればいいのだろう
解決策
| makeresults
| eval _raw="AllUsers,ModifiedUsers
admin,splunk
splunk,tenable.admin
tenable.admin,"
| multikv forceheader=1
| stats values(*) as *
| table AllUsers ModifiedUsers
`comment("this is your result sample. from here, the logic")`
| stats values(*) as * by AllUsers
| eval check = if(match(ModifiedUsers,"^".AllUsers."$"),1,0)
| stats values(eval(if(check=0,AllUsers,NULL))) as AllUsers
引数はREGEX(正規表現)なので、正規表現として正しく書いてやる。
まとめ
match()
というか正規表現だと思ったより広く、狭く一致する時がある。
.*
とか\w+
がすごく広く一致したりしなかったり。
regex101で確認してみたりするけど、Splunkは基本的に_REGES FLAGS_がg
のみなのは時たまハマります。
やはりバイブルが必要か