You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逻辑说明

  1. spath+mvexpand:解析嵌套字段并将数组展开为单行条目,保留原始解析逻辑。
  2. where:过滤无关类型,仅保留GivenName和Surname。
  3. streamstats count as rn by type:按type分组计数,第一个GivenName的rn为1,第二个为2,Surname的rn为1。
  4. eval:通过rn编号区分第一个GivenName为firstname,第二个为middlename,Surname直接赋值给surname。
  5. stats ... by _raw:按原始事件聚合,确保每个原始事件对应一行拆分结果(避免所有事件的结果被合并)。

另外,第二段代码存在两处明显问题:

  • rex无法直接解析testing.name{}.nameParts{}.value这种嵌套结构化字段,需先用spath解析后再处理。
  • stats中引用的GivenName字段未定义,与前面的FirstName变量名混乱,逻辑不成立。

内容的提问来源于stack exchange,提问作者icenature

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:02:15