使用简单的aws cli查询来检查是否存在Lambda函数并回显相关角色(如果存在):
#!/bin/bash
fname=$1
role=$(aws lambda list-functions --query 'Functions[?FunctionName == `$fname`].Role' --output text)
echo "$fname role: $role"
Run Code Online (Sandbox Code Playgroud)
但是,$ fname似乎正在解析为aws命令中的空字符串.我试图逃避后面的嘀嗒声,交换`到'以及其他捶打编辑的镜像(是的,我在调用脚本时在cl上传递一个字符串:)
如何在bash脚本中将变量正确传递给JMESPath查询?
在本问题底部的示例JSON中,如何"Tags"使用JMESPath 计算数组中键/值对的数量?
根据JMESPath文档,我可以使用count()函数执行此操作-
例如,以下表达式创建一个数组,其中包含foo对象中元素的总数,后跟foo ["bar"]的值.
但是,文档似乎不正确.使用JMESPath网站,查询Reservations[].Instances[].[count(@), Tags]结果[ [ null ] ].然后我通过AWS命令行测试并返回错误 -
未知功能:count()
实际上是否有使用JMESPath的方法?
示例JSON -
{
"Reservations": [
{
"Instances": [
{
"InstanceId": "i-asdf1234",
"InstanceName": "My Instance",
"Tags": [
{
"Value": "Value1",
"Key": "Key1"
},
{
"Value": "Value2",
"Key": "Key2"
},
{
"Value": "Value3",
"Key": "Key3"
},
{
"Value": "Value4",
"Key": "Key4"
}
]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud) 我有包含数据库数组的 JSON,每个数据库都有一个用户数组,例如
{"databases": [
{"db": "db_a", "users": [{"name": "alice"}, {"name": "alex"}]},
{"db": "db_b", "users": [{"name": "bob"}, {"name": "brienne"}]}
]}
Run Code Online (Sandbox Code Playgroud)
我想生成一个数据库和用户的平面数组,即
[
{"db": "db_a", "name": "alice"},
{"db": "db_a", "name": "alex"},
{"db": "db_b", "name": "bob"},
{"db": "db_b", "name": "brienne"}
]
Run Code Online (Sandbox Code Playgroud)
在 SQL 术语中,这将是笛卡尔连接或笛卡尔积,但我不确定树结构中的正确术语。到目前为止我最接近的是
databases[].users[]
Run Code Online (Sandbox Code Playgroud)
产生
databases[].users[]
Run Code Online (Sandbox Code Playgroud)
和
databases[].{db: db, name: users[].name}
Run Code Online (Sandbox Code Playgroud)
产生
[{"name": "alice"}, {"name": "alex"}, {"name": "bob"}, {"name": "brienne"}]
Run Code Online (Sandbox Code Playgroud)
附录:我很高兴接受“你不能用 JMESPath 做到这一点,这就是原因......”作为答案。HN 评论` `暗示了这一点
进行迭代时无法引用父级。为什么?迭代、[*] 和映射的所有选项都使用迭代项作为任何表达式的上下文。没有机会获得任何其他值
我有一个带有两个数组的JSON对象 - 一个keys数组和一个values数组,两者长度相同.使用jmespath,我想构造一个新对象,使用keys数组的值作为键,values数组的值作为值,就像array_combine在PHP中一样.
例如,这是输入:
{
"keys": [
"a",
"b",
"c"
],
"values": [
1,
2,
3
]
}
Run Code Online (Sandbox Code Playgroud)
这是我期待的输出:
{
"a": 1,
"b": 2,
"c": 3
}
Run Code Online (Sandbox Code Playgroud)
有没有内置功能来实现这一目标?
我想使用CLI工具来检索具有特定cname /别名的CloudFront分配的分发ID.
这就是我想出的:
aws cloudfront list-distributions --query "DistributionList.Items[?Aliases.Items!='null']|DistributionList.Items[?contains(Aliases.Items,'cname.cdn.mycompany.com') == 'true'].{Id:Id}"
Run Code Online (Sandbox Code Playgroud)
我不是JMESPath的专家,我不明白为什么我的查询不会返回结果.存在具有指定域作为别名的分发.
在aws cli jmespath查询中,例如输出["a","a","b","a","b"],如何提取它的唯一值["a","b"]?
我有一个看起来有点像这样的json块(你猜到了AWS)
{ "Vpcs":[
{
"VpcId":"vpc-blabla1",
"OtherKey":"Value"
},
{
"VpcId":"vpc-blabla2",
"OtherKey":"Value"
},
{
"VpcId":"vpc-blabla3",
"OtherKey":"Value"
},
{
"VpcId":"vpc-blabla4",
"OtherKey":"Value"
}]
}
Run Code Online (Sandbox Code Playgroud)
我想使用JMESPath获取vpc-blabla1和vpc-blabla3的OtherKey值(示例,可以是任何vpc-id列表)
我可以使用JMESpath过滤器获得blabla1
Vpcs[?VpcId=='blabla1'].OtherKey
Run Code Online (Sandbox Code Playgroud)
但我找不到多个值的语法?我试过了Or语法|| 和复合语法| 但都不起作用? - 见下面我尝试过的事情.
Vpcs[?VpcId=='blabla1' || 'blabla1'].OtherKey
Vpcs[?VpcId=='blabla1' || ?VpcId=='blabla1'].OtherKey
Vpcs[(?VpcId=='blabla1') || (?VpcId=='blabla1')].OtherKey
Vpcs[?VpcId=='blabla1' | ?VpcId=='blabla1'].OtherKey
Run Code Online (Sandbox Code Playgroud)
有什么建议?这是可能的还是我将不得不一次收集一个结果集并重新组合我想要的结果?
从ES2015具有计算的属性和Array.reduce / Array.map / Object.assign,您可以执行以下操作:
[{name: 'foo', age: 43}, {name: 'bar', age: 55}].map(
o => ({[o.name]: o.age})).reduce((a, b) => Object.assign(a,b), {})
Run Code Online (Sandbox Code Playgroud)
…并获得:
{ foo: 43, bar: 55 }
Run Code Online (Sandbox Code Playgroud)
如何从JMESPath获得此信息?
尝试:
$echo '[{"name": "foo", "age": 43}, {"name": "bar", "age": 55}]' | jp [].{name:age}
[
{
"name": 43
},
{
"name": 55
}
]
Run Code Online (Sandbox Code Playgroud) 我有一个使用JMESPath解析的对象,其中属性的值是编码为字符串的JSON对象。我希望能够将该字符串属性解析为JSON对象,并仅使用JMESPath来使用它(我知道我可以使用JSON编码器解析该值)。
这是对象:
{
"ARN": "arn:aws:secretsmanager:us-east-1:xxxxx:secret:todobackend/db/credentials-AP57Kn",
"Name": "todobackend/db/credentials",
"VersionId": "c95fae54-e7b4-4c7f-80d6-2c5649f86570",
"SecretString": "{\"MYSQL_USER\":\"todobackend\",\"MYSQL_PASSWORD\":\"password\"}",
"VersionStages": [
"AWSCURRENT"
],
"CreatedDate": 1523276277.046
}
Run Code Online (Sandbox Code Playgroud)
所以我想将SecretString属性解析为JSON对象。
关于这是否可能的任何想法?
可以在subnet.id节点中提取名称, 如下所示
$ az network nsg show -g my_group -n My_NSG --query "subnets[].id" -o json
[
"/subscriptions/xxxxxx2/resourceGroups/my_group/providers/Microsoft.Network/virtualNetworks/MY-VNET/subnets/My_SUBNET"
]
Run Code Online (Sandbox Code Playgroud)
我知道有一种叫做搜索的东西应该模仿子字符串(此处解释 https://github.com/jmespath/jmespath.jep/issues/5),但它对我不起作用。
$ az network nsg show -g my_group -n My_NSG --query "subnets[].search(id,'@[120:-1]')" -o json
InvalidArgumentValueError: argument --query: invalid jmespath_type value: "subnets[].search(id,'@[120:-1]')"
CLIInternalError: The command failed with an unexpected error. Here is the traceback:
Unknown function: search()
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑 :
我实际上运行的请求包括其他元素,这就是为什么在新行中使用带有 bash 的子字符串不是我想要的。这是完整查询的示例:
az network …Run Code Online (Sandbox Code Playgroud)