У меня есть JSON, который является выходом из AWS CLI.
Пример:
{
"Volumes": [
{
"Tags": [
{
"Value": "abc",
"Key": "Name"
},
{
"Value": "123",
"Key": "App"
}
],
"Encrypted": false,
"VolumeType": "gp2",
"VolumeId": "vol-123",
"State": "in-use",
"Iops": 100,
"SnapshotId": "snap-123",
"CreateTime": "2019-08-27T00:51:00.971Z",
"Size": 20
},
{
"Tags": [
{
"Value": "def",
"Key": "Name"
},
{
"Value": "456",
"Key": "App"
}
],
"Encrypted": false,
"VolumeType": "gp2",
"VolumeId": "vol-456",
"State": "in-use",
"Iops": 100,
"SnapshotId": "snap-456",
"CreateTime": "2019-08-27T00:51:00.971Z",
"Size": 22
},
{
"Tags": [
{
"Value": "789",
"Key": "App"
}
],
"Encrypted": false,
"VolumeType": "gp2",
"VolumeId": "vol-789",
"State": "in-use",
"Iops": 100,
"SnapshotId": "snap-789",
"CreateTime": "2019-08-27T00:51:00.971Z",
"Size": 23
}
]
}
Выход будет иметь сотни таких томов в массиве. Я хочу напечатать вывод с полями VolumeId, Size, Name
только при наличии тега Name
Пока что я мог бы сделать что-то вроде:
jq .Volumes | jq '.[] | select(any(.Tags[]; .Key == "Name"))' | jq -r '[.VolumeId,.Size,.Tags[].Key]|join(",")'
This выводит в виде:
vol-123,20,Name,App
vol-456,22,Name,App
Как можно изменить запрос jq, чтобы получить что-то вроде
vol-123,20,abc
vol-456,22,def
Возможно ли это?
ПРИМЕЧАНИЕ. Причина, по которой я пытался это было потому, что мне приходилось делать несколько отчетов / проверок в моем списке томов, начиная с AWS, и я не хотел запускать несколько команд AWS, если результат не изменится. Использование отчетов по одной команде также позволяет избежать любых расхождений, которые могут возникнуть, если некоторые тома будут добавлены / удалены в фоновом режиме при выполнении нескольких команд, например