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

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

我们有以下示例文件(非常长的文件,这是简短的示例)

"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"
    }
}

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

num=335 

如何获得之后的线路

"id" : $num

预期产出

"request_status" : "FAILED"

答案1

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

  {
    "href": "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests": { "id": 333, "cluster_name": "sys41", "request_status": "COMPLETED" }
  },

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

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

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

-r使其jq输出原始数据而不是 JSON 的选项(如果FAILED没有它,就会被双引号括起来)。


奖励材料:

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

答案2

假设 shell 变量num设置等于335

grep -A1 "\"id\" : $num," /path/to/file

grep我从方便的-A-B和选项中得到了很多帮助-C,我使用的助记符是“After”、“Before”和“Context”。

  • grep -A n 'pattern' file将显示n线A模式匹配之后,除了匹配行本身之外。

  • grep -C n 'pattern' file将显示n线在模式匹配之前,除了匹配行本身之外。

  • grep -C n 'pattern' file将显示n之前的两行之后(即Context of) 模式匹配,除了匹配行本身。

答案3

awk '/"id" : 335/{getline;print}'

或者

var="\"id\" : 335"
awk "/$var/{getline;print}"

或者

awk -v var="\"id\" : 335" '$0~var{getline;print}'

或者

var="\"id\" : 335"
awk -v var="$var" '$0~var{getline;print}'

或以上任何一项,但不需要"id" : "字符串的一部分,格式为:

awk -v var="335" '$0~"id" : var{getline;print}'

相关内容