首页 > 解决方案 > 通过bash检查特定字符串是否在Json文件中

问题描述

可以说这是我的 json 文件内容:

[ { "id":"45" }, { "id":"56" }, { "id":"13" }, { "id":"5" } ]

我想知道 id "13" 是否在 json 文件中。有没有办法做到这一点bash

我尝试使用 jq 及其各种不同的变体(例如包含和不包含)运行该命令,但没有任何东西可以为我回答这个查询。

标签: jsonbashjq

解决方案


注意:当问题关闭时,我在问题中添加了这个答案,以重新打开问题:

(( $(jq < file.json '[.[].id | select(. == "13")] | length') > 0))

OP说它效率低下。我不知道为什么。这是它的作用:

  1. 它通过jq程序传递 JSON,这是一个 JSON 解析器。bash shell 对 JSON 没有原生理解,因此任何解决方案都将使用外部程序。其他程序会将 JSON 视为文本,并且可能在某些或大多数情况下工作,但最好使用jq遵循正式 JSON 规范的程序来解析数据。

  2. 它创建一个数组来捕获...的输出

    1. 它循环遍历数组,挑选出所有id字段

    2. id如果值为“13” ,则输出该字段的值

  3. 它计算数组的长度,即id值为“13”的字段数

  4. 使用 native bash,它将输出转换为数字,如果数字大于 0 则评估为 true ,否则为 false 。

我认为您不会发现正式遵循 JSON 规范的更高效的东西。

  • 这仅运行 1 个程序,jq这是事实上的标准 JSON 处理器。它不是 POSIX 标准(早于 JSON)的一部分,但它是最有可能安装在系统上的 JSON 处理器。
  • 这使用本机构bash造来解释输出和测试。
  • 不会有比jq.
  • 不会有明显更好的jq过滤器,因为它将处理整个输入(这就是它的工作方式)并且select过滤器停止处理未通过测试的对象,即全部或几乎全部。

另一种“峰值”表示更紧凑、更优雅(好东西),但效率并没有显着提高(或降低)。它在帖子中看起来更好,因为很多内容都被遗漏了。完整的测试将是

[[ $(jq < file.json 'any(.[]; .id == "13")') == "true" ]]

实际上,.[];生成器是不必要的,所以更紧凑的答案是

[[ $(jq < file.json 'any(.id == "13")') == "true" ]]

推荐阅读