从JSON中查找key的值

pet*_*ken 9 grep json

我想"id"从这一行JSON中提取密钥.

我相信这可以用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"}
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 26

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

$ grep -Po '"id": *\K"[^"]*"' infile.json
"4dCYd4W9i6gHQHvd"
Run Code Online (Sandbox Code Playgroud)
  • -P 启用PCRE
  • -o 只保留比赛
  • "id": *匹配"id"和任意数量的空格
  • \K 扔掉左边的一切("可变大小正面观察")
  • "[^"]*" 匹配两个引号和它们之间的所有非引号

如果你的grep不能那样做,你可以使用

$ grep -o '"id": *"[^"]*"' infile.json | grep -o '"[^"]*"$'
"4dCYd4W9i6gHQHvd"
Run Code Online (Sandbox Code Playgroud)

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

但是,正如所指出的,你不应该使用grep,而是一个可以解析JSON的工具 - 例如jq:

$ jq '.data.id' infile.json
"4dCYd4W9i6gHQHvd"
Run Code Online (Sandbox Code Playgroud)

这只是对象中id键的简单过滤器data.

jq也可以整齐地打印你的JSON:

$ jq -r '.data.id' infile.json
4dCYd4W9i6gHQHvd
Run Code Online (Sandbox Code Playgroud)

  • @BenjaminW。谢谢!使用 grep 非常适合这种情况。这有效 `grep -o '"id": *"[^"]*"' test.txt | grep -o '"[^"]*"$'` 我如何删除引号,只留下ID? (2认同)
  • @petebocken 您必须从第一个命令中删除最后一个引号,并从第二个命令中删除第一个和最后一个引号:`grep -o '"id": *"[^"]*' test.txt | grep -o '[^"]*$'` (2认同)

jas*_*ard 7

只需将您的数据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
Run Code Online (Sandbox Code Playgroud)

教程在这里


Kam*_*ist 5

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

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

  • 喜欢这个答案,因为它使用了现有的东西。只需安装越来越多的东西来解决此类问题就太容易了。非常简单,但被忽视的方法! (2认同)

小智 5

python,,,只有GNU :jqawksedgrep

#!/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 '[^"]*$'
Run Code Online (Sandbox Code Playgroud)

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

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