循环遍历json文件并将值检索到bash变量中

时间:2020-10-01 04:22:15

标签: json bash shell scripting jq

我有一个包含以下数据的json文件

{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}

我需要从ID中检索ID的S值,从no中检索N的值,并将它们作为参数放入查询中。查询看起来像这样:

query --table-name validation \
  --key-condition-expression "ID = :v1 AND no = :v2" \
  --expression-attribute-values '{":v1": {"S": "${ID}"},":v2": {"N": "${no}"}}' \
  --region us-east-1

我尝试使用jq,但无法弄清楚如何读取json文件并检索值作为参数。这是我第一次使用jq。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

以下内容可能与您所追求的不完全相同,但确实显示了如何避免多次调用jq,以及如何部分地由jq构造命令。换句话说,假设--key-condition-expression--expression-attribute-values的模板是固定的,那么您应该能够适应以下需求:

假设一个bash或类似bash的外壳,并且data.json保存:

{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}

我们可以这样写:

ID=ID
no=no

< data.json jq --arg ID "$ID" --arg no "$no" -cr '
  .Item
  | .ID.S as $v1
  | .no.N as $v2
  | $v1, $v2, {($v1): {"S": $ID}, ($v2): {"N": $no}}
' | while read -r v1
do    
  read -r v2
  read -r query

  echo query --table-name validation \
  --key-condition-expression "\"ID = $v1 AND no = $v2\"" \
  --expression-attribute-values "'""$query""'" \
  --region us-east-1
done

jq作为模板引擎

如果Q中带有:v1和:v2的模板是可变的,则可以通过使用jq作为模板引擎来适应以上情况,该主题在jq Cookbook中涉及:https://github.com/stedolan/jq/wiki/Cookbook#using-jq-as-a-template-engine

答案 1 :(得分:0)

这是jq的基本语法:

$ ID=$(cat data.json | jq .Item.ID.S -r)
$ no=$(cat data.json | jq .Item.no.N -r)
$ echo $ID $no
4869949 2

我建议您阅读类似https://shapeshed.com/jq-json/的内容,以便更熟悉。