Splunk中从数组字段提取姓名:拆分GivenName为名字与中间名
Splunk字段拆分问题:将
testing.name{}.nameParts.value拆分为firstname、middlename、surname 我需要在Splunk中处理字段testing.name{}.nameParts.value,将其拆分到firstname(名字)、middlename(中间名)、surname(姓氏)三列。该字段的数据结构如下:
testing.name{}.nameParts: [ { type: GivenName value:John } { type: GivenName value: X } { type: Surname value: Doe } ]
其中两个GivenName类型分别对应名字和中间名,我尝试了以下两段Splunk查询代码,但都没实现预期效果,求解决:
尝试的第一段代码
| spath input="testing.name{}.nameParts{}" output=names | mvexpand names | eval type = names.type, value = names.value | eval firstname=if(type=="GivenName", value, null()), middlename=if(type=="GivenName" AND isnull(firstname), value, null()), surname=if(type=="Surname", value, null()) | stats values(firstname) as firstname, values(middlename) as middlename, values(surname) as surname
尝试的第二段代码
| rex field=testing.name{}.nameParts{}.value "\btype:\s*(?<type>[^\s]+)\s*value:\s*(?<value>[^\s]+)" | eval FirstName = if(type=="GivenName", value,null()), MiddleName = if(type=="GivenName", value,null()), Lastname = if(type=="Surname", value, null()) | stats values(GivenName) as FirstName, values(MiddleName) as MiddleName, values(LastName) as LastName
解决方法
问题核心是第一段代码中if(type=="GivenName" AND isnull(firstname))的逻辑不成立——mvexpand后每一行是单独的条目,firstname在当前行要么是值要么是null,无法跨行判断。我们需要先对GivenName类型的条目进行编号,再通过编号区分名字和中间名。
推荐查询语句:
| spath input=testing.name{}.nameParts{} output=names | mvexpand names | eval type=names.type, value=names.value | where type="GivenName" OR type="Surname" | streamstats count as rn by type | eval firstname=if(type=="GivenName" AND rn=1, value, null()), middlename=if(type=="GivenName" AND rn=2, value, null()), surname=if(type=="Surname", value, null()) | stats values(firstname) as firstname, values(middlename) as middlename, values(surname) as surname by _raw
逻辑说明
spath+mvexpand:解析嵌套字段并将数组展开为单行条目,保留原始解析逻辑。where:过滤无关类型,仅保留GivenName和Surname。streamstats count as rn by type:按type分组计数,第一个GivenName的rn为1,第二个为2,Surname的rn为1。eval:通过rn编号区分第一个GivenName为firstname,第二个为middlename,Surname直接赋值给surname。stats ... by _raw:按原始事件聚合,确保每个原始事件对应一行拆分结果(避免所有事件的结果被合并)。
另外,第二段代码存在两处明显问题:
rex无法直接解析testing.name{}.nameParts{}.value这种嵌套结构化字段,需先用spath解析后再处理。stats中引用的GivenName字段未定义,与前面的FirstName变量名混乱,逻辑不成立。
内容的提问来源于stack exchange,提问作者icenature
相关产品推荐
相关产品推荐

