如何使用 bash 使用 jq 过滤 json 文件
How filter json file with jq using bash
我正在尝试使用 bash 过滤我的 json 文件,该文件可能类似于:
{
"key1": [],
"key2":["first_value","second_value"]
}
如果我想获取我得到的 key1 和 key2,我可以这样做:
if $(cat $my_json | jq 'has("key1")'); then
values=$(jq -r ".key1" "$my_json")
for item in $values
do
echo "Item : $item"
done
fi
前面的输出是:
Output:
Item : []
如果我的文件没有这样的密钥并且我想验证这一点,这可以防止出现任何问题。
参考我的示例,如何验证值是否为空?
我想避免对空值进行任何迭代。
有什么方法可以用jq验证现有的密钥,它不应该是空的?
我想实现的目标是 redirected at the end of a file
key2:
- first_value
- second_value
如果是key,因为它是空的我不想有任何结果
一个选项可能是使用
jq '.| select( has("key1"))|to_entries[] | select( .value | length == 0 )' $my_json
Edit(after question's edit): 如果你需要获取不同于前一个数组的 non-empty 数组的值,那么只需将上面的过滤器转换为
jq -r '.......| length > 0) | "\(.key):", "- \(.value[])"' $my_json
通过使用字符串插值
在 jq 中,您可以使用 length
过滤器来获取数组的大小。
$ echo '{"key1": [], "key2":["1","2"]}' | jq -r ".key2 | length"
2
$ echo '{"key1": [], "key2":["1","2"]}' | jq -r ".key1 | length"
0
此外,即便如此,您也会发现迭代存储在 $values
中的数组元素时出现问题。我想你想要的是这个:
values=$(jq -r ".key1[]" "$my_json")
这会丢弃所有具有空数组的项目,并迭代其余部分打印出键名,然后是所有数组项目。
jq -r 'to_entries[] | select(.value | length > 0) | .key, "- \(.value[])"'
key2
- first_value
- second_value
我正在尝试使用 bash 过滤我的 json 文件,该文件可能类似于:
{
"key1": [],
"key2":["first_value","second_value"]
}
如果我想获取我得到的 key1 和 key2,我可以这样做:
if $(cat $my_json | jq 'has("key1")'); then
values=$(jq -r ".key1" "$my_json")
for item in $values
do
echo "Item : $item"
done
fi
前面的输出是:
Output:
Item : []
如果我的文件没有这样的密钥并且我想验证这一点,这可以防止出现任何问题。
参考我的示例,如何验证值是否为空?
我想避免对空值进行任何迭代。
有什么方法可以用jq验证现有的密钥,它不应该是空的?
我想实现的目标是 redirected at the end of a file
key2:
- first_value
- second_value
如果是key,因为它是空的我不想有任何结果
一个选项可能是使用
jq '.| select( has("key1"))|to_entries[] | select( .value | length == 0 )' $my_json
Edit(after question's edit): 如果你需要获取不同于前一个数组的 non-empty 数组的值,那么只需将上面的过滤器转换为
jq -r '.......| length > 0) | "\(.key):", "- \(.value[])"' $my_json
通过使用字符串插值
在 jq 中,您可以使用 length
过滤器来获取数组的大小。
$ echo '{"key1": [], "key2":["1","2"]}' | jq -r ".key2 | length"
2
$ echo '{"key1": [], "key2":["1","2"]}' | jq -r ".key1 | length"
0
此外,即便如此,您也会发现迭代存储在 $values
中的数组元素时出现问题。我想你想要的是这个:
values=$(jq -r ".key1[]" "$my_json")
这会丢弃所有具有空数组的项目,并迭代其余部分打印出键名,然后是所有数组项目。
jq -r 'to_entries[] | select(.value | length > 0) | .key, "- \(.value[])"'
key2
- first_value
- second_value