【问题标题】:JSON: using jq with variable keysJSON:使用带有可变键的 jq
【发布时间】: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'&lt;^(?:\d+\.){3}\d+$&gt;L:[stuff]' *.json。这将是一个 input invariant 解决方案 - 即,无论您的源 JSON 看起来如何(您可以尝试添加任意数量的外部封装),它总是会通过 regex (IP 地址的简化匹配)并将返回您的stuff。 PS。我是jtc的开发者。

标签: json key jq


【解决方案1】:

你几乎猜对了,但是需要对象值迭代器构造 .[] 来获取键对应的值

.facts | keys_unsorted[] as $k | .[$k].stuff

这假设在facts 中有一个包含IP 地址作为键的对象,并且您想从中提取.stuff

(可选)为了防止内部不包含stuff 的对象,您可以将? 添加为.[$k].stuff?。您还可以选择根据有效的 IP 正则表达式条件验证密钥,并仅过滤这些密钥的值。

【讨论】:

  • 我的天哪,太快了!谢谢! .[] 在我看来就像一个数组。我脑子里的 bash/perl/C 太多了!
  • @MikeS:如果你知道函数式编程术语map,你可以在jq中这样定义:def map(f): [ .[] | f ];——意思是,首先你拆分隐式输入列表的每个元素,然后将过滤器f 应用于每个人,然后将它们收集到[ ... ] 列表中;所以在这里,.[]map 的拆分部分。所以这与[ ... ] 的相反,后者将事物收集在一个列表中。
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 2011-01-11
  • 2019-05-07
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多