根据子元素值提取json数组元素

yae*_*ael 2 text-processing json jq

我们有以下示例文件(很长的文件,这是一个简短的示例)

"request_status" : "FAILED"
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 333,
        "request_status" : "COMPLETED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/334",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 334,
        "request_status" : "FAILED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/335",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 335,
        "request_status" : "FAILED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/336",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 336,
        "request_status" : "COMPLETED"
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在匹配的行之后打印行,"id" : $num
例如 for

num=335 
Run Code Online (Sandbox Code Playgroud)

之后如何获得线路

"id" : $num
Run Code Online (Sandbox Code Playgroud)

预期输出

"request_status" : "FAILED"
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

假设 JSON 文件是一大组对象,例如

  {
    "href": "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests": { "id": 333, "cluster_name": "sys41", "request_status": "COMPLETED" }
  },
Run Code Online (Sandbox Code Playgroud)

(注意换行符并不重要,对象中键的顺序也不重要)然后,以下jq命令将获取对应于的request_status条目:id$num

$ num=355
$ jq -r ".[].Requests | select(.id == $num).request_status" file.json
FAILED
Run Code Online (Sandbox Code Playgroud)

它通过Requests从每个对象中挑选出所有条目并在id. 对于通过过滤器的那些,它提取request_status.

使其输出原始数据而不是 JSON的-r选项jqFAILED没有它会被双引号)。


奖励材料:

$ jq -r '.[].Requests | "\(.id): \(.request_status)"' file.json
333: COMPLETED
334: FAILED
335: FAILED
336: COMPLETED
Run Code Online (Sandbox Code Playgroud)

  • jq 是完成这项工作的正确工具。 (2认同)