繁体   English   中英

提取aws命令的output,并使用jq赋值给bash中的一个变量

[英]Extracting output of aws command and assign it to a variable in bash using jq

按照 aws 命令输出以下 json,我想从中提取具有字符串“vm-managed-itg* 值(输出中的最后两个条目)的资源

$aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm --profile acc | jq '.ResourceTagMappingList[] | 选择(包含({标签:[{Key:“vm:cost:accountenv”}]})|不)| 选择(包含({标签:[{值:“itg”}]})|不)'

{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-uat-test",
  "Tags": []
}
{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-stg-test",
  "Tags": []
}
{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-uat-test3",
  "Tags": []
}
{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-stg-test1",
  "Tags": []
}
{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-itg-test1",
  "Tags": []
}
{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-itg-test",
  "Tags": []
}

我尝试添加 jq -r '.[].ResourceARN' 但它没有用,而是抛出了这个错误

~$ aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm --profile per-acc --output json | jq '.ResourceTagMappingList[] | select(contains({Tags: [{Key: "vm:cost:accountenv"} ]}) | not) | select(contains({Tags: [{Value: "itg"} ]}) | not)' | jq -r '.[].ResourceARN'
jq: error (at <stdin>:4): Cannot index string with string "ResourceARN"
jq: error (at <stdin>:8): Cannot index string with string "ResourceARN"
jq: error (at <stdin>:12): Cannot index string with string "ResourceARN"
jq: error (at <stdin>:16): Cannot index string with string "ResourceARN"
jq: error (at <stdin>:20): Cannot index string with string "ResourceARN"
jq: error (at <stdin>:24): Cannot index string with string "ResourceARN"

使用select仅在匹配条件时返回实体。 Substring 匹配项可以用contains进行测试:

select(.ResourceARN|contains("vm-managed-itg"))

Output:

{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-itg-test1",
  "Tags": []
}
{
  "ResourceARN": "arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-itg-test",
  "Tags": []
}

如果您只对ResourceARN的值感兴趣,没有标签和周围的对象,那么:

.ResourceARN | select(contains("vm-managed-itg"))

jq 将过滤器应用于其输入中的每个 JSON 实体(这是一个 stream 的对象)。

Output:

"arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-itg-test1"
"arn:aws:cloudwatch:us-east-1:xxxx:alarm:vm-managed-itg-test"

jq -r对于原始 output 不带引号)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM