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

jq - extracting a subset of matching documents from a stream

我有以下 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 时,我应该在请求中获取 header 和匹配的请求。也是 Response 消息中的匹配结果。因此,搜索字符串 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" /test.log* | jq . > ~/result.log

谢谢, Baskar.S

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

...returns 仅消息内容,其中结果列表至少包含 mike1 中的 first_name 个。