如何让 jq 在应用过滤器后打印有效的 json

Dan*_*Dan 7 bash shell json amazon-web-services jq

我正在研究 jq 过滤和结果输出,以输出到另一个接受 JSON 有效负载的程序中。考虑以下示例:

输入:

My-MBP:myorg myname$ aws ec2 describe-snapshots --owner-id 12345678 | jq '.Snapshots[] | select(.Description | contains("myorg-database-b"))'
Run Code Online (Sandbox Code Playgroud)

结果:

{
  "Description": "myorg-database-b redacted",
  "Encrypted": false,
  "VolumeId": "vol-1234",
  "State": "completed",
  "VolumeSize": 500,
  "StartTime": "2018-08-28T17:52:14.000Z",
  "Progress": "100%",
  "OwnerId": "12345678",
  "SnapshotId": "snap-2424"
}
{
  "Description": "myorg-database-b redacted",
  "Encrypted": false,
  "VolumeId": "vol-23456",
  "State": "completed",
  "VolumeSize": 500,
  "StartTime": "2018-08-28T19:01:18.000Z",
  "Progress": "100%",
  "OwnerId": "12345678",
  "SnapshotId": "snap-5535"
}
Run Code Online (Sandbox Code Playgroud)

无论我尝试做什么,我都无法jq打印有效的 JSON,以便将其通过管道传输到另一个程序中。

来自 AWS 的原始 JSON 是一个对象数组,为什么我无法取回有效的对象数组?我在这里做错了什么吗?

以下是 AWS 负载在通过管道输入之前的样子jq

{
    "Snapshots": [
        {
            "Description": "myorg-database-b redacted",
            "Encrypted": false,
            "VolumeId": "vol-23456",
            "State": "completed",
            "VolumeSize": 500,
            "StartTime": "2018-08-28T19:01:18.000Z",
            "Progress": "100%",
            "OwnerId": "12345678",
            "SnapshotId": "snap-5535"
        }, 
        {
            "Description": "myorg-database-b redacted",
            "Encrypted": false,
            "VolumeId": "vol-23456",
            "State": "completed",
            "VolumeSize": 500,
            "StartTime": "2018-08-28T19:01:18.000Z",
            "Progress": "100%",
            "OwnerId": "12345678",
            "SnapshotId": "snap-5535"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

wei*_*dan 14

您可以将整个 jq 表达式括在方括号中,以使其将过滤器输出收集到数组中(记录在数组构造部分中):

'[ .Snapshots[] | select(.Description | contains("myorg-database-b")) ]'
Run Code Online (Sandbox Code Playgroud)

结果是:

[
  {
    "Description": "myorg-database-b redacted",
    "Encrypted": false,
    "VolumeId": "vol-23456",
    "State": "completed",
    "VolumeSize": 500,
    "StartTime": "2018-08-28T19:01:18.000Z",
    "Progress": "100%",
    "OwnerId": "12345678",
    "SnapshotId": "snap-5535"
  },
  {
    "Description": "myorg-database-b redacted",
    "Encrypted": false,
    "VolumeId": "vol-23456",
    "State": "completed",
    "VolumeSize": 500,
    "StartTime": "2018-08-28T19:01:18.000Z",
    "Progress": "100%",
    "OwnerId": "12345678",
    "SnapshotId": "snap-5535"
  }
]
Run Code Online (Sandbox Code Playgroud)