Here is volumes.json :
{
"Volumes": [
{
"AvailabilityZone": "us-east-1a",
"Tags": [
{
"Value": "vol-rescue-system",
"Key": "Name"
}
],
"VolumeId": "vol-00112233",
},
{
"AvailabilityZone": "us-east-1a",
"Tags": [
{
"Value": "vol-rescue-swap",
"Key": "Name"
}
],
"VolumeId": "vol-00112234",
},
{
"AvailabilityZone": "us-east-1a",
"Tags": [
{
"Value": "vol-rescue-storage",
"Key": "Name"
}
],
"VolumeId": "vol-00112235",
}
]
}
I need to get both the value of VolumeId
and Tags.Value
to be used as the input to invoke another command. It is easy to get a single value from the json array, but I am not able to extract multiple value from it and pass it to another bash command.
I can get a single value using this:
cat volumes.json |jq -r '.Volumes[].VolumeId' |while read v; do another_bash_command $v; done
but I am not able to get multiple value cause this is wrong:
cat volumes.json |jq -r '.Volumes[].VolumeId, .Volumes[].Tags[].Value' |while read v w; do another_bash_command $v $w; done
as it will then loop 6 times of the outcome instead of 3.
And, how do I pass those multiple json value in the loop to a bash array so I can use the value in a better way ? Like VolumeId-> $arr[0][0]
, Tags.Value-> $arr[0][1]
, AvailabilityZone-> $arr[0][2]
...etc. I have searched through SO and the jq docs, and tried readarray
, but still not able to find out the solution :( Thanks for any help given.
I know the question is about how to get the information using
jq
but its also possible to directly get the expected parameter directly from aws cli using the--query
flag.It seems to me that you want to output the two values (
VolumeId
andTags[].Value
) on the same line?If that's the case, then a simple string concatenation should be enough:
The above can then be used in a pipeline with
while-read
:You should note that if there is more than one element in
Tags
the result will reflect that. This can however be avoided by referring the first element inTags
:.Tags[0].Value
As @andlrc observed, you may need to decide what you really want in the event that any Tags array has more or less than one element. Assuming you want
Tags[0]
in all cases, I would recommend considering the use of @tsv as follows:This would be especially appropriate if any of the
.VolumeId
or.Tags[0].Value
values contained spaces, tabs, newlines, etc. The point is that @tsv will handle these in a standard way, so that handling the pair of values can be done in a standard way as well. E.g. using awk, you could read in the pair withawk -F\\t
; using bash,IFS=$'\t'
, etc.