JMESPATH 使用小结

来源:互联网 发布:telnet 指定源端口 编辑:程序博客网 时间:2024/06/09 09:12

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'
0 0
原创粉丝点击