我知道as
语句,但不知道如何使用它,我想我应该做类似的事情:
jq '
Reservations | .[].Instances as root
$root.Tags | .[] | select(.Key=="Name") | .Value ,
$root.BlockDeviceMappings | $root.[].Ebs.VolumeId
' file.json
目标是遍历每个实例并映射Tags.Value
(在.Key=="Name"
上选择)和.Ebs.VolumeId
。
输入文件示例:
{
"Reservations": [
{
"Instances": [
{
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"DeleteOnTermination": true,
"VolumeId": "vol-fffffffffffff"
}
}
],
"Tags": [
{
"Value": "FOO - DEV - BAR - instance-name",
"Key": "Name"
}
]
}
],
"ReservationId": "r-xxxx"
},
{
"Instances": [
"another same kind of sub-objects with different values like above repeated"
]
}
]
}
最后一个子对象:
"Instances": [
"another same kind of sub-objects with different values like above repeated"
]
是假的,是像第一个重复的子对象Instances
,具有不同的真实值
预期输出为:
FOO - DEV - BAR - instance-name:vol-fffffffffffff
答案 0 :(得分:1)
根据您的输入,jq程序的以下变体将产生所需的输出:
(.Reservations[].Instances[]) as $root
| ($root.Tags? | .[] | select(.Key=="Name") | .Value) + ":"
+ ($root.BlockDeviceMappings? | .[].Ebs.VolumeId)
实际上没有必要引入$root
变量-您也可以编写:
(.Reservations[].Instances[])
| (.Tags? | .[] | select(.Key=="Name").Value) + ":"
+ (.BlockDeviceMappings? | .[].Ebs.VolumeId)
使用“?”我怀疑以上只是因为您的示例JSON是人为设计的。
此外,我不太确定要求是什么,因此上述内容可能并不是您真正想要的。掌握了jq的语法后,您可能希望更精确地捕获您的需求。