我有一个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,但我找不到合适的过滤器。
答案 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_entries
或with_entries
。例如,使用.Generated ==&#34; @ logon&#34;打印对象的键:
$ jq -r 'to_entries[] | select(.value.Generated == "@logon") | .key' input.json
version
hostname
注意 - 不需要bash循环!