首页 > 解决方案 > 带选择 + 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"
        }
    ]
}

标签: bashamazon-web-servicesawkjqaws-cli

解决方案


使用多次转义是错误的来源,几乎无法维护,并且随时容易中断;当中间生成的输出转义并注入无人值守的语法时。

我建议您使用 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'

推荐阅读