jq - 从流中提取匹配文档的子集

时间:2015-04-21 01:32:58

标签: json shell sed jq

我有以下JSON消息。这是一条完整的消息。在一个文件中有这么多的消息。此json消息是使用jq。

从未格式化的json消息生成的
{
  "header": {
    "user": "baskar"
  },
  "requests": [
    {
      "first_name": "mike",
      "last_name": "mat"
    },
    {
      "first_name": "mike",
      "last_name": "mat"
    }
  ],
  "check": [
    "Y"
  ]
}
{
  "header": {
    "user": "baskar"
  },
  "message": {
    "header": {
      "user": "baskar"
    },
    "response": {
      "resultsList": {
        "result": [
          {
            "first_name": "mike1",
            "last_name": "mat"
          }
        ]
      },
      "errorMsg": null
    }
  }
}

我想对此进行一些过滤。例如,当我搜索first_name,mike1时,我应该在请求中获取头部和匹配请求。响应消息中的匹配结果也是如此。因此,搜索字符串mike1的输出预期如下。

{
  "header": {
    "user": "baskar"
  },
  "requests": [
    {
      "first_name": "mike1",
      "last_name": "mat"
    }
  ],
  "check": [
    "Y"
  ]
}
{
  "header": {
    "user": "baskar"
  },
  "message": {
    "header": {
      "user": "baskar"
    },
    "response": {
      "resultsList": {
        "result": [
          {
            "first_name": "mike1",
            "last_name": "mat"
          }
        ]
      },
      "errorMsg": null
    }
  }
}

基本上,我想在请求数组中过滤掉不匹配的请求,并在结果数组中过滤掉不匹配的结果。

目前,我使用以下脚本从未格式化的json消息日志文件中获取格式化的json消息。

 sed -n "/<SEARCH_STRING>/ s/.*Service - //p" $1/test.log* | jq . > ~/result.log

谢谢, Baskar.S

1 个答案:

答案 0 :(得分:2)

jq --arg key first_name \
   --arg value mike1 \
   'select(.message.response.resultsList.result[]?[$key]==$value) | .message' \
   <in.json

...仅返回结果列表至少包含first_name mike1的消息内容。