JMESPath 使用小结
使用AWS CLI时,为了使输出更直观,我们可以选择table显示方式。除此之外,我们还会遇到一个选项 –query,很多人都忽略了这个选项,其实它还是非常有用的,它可以让命令输出结果按照你的想法呈现出来,而不是夹杂一大堆无用的信息让你自己去辨认。举个很简单的例子,在查找AMI的时候,如果你只想看到AMI的Name和ImageId而忽略其他无关信息,你可以这样写:
aws ec2 describe-images --query 'Images[*].{Name:Name, ImageId:ImageId}'
它的输出会很简单明了:
[
{
"Name": "pv-grub-hd0_1.04-i386.gz",
"ImageId": "aki-908f1da9"
},
{
"Name": "pv-grub2-hd0_2.02-1.b2-x86_64.xz",
"ImageId": "aki-9c4ad8a5"
}
]
这是什么原理呢?其实并没有什么高深的东西,–query只是使用了JMESPATH对命令行返回的JSON输出进行了解析提取而已。下面,我将对JMESPATH的使用进行一个简单的总结。语法比较简单,这里主要以常见表达式及相应的示例进行说明。
identifier
- key
e.g.
解析 {"key": "value"}
key -> value
slice
- [start:end:step]
- [:index], [index:], [::-1]
e.g.
解析 [e0, e1, e2, e3, e4, e5, e6]
[1:4:2] -> [e1, e3]
[:3] -> [e0,e1,e2]
[4:] -> [e4,e5,e6]
[::-1] -> [e6,e5,e4,e3,e2,e1,e0]
projection
- list projection for all
[*].
- list projection for slice
[start:end:step].
- object projection
.*.
e.g.
解析
{"Images":
[
{"ImageId": "xxxxx1", "Name": "yyyyy1"},
{"ImageId": "xxxxx2", "Name": "yyyyy2"}
]
}
Images[*].ImageId -> [xxxxx1, xxxxx2]
Images[0:1:1].Name -> [yyyyy1]
Images[].* -> [[xxxxx1,yyyyy1],[xxxxx2,yyyyy2]]
flat projection
[]
e.g.
解析 [1,[2,[3,4]],5,[6,7]]
[] -> [1,2,[3,4],5,6,7]
[][] -> [1,2,3,4,5,6,7]
filter
[?condition]
e.g.
解析
{"Volumes":
[
{
"Name": "v1",
"Size": 100
},
{
"Name": "v2",
"Size": 500
}
]
}
Volumes[?Size>`200`].Name -> ["v2"]
multi-select list
.[key1,key2]
e.g.
解析
{
"Images":
[
{"Name": "ami1", "Size": 100, "Type": "t1"},
{"Name": "ami2", "Size": 200, "Type": "t2"}
]
}
Images[*].[Name, Size] -> [["ami1", 100], ["ami2", 200]]
multi-select hash
.{Key1:Key1, Key2:Key2}
e.g.
解析 6 中json串
Images[*].{Name:Name} -> [{"Name": "ami1"}, {"Name": "ami2"}]
function
contains(str, substr)
- …
e.g.
解析 6 中json串
Images[?contains(Name, `ami`)].Type -> ["t1", "t2"]
PIPE
- |
e.g.
解析 6 中json串
Images[*].[Name, Size] | [1] -> ["ami2", 200]
常用
ec2 describe-instances --query 'Reservations[].Instances[?KeyName==`mykey`][]|[?State.Name==`running`].[InstanceId, Tags[?Key==`N
ame`].Value|[0]]'aws ec2 describe-instances --query 'Reservations[].Instances[].{InstanceId: InstanceId, Key: Tags[?Key==`Name`]}[]|[?Key[?contains(Value,`test`)]].InstanceId'