gpt4 book ai didi

bash - jq - 将 json 作为 bash 数组返回

转载 作者:行者123 更新时间:2023-12-05 02:18:21 24 4
gpt4 key购买 nike

我的问题类似于this question但我需要做更多的事情,但我不知道该怎么做。

这是我的 JSON 字符串

{
"value": "1"
}
{
"value": "3"
}
{
"value": "4"
}

我需要用BASH写一个脚本来输出

  • 2 - 如果序列缺少数字
  • 5 - 如果序列没有遗漏一个数字

在上面的示例中,json 数组中缺少 2。脚本应返回 2。如果数组中存在 2,则应返回 5。

我想我可以编写逻辑来在 bash 中使用 while 循环来递增数字,但我被困在这一点上,我无法弄清楚如何将这个 JSON 字符串转换为 bash 数组值(value)。

下面是我用来获取 JSON 输出的确切命令。这是 AWS CLI 命令,用于从 AWS 获取具有特定 TAG 的所有实例。

readarray -t arr < <(aws ec2 describe-instances --region=us-east-1 --filters --filters "Name=tag:NodeType,Values=worker" --query "Reservations[].Instances[].Tags[]" | jq -r '.[] | select(.Key == "NodeNumber") | {value: .Value}')
printf '%s\n' "${arr[@]}"

以上返回我

{
"value": "1"
}
{
"value": "3"
}
{
"value": "4"
}

但是,我只需要将 VALUE 字段“值”作为 bash 数组获取

最佳答案

首先,存储数据

假设您的原始数据以字符串形式存储在 json 变量中,可能带有此处文档:

json=$(
cat <<- EOF
{
"value": "1"
}
{
"value": "3"
}
{
"value": "4"
}
EOF
)

Bash 本身会做合理的美化工作:

$ echo $json
{ "value": "1" } { "value": "3" } { "value": "4" }

将数据解析成 Bash 数组

有不止一种方法可以做到这一点。两种更明显的方法是使用 jqgrep 使用 shell 的简单数组表示法将值提取到 Bash 数组中:

values=( `echo $json | jq .value` )
echo "${values[@]}"
"1" "3" "4"

unset values
values=$(egrep -o '[[:digit:]]+' <<< "$json")
echo "${values[@]}"
1
3
4

当然还有其他方法可以完成这项任务,但这似乎是唾手可得的成果。您的里程可能会有所不同。

警告

关于 Bash 数组要记住的主要事情是它们需要使用扩展,例如 "${foo[@]}" 引用时,或 ${bar[*]} 当不加引号时,如果你想将它们用于循环而不是直接索引到它们。但是,一旦它们在数组中,只要您了解不同的扩展和引用规则,就可以轻松访问整个数组。

关于bash - jq - 将 json 作为 bash 数组返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45534673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com