获取json数组中的指定元素- SPLUNK

bfnvny8b  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(177)

我是新来的splunk.我有这个json:

"request": {
    "headers": [
        {
            "name": "x-real-ip",
            "value": "10.31.68.186"
        },
        {
            "name": "x-forwarded-for",
            "value": "10.31.68.186"
        },
        {
            "name": "x-nginx-proxy",
            "value": "true"
        }

我需要在属性名具有“x-real-ip”值时选择一个值。

u1ehiz5o

u1ehiz5o1#

有几种方法可以做到这一点-下面是我最常用的一种(假设您 * 也 * 希望valuename一起使用):

index=ndx sourcetype=srctp request.headers{}.name="x-real-ip"
| eval combined=mvzip(request.headers{}.name,request.headers{}.value,"|")
| mvexpand combined
| search combined="x-real-ip*"

这将跳过request.headers{}.name多值字段中某处不包含“x-real-ip“的所有事件
接下来,它将两个多值字段(name和value)合并为一个mv字段,并以|字符分隔
然后展开结果集,以便一次查看一行
最后,您将查找 * 仅 * 包含值“x-real-ip“的结果
如果您希望从组合字段中提取value,请添加以下行:

| rex field-combined "\|(?<x_real_ip>.+)"

当然,您还可以根据需要对数据执行任何其他SPL操作

bsxbgnwa

bsxbgnwa2#

我尝试@Warren 's answer,但得到以下错误:
“eval”命令中的错误:表达式格式不正确。应为)。
您需要添加一个重命名,因为mvzip中的{}字符会导致问题。

index=ndx sourcetype=srctp request.headers{}.name="x-real-ip"
| rename request.headers{}.name AS headerName, request.headers{}.value AS headerValue 
| eval reviewers=mvzip(headerName,headerValue ,"|")|
| mvexpand combined
| search combined="x-real-ip*"
7fyelxc5

7fyelxc53#

your search
| rex max_match=0 "name\":\s\"(?<fieldname>[^\"]+)"
| rex max_match=0 "value\":\s\"(?<fieldvalue>[^\"]+)"
| eval tmp=mvzip(fieldname,fieldvalue,"=")
| rename tmp as _raw
| kv
| fields - _* field*

当您提问时,请提供正确的信息。您在此过程中已用完日志。

相关问题