bash - 带选择 + awk 的 jq
问题描述
我正在尝试获取从 AWS 的 cli 返回的 JSON 数组并遍历每个项目并调用另一个 AWS 命令以获取有关资源的更多详细信息。我对另一种方法持开放态度,这就是我现在正在接近的方式。
我正在调用 AWS 以获取初始列表并将其传递jq
给以便能够从 JSON 列表中的每个对象中提取一个属性,将输出传递到awk
以生成新的生成新命令以执行每个第一个列表中的项目。我可以通过以下方式完成此操作:
不选择工作
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'
select
所以我对第二个 jq 语句的语法很有信心,但是当我将部分添加到语句中时,我不确定是什么导致了语法错误。
[编辑]
aws acm list-certificates
来自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'
推荐阅读
- angular - 在谷歌应用引擎上部署带有环回的 Angular 10 应用
- python - 使用 Django 进行无效的 CSRF 验证
- c# - 我需要使用 Vector3.up、Vector3.down、ecc.将 Vector3 应用于 Vector3[] 但我不能
- ios - Swfit - 检查当前时间是否在两个时间字符串之间
- python - 具有特定半径的球体的 VTK/Paraview 可编程源
- sql - Oracle View 是否计算您不想查询的字段?
- mysql - 如何有效地对超过 10M 的记录进行分页
- python - 如何将列表中的项目附加到python中的字符串上
- flutter - Flutter:无法显示警报对话框
- javascript - 计算两个字段并将结果设置在第三个