给出文件test.json
{
"file": {
"id": "123456789",
"name": "137.txt"
},
"lines": 219,
"characters": 2456
}
我想从命令行使用JQ访问元素name
。
键入jq .file.name test.json
会产生137.txt
。完美!
不幸的是,我们真正的json结构要大得多,键入元素的完整路径可能很麻烦。
是否可以在不键入完整路径的情况下检索name
的值?像jq *.name test.json
这样的*
是通配符?
在此先感谢您的帮助!
奥拉夫
答案 0 :(得分:2)
一种方法是使用..
进行深度递归,以尽可能深,如果存在 且 not 为null,则
jq '.. | .name? | select(. != null)'
答案 1 :(得分:0)
即使问题是jq所特有的,但让我使用Unix实用程序提供一种替代方法: jtc
。 jtc
默认执行递归搜索,因此选择name
很容易:
bash $ <file.json jtc -w'<name>l'
"137.txt"
bash $
l
指示仅在标签(键)之间搜索(否则,默认情况下,仅搜索字符串值)步行路径(-w...
)可以进一步扩展以从找到的元素中选择任何父对象,例如:
bash $ <file.json jtc -w'<name>l [-1]'
{
"id": "123456789",
"name": "137.txt"
}
bash $
[-1]
将针对直系父母,[-2]
–父母的父母,等等。并再次挖掘找到的父对象(通过搜索或通过下标,如以下多次所述):
bash $ <file.json jtc -w'<name>l [-1] [id]'
"123456789"
bash $
jtc
用户指南可以在这里找到:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md