【问题标题】:How can I loop through my json with Bash如何使用 Bash 遍历我的 json
【发布时间】:2017-12-15 19:25:55
【问题描述】:

我有一个如下所示的 json 文件:

{
  "version": {
    "Generated": "@logon",
    "Value": "Unknown",
    "LastRun": "Never"
  },
  "hostname": {
    "Generated": "@logon",
    "Value": "Unknown",
    "LastRun": "Never"
  },
  "updates": {
    "Generated": "@boot",
    "Value": "Unknown",
    "LastRun": "Never"
  }
}

如何遍历 Bash 中 json 文件中具有“生成”值“@logon”的每个元素?我想我应该使用 jq,但我没有找到合适的过滤器。

【问题讨论】:

标签: json bash jq


【解决方案1】:

你是说这个吗?

jq -r '.[].Generated' file.json ; while read -r val ; do
    do_something "${val}"
done

【讨论】:

  • 我认为他还想区分 @logon@boot 值,因此额外比较就足够了。
  • 看来你是对的。我正在等待澄清 jq 应该打印什么。
【解决方案2】:

如果您想使用 bash 循环遍历满足条件的 JSON 对象,请考虑:

while read -r val ; do
    echo "${val}"
done < <(jq -rc '.[] | select(.Generated == "@logon")' file.json)

输出:

{"Generated":"@logon","Value":"Unknown","LastRun":"Never"}
{"Generated":"@logon","Value":"Unknown","LastRun":"Never"}

如果采用这种在 bash 中循环的方法,则需要 -c 选项。

当然,最好在 jq 中尽可能多地处理 JSON 对象。

如果您想遍历顶级键值对,那么您可能需要使用to_entrieswith_entries。例如,使用 .Generated == "@logon" 打印对象的键:

$ jq -r 'to_entries[] | select(.value.Generated == "@logon") | .key' input.json
version
hostname

注意 - 不需要 bash 循环!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多