我怎么能用Bash循环我的json

时间:2017-07-11 16:03:49

标签: json bash jq

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

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

如何在Bash中循环浏览json文件中的每个元素,其中包含“Generated”值“@logon”?我想我应该使用jq,但我找不到合适的过滤器。

2 个答案:

答案 0 :(得分:2)

你是说这个?

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

答案 1 :(得分: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 ==&#34; @ logon&#34;打印对象的键:

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

注意 - 不需要bash循环!