【问题标题】:Find the value of key from JSON从 JSON 中查找 key 的值
【发布时间】:2016-09-23 03:07:16
【问题描述】:

我想从这一行 JSON 中提取 "id" 键。

我相信这可以用 grep 完成,但我不确定正确的方法。

如果有没有依赖的更好方法,我会感兴趣。

这是我的示例输出:

{"data": {"name": "test", "id": "4dCYd4W9i6gHQHvd", "domains": ["www.test.domain.com", "test.domain.com"], "serverid": "bbBdbbHF8PajW221", "ssl": null, "runtime": "php5.6", "sysuserid": "4gm4K3lUerbSPfxz", "datecreated": 1474597357}, "actionid": "WXVAAHQDCSILMYTV"}

【问题讨论】:

标签: json grep


【解决方案1】:

如果你有一个可以执行 Perl 兼容正则表达式 (PCRE) 的 grep:

$ grep -Po '"id": *\K"[^"]*"' infile.json
"4dCYd4W9i6gHQHvd"
  • -P 启用 PCRE
  • -o 只保留匹配项
  • "id": * 匹配 "id" 和任意数量的空格
  • \K 将其左侧的所有内容都扔掉(“可变大小正向后视”)
  • "[^"]*" 匹配两个引号以及它们之间的所有非引号

如果你的 grep 不能做到这一点,你可以使用

$ grep -o '"id": *"[^"]*"' infile.json | grep -o '"[^"]*"$'
"4dCYd4W9i6gHQHvd"

这使用了两次grep。第一个命令的结果是"id": "4dCYd4W9i6gHQHvd";第二个命令删除除了一对引号和它们之间的非引号之外的所有内容,锚定在字符串的末尾 ($)。

但是,正如所指出的,您不应该为此使用 grep,而应该使用可以解析 JSON 的工具——例如 jq

$ jq '.data.id' infile.json
"4dCYd4W9i6gHQHvd"

这只是data 对象中id 键的简单过滤器。要摆脱双引号,您可以使用-r(“原始输出”)选项:

$ jq -r '.data.id' infile.json
4dCYd4W9i6gHQHvd

jq 还可以漂亮地打印您的 JSON:

$ jq . infile.json
{
  "data": {
    "name": "test",
    "id": "4dCYd4W9i6gHQHvd",
    "domains": [
      "www.test.domain.com",
      "test.domain.com"
    ],
    "serverid": "bbBdbbHF8PajW221",
    "ssl": null,
    "runtime": "php5.6",
    "sysuserid": "4gm4K3lUerbSPfxz",
    "datecreated": 1474597357
  },
  "actionid": "WXVAAHQDCSILMYTV"
}

【讨论】:

  • @BenjaminW。谢谢!使用 grep 将非常适合这种情况。这有效grep -o '"id": *"[^"]*"' test.txt | grep -o '"[^"]*"$' 我如何也删除引号,只留下 ID?
  • @petebocken 您必须删除第一个命令的最后一个引号以及第二个命令的第一个和最后一个引号:grep -o '"id": *"[^"]*' test.txt | grep -o '[^"]*$'
  • @BenjaminW。我尝试了几次编辑,但由于某种原因找不到合适的删除。这很完美,谢谢!
  • @BenjaminW。 '"id": *\K"[^"]*"' 这对我有用,但我如何确保从结果中删除双引号。
  • @BenjaminW。我尝试了 2 grep 解决方案,它奏效了 :) 干杯
【解决方案2】:

只需将您的数据传送到jq 并通过按键选择

"data": {
    "name": "test",
    "id": "4dCYd4W9i6gHQHvd",
    "domains": [
      "www.test.domain.com",
      "test.domain.com"
    ],
    "serverid": "bbBdbbHF8PajW221",
    "ssl": null,
    "runtime": "php5.6",
    "sysuserid": "4gm4K3lUerbSPfxz",
    "datecreated": 1474597357
  },
  "actionid": "WXVAAHQDCSILMYTV"
} | jq '.data.id'     

# 4dCYd4W9i6gHQHvd

Tutorial Here

【讨论】:

    【解决方案3】:

    我发现自己最好的方法是使用 python,因为它可以原生处理 JSON,并且与 jq 不同,现在大多数系统都预装了:

    $ python -c 'import sys, json; print(json.load(sys.stdin)["data"]["id"])' < infile.json
    4dCYd4W9i6gHQHvd
    

    【讨论】:

    • 喜欢这个答案,因为它使用了现有的东西。安装越来越多的东西来解决这样的问题太容易了。非常简单,但被忽视的方法!
    • 最简单的解决方案
    【解决方案4】:

    $grep -oP '"id": *"\K[^"]*' infile.json

    4dCYd4W9i6gHQHvd

    希望它适用于所有人。因为这对我来说可以在不带引号的情况下打印。

    【讨论】:

      【解决方案5】:

      没有pythonjqawksed 只是 GNU grep

      #!/bin/bash
      json='{"data": {"name": "test", "id": "4dCYd4W9i6gHQHvd", "domains": ["www.test.domain.com", "test.domain.com"], "serverid": "bbBdbbHF8PajW221", "ssl": null, "runtime": "php5.6", "sysuserid": "4gm4K3lUerbSPfxz", "datecreated": 1474597357}, "actionid": "WXVAAHQDCSILMYTV"}' 
              
      echo $json | grep -o '"id": "[^"]*' | grep -o '[^"]*$'
      

      在这里测试和工作:https://ideone.com/EG7fv7

      来源:https://brianchildress.co/parse-json-using-grep

      【讨论】:

        猜你喜欢
        • 2017-06-06
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2019-01-07
        相关资源
        最近更新 更多