【问题标题】:jq: syntax error, unexpected ':' using jq for input?jq:语法错误,使用 jq 输入意外的 ':'?
【发布时间】:2021-02-03 15:41:28
【问题描述】:

我正在尝试使用 jq 构建一个数组:https://jqplay.org/s/MSk-uUDrRU

当我在野外尝试时,使用 jq 命令,例如:

echo "[]" | jq -r --arg arg1 $(aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/MyPolicy --version-id v2 | jq -r --arg arg2 "MyPolicy" '.entity + {"PolicyName": $arg2}') '.[.|length] |= . + $arg1'

我收到如下错误消息:

jq: error: syntax error, unexpected ':', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
"CreateDate":            
jq: 1 compile error

$arg1 中的这段代码可以打印到文件中。

aws <long calling argument> | jq -r --arg arg2 "MyPolicy" '.entity + {"PolicyName": $arg2}'

AWS 命令​​是https://docs.aws.amazon.com/cli/latest/reference/iam/get-policy-version.html

请注意,这一切都包含在一个循环中,以构建我感兴趣的策略版本数组。 "[]" 最初是在循环外的变量中定义的。

【问题讨论】:

  • 你可能不需要jq; aws 支持 JMESPath 查询以在结果输出之前对其进行操作。
  • @chepner,谢谢。我会调查的。
  • .[.| length] |= . + {"type": "name"} 可以缩短为 .[length] = {"type": "name"} 甚至更好:. + [{type: "name"}]
  • 内部 jq 看起来不错,但是外部 jq 的 STDIN 输入是什么?
  • 嗨@peak,内部jq的输出是{ "PolicyVersion": { "CreateDate": "2015-06-17T19:23;32Z", "VersionId": "v2", "Document": { "Version": "2012-10-17", "Statement": [ { "Action": "iam:*", "Resource": "*", "Effect": "Allow" } ] } "IsDefaultVersion": "false", "PolicyName": "MyPolicy"}}

标签: arrays json jq


【解决方案1】:

在外部调用中使用--argjson 而不是--arg。所以,为了清晰起见,你会:

output=$(aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/MyPolicy --version-id v2 | jq -r --arg arg2 "MyPolicy" '.entity + {"PolicyName": $arg2}' )

jq -rn --argjson arg1 "$output" '. + [$arg1]'

使用注释中显示的 JSON,这将产生:

[
  {
    "PolicyName": "MyPolicy"
  }
]

我还建议您尽量避免调用 jq 两次,例如大致如下:

aws ... | 
  jq --arg arg2 MyPolicy '[.entity + {"PolicyName": $arg2}]'

【讨论】:

  • 嗨@peak。我已将初始输入添加到问题中。我不得不不同意,关于 jq 至少在第一个 jq 输出有效 json 的上下文中对 jq 的输出进行操作。这段代码的目的是将 json 对象 api 响应整理成一个 json 对象数组。这样一个输出{"object"}的api被转换为{"object": "id"},然后整理成[{"object": "1"},{"object": "2"},{"object": "3"}]。我在上面尝试了你的方法,不幸的是它没有成功。谢谢。
  • 我已经更新了 jqplay 链接以更贴近场景。现在唯一的区别是它不会从 jq 输入到 jq 并且全部在一条线上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多