Как sort_by получить последний объект, используя jq - PullRequest
0 голосов
/ 07 ноября 2019

Итак, я запускаю это:

aws ec2 describe-snapshots \
    --region xxxxxxxxx \
    --owner-ids xxxxxxxxxxxx \
    | jq '.Snapshots[] | select(.VolumeId=="vol-xxxxxxxxxxxxx")'

И я получаю это https://jqplay.org/s/SnT8lDwycY

Как мне отсортировать по StartTime и вернуть последние "SnapshotId": "snap-xxxxxxxxxxxxxxxx"?

Когда я добавляю | sort_by(.StartDate)', я получаю ошибку ниже:

jq: error (at <stdin>:22106): Cannot index string with string "StartDate"

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Данные, отображаемые в jqplay, представляют собой поток объектов JSON. Один из способов обработки такого потока - использовать параметр командной строки -s в jq. Это фактически объединяет их в список, который затем может быть отсортирован.

Поэтому, если вас не волнуют связи, простое решение проблемы:

sort_by(.StartTime) | .[-1] | .SnapshotId

Если ваш jq достаточно актуален, его можно сократить до:

sort_by(.StartTime)[-1].SnapshotId
0 голосов
/ 10 ноября 2019

Вот несколько примеров того, как использовать встроенную опцию --query. Каждый пример основан на предыдущем.

Получить все снимки, отсортированные по возрастанию по времени начала:

aws ec2 describe-snapshots \
    --owner-ids xxxxxxxxxxxx \
    --query 'sort_by(Snapshots, &StartTime)'

Получить самый старый снимок:

aws ec2 describe-snapshots \
    --owner-ids xxxxxxxxxxxx \
    --query 'sort_by(Snapshots, &StartTime)[0]'

Получить самый новыйснимок:

aws ec2 describe-snapshots \
    --owner-ids xxxxxxxxxxxx \
    --query 'sort_by(Snapshots, &StartTime)[-1]'

# Example of output:
{
    "Description": "End of Q3 snapshot",
    "Encrypted": false,
    "OwnerId": "xxxxxxxxxxxx",
    "Progress": "100%",
    "SnapshotId": "snap-0f601234abcd12345",
    "StartTime": "2019-09-30T23:59:59.999Z",
    "State": "completed",
    "VolumeId": "vol-0f123dc5b1dd911d3",
    "VolumeSize": 8
}

Получить идентификатор новейшего снимка:

aws ec2 describe-snapshots \
    --owner-ids xxxxxxxxxxxx \
    --query 'sort_by(Snapshots, &StartTime)[-1].SnapshotId'

# Example of output:
"snap-0f601234abcd12345"

Получить идентификатор новейшего снимка в виде простого текста:

aws ec2 describe-snapshots \
    --owner-ids xxxxxxxxxxxx \
    --query 'sort_by(Snapshots, &StartTime)[-1].SnapshotId' \
    --output text

# Example of output:
snap-0f601234abcd12345

Если вы предпочитаете использовать jq, вы можете получить те же результаты, как показано ниже (как указано @peak):

aws ec2 describe-snapshots \
    --owner-ids xxxxxxxxxxxx \
    | jq -r '.Snapshots | sort_by(.StartTime)[-1].SnapshotId'
0 голосов
/ 08 ноября 2019

разобрался ...

aws ec2 describe-snapshots \
    --region xx-xxxx-x  \
    --owner-ids xxxxxxxxxx \
    | jq -r '.Snapshots[] | select(.VolumeId=="vol-xxxxxxxxxxxxxxx") \
    | [(.StartTime | split(", ")), (.SnapshotId | split(", "))] \
    | transpose \
    | { Snapshots: map({ StartTime:.[0], SnapshotId:.[1] }) } \
    | .Snapshots \
    | sort_by(.StartTime) \
    | grep SnapshotId -m 1 \
    | cut -d : -f 2 | sed 's/"//g''
...