jq with select + awk



我正在尝试从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'

最新更新