JQ:不管深度有多高,访问元素

时间:2019-03-06 16:20:29

标签: json nested jq

给出文件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这样的*是通配符?

在此先感谢您的帮助!

奥拉夫

2 个答案:

答案 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