【问题标题】:How to grep specific value from JSON file?如何从 JSON 文件中 grep 特定值?
【发布时间】:2019-06-24 10:26:18
【问题描述】:

我有一个 JSON 文件和如下内容:

[  
       {  
          "id":"54545-f919-4b0f-930c-0117d6e6c987",
          "name":"Inventory_Groups",
          "path":"/Groups",
          "subGroups":[  
             {  
                "id":"343534-394b-429a-834e-f8774240d736",
                "name":"UserGroup",
                "path":"/Groups/UserGroup",
                "subGroups":[  

                ]
             }
          ]
       }
    ]

现在我想 grep 来自 subGroups 区域的键 id 的值。如何实现这一点,如果id 键不重复,则可以通过以下方式实现:

grep -o '"id": "[^"]*' Group.json | grep -o '[^"]*$'

但在我的情况下,我如何才能获得出现两次的 id 的值?

【问题讨论】:

  • 不要用正则表达式解析 JSON(再次)!
  • 不鼓励我们回答有关使用基于行的实用程序解析结构化数据(YAML、JSON 等)的问题。请查看 jq 以获取基于 shell 的 JSON 解析。
  • @Biffen jq 在我的情况下不能使用,因为它没有安装在客户端机器上,对我来说它限制在 linux 机器上安装任何新包。
  • 最直接的问题是您希望冒号后面有一个空格,但这只是尝试使用正则表达式解析 JSON 时的许多问题之一。即使你解决了这个问题,并且得到了一些碰巧可以工作的东西,一旦 JSON 发生轻微变化,它也有很大的风险会停止工作。
  • @SubodhJoshi 在询问如何仅使用标准 UNIX 工具(例如 grep、sed、awk)解析 JSON 或 XML 或任何其他语言时,在您的问题中说明您只能访问标准非常重要UNIX 工具,不能安装其他任何东西。这样一来,人们就可以使用那些标准的 UNIX 工具回答您而不会被否决,而且您也不会得到一堆相关的 cmets 和 downvotes。

标签: json shell grep


【解决方案1】:

向您的雇主提出的一个有效问题是,为什么您可以使用 shell,但不能使用适当的 linux 软件包。比较:

awk -F '[":,]+' '$2=="subGroups" {f=1} f && $2=="id" {print $3; exit}' file

(脆弱的解决方案,如果您的 JSON 结构发生变化,将失败)

收件人:

jq '.[].subGroups[].id' file

除了许多其他现实的复杂性之外,它还可以处理紧凑的 JSON。

【讨论】:

  • 狡猾,但“脆弱”是轻描淡写。即使结构相同但 representation 更改,它也会失败。不要误会我的意思,这是对awk 的巧妙使用,但警告不够大。
  • @Biffen 你是对的。在对jq(以及它糟糕的联机帮助页,imo)进行了少量投资之后,我拒绝在没有它的情况下处理 JSON。但是,OP的问题是真实存在的,我之前一直处于没有能力获得我想要的软件的位置,所以我很同情。可以想象,一个 POSIX JSON 解析器是面向未来的,但这需要详细了解系统要求和历史。无论如何,感谢您参与讨论,而不仅仅是投票。
  • 这正是我的想法。如果你被允许使用,你应该被允许使用 JQ。如果第一个标签中的任何结构发生变化,则 awk 将失败。虽然这是通过 Awk 找到它的好方法。
【解决方案2】:

仅使用标准 UNIX 工具并假设您的 sed 可以容忍没有终止换行符的输入(否则我们可以将 tr 替换为保留最后一个换行符的 awk 命令):

$ tr -d '\n' < file | sed 's/.*"subGroups":[^]}]*"id":"\([^"]*\)\".*/\1\n/'
343534-394b-429a-834e-f8774240d736

或者只需调用任何 awk:

$ awk '
    { rec = (NR>1 ? rec ORS : "") $0 }
    END {
        gsub(/.*"subGroups":[^]}]*"id":"|".*/,"",rec)
        print rec
    }
' file
343534-394b-429a-834e-f8774240d736

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多