我正在尝试从AWS的cli返回一个JSON数组,并循环遍历每个项,然后调用另一个AWS命令来获取有关资源的更多详细信息。我对另一种方法持开放态度,这就是我现在的做法。
我正在调用AWS来获取初始列表,并将其传递到jq
中,以便能够从JSON列表中的每个对象中提取一个属性,并将输出通过管道传输到awk
中以生成新的属性。generate为第一个列表中的每一个项执行一个新命令。我可以通过以下方式实现这一点:
在没有选择的情况下工作
aws acm list-certificates |
jq '.CertificateSummaryList[].CertificateArn' |
awk '{ c=system("aws acm describe-certificate --certificate-arn "$1 " | jq '''.Certificate.InUseBy,.Certificate.DomainName,.Certificate.CertificateArn'''"); }'
但是,我需要过滤每个命令的响应,以便仅在某个条件有效的情况下输出属性,而这正是我遇到问题的地方。我正在使用的更新命令:
添加时失败选择
aws acm list-certificates |
jq '.CertificateSummaryList[].CertificateArn' |
awk '{ c=system("aws acm describe-certificate --certificate-arn "$1 " | jq '''.Certificate |
select( .InUseBy != null)''' ");}'
抛出以下错误:
no matches found: select( .InUseBy != null) "); }
awk: non-terminated string | jq .Cer... at source line 1
context is
>>> <<<
awk: giving up
source line number 2
➜ ~
[1] 5484 done aws acm list-certificates |
5485 broken pipe jq '.CertificateSummaryList[].CertificateArn' |
5486 exit 2 awk
我尝试过逃离|
、(
和)
,但没有成功。下面的命令是一个类似方法的示例,只需短路第一部分,从列表中只取一项,然后进行检查,查看其中一个属性的长度是否大于零。
短路以测试所选部分
aws acm list-certificates |
jq '.CertificateSummaryList[] | select (.CertificateArn=="arn:aws:acm:us-east-1:000000000000:certificate/00000000-0000-0000-0000-000000000000").CertificateArn' |
xargs aws acm describe-certificate --certificate-arn |
jq '.Certificate | select( (.InUseBy | length) > 0) | .InUseBy, .Type'
因此,我对第二个jq语句的语法很有信心,但当我将select
部分添加到语句中时,我不确定是什么导致了语法错误。
[编辑]
列表证书中的示例aws acm list-certificates
——AWS CLI 1.18.117命令参考:
{
"CertificateSummaryList": [
{
"CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012",
"DomainName": "www.example.com"
},
{
"CertificateArn": "arn:aws:acm:us-east-1:493619779192:certificate/87654321-4321-4321-4321-210987654321",
"DomainName": "www.example.net"
}
]
}
使用多重转义是错误的来源,几乎不可能维护,并且随时可能中断;当中间生成的输出转义并注入无人参与的语法时。
相反,我建议您使用bash:处理循环
#!/usr/bin/env bash
while read -r arn; do
aws acm describe-certificate --certificate-arn "$arn" |
jq '.Certificate | select( (.InUseBy | length) > 0) | .InUseBy, .Type'
done< <(
aws acm list-certificates |
jq -r '.CertificateSummaryList[].CertificateArn'
)
或者使用xargs
而不是bash循环:
aws acm list-certificates |
jq -r '.CertificateSummaryList[].CertificateArn' |
xargs -l aws acm describe-certificate --certificate-arn |
jq '.Certificate | select( (.InUseBy | length) > 0) | .InUseBy, .Type'