【发布时间】:2021-02-13 06:17:17
【问题描述】:
我在一堆文件中输入了 JSON 数据,其中一个 IP 地址作为键。我需要遍历文件,并且需要从中取出“东西”。每个文件的 IP 地址都不同,但我想使用单个 jq 命令来获取数据。我尝试了很多东西,最接近的是:
jq '.facts | keys | keys as $ip | .[0]' a_file
关于我在 a_file 中的输入:
{
"facts": {
"1.1.1.1": {
"stuff":"value"
}
}
}
它返回IP地址,即1.1.1.1,但是我该如何回去做这样的事情(这显然是错误的,但我希望你明白):
jq '.facts.$ip[0].stuff' a_file
在我看来,我正在尝试填充一个变量,然后使用该变量的值来回退输入并再次扫描。
=== 编辑 === 请注意,我的输入实际上更像这样:
{
"facts": {
"1.1.1.1": {
"stuff": {
"thing1":"value1"
}
},
"outer_thing": "outer_value"
}
}
所以我得到了一个错误:
jq: error (at <stdin>:9): Cannot index string with string "stuff"
这修复了它-.stuff 后面的问号:
.facts | keys_unsorted[] as $k | .[$k].stuff?
【问题讨论】:
-
仅供参考:您的问题还有另一种解决方案 -
jtc。在那里,您的 json 查询将如下所示:jtc -w'<^(?:\d+\.){3}\d+$>L:[stuff]' *.json。这将是一个 input invariant 解决方案 - 即,无论您的源 JSON 看起来如何(您可以尝试添加任意数量的外部封装),它总是会通过 regex (IP 地址的简化匹配)并将返回您的stuff。 PS。我是jtc的开发者。