Как заставить jq печатать действительный json после применения фильтра - PullRequest
0 голосов
/ 29 августа 2018

Я работаю над фильтрацией jq и выводом результатов для вывода в другую программу, которая принимает полезную нагрузку JSON. Рассмотрим следующий пример:

INPUT:

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

РЕЗУЛЬТАТ:

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

Независимо от того, что я пытаюсь сделать, я не могу jq напечатать действительный JSON, чтобы я мог передать его в другую программу.

Исходный JSON от AWS представлял собой массив объектов, почему я не могу вернуть действительный массив объектов? Я что-то здесь не так делаю?

Вот как выглядит полезная нагрузка 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"
        }
    ]
}

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете заключить все выражение jq в квадратные скобки, чтобы оно собрало выходные данные фильтра в массив (задокументировано в разделе построения массива ):

'[ .Snapshots[] | select(.Description | contains("myorg-database-b")) ]'

Результат:

[
  {
    "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"
  }
]
...