从JSON中查找key的值

relj7zay  于 2022-11-19  发布在  其他
关注(0)|答案(5)|浏览(194)

我想从这一行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"
}
r7knjye2

r7knjye21#

如果您有一个可以执行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(“raw output”)选项:

$ 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"
}
fcipmucu

fcipmucu2#

只需将您的数据传输到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的名字

mf98qq94

mf98qq943#

我发现最好的方法是使用python,因为它本身就能处理JSON,而且现在大多数系统都预装了python,不像jq:

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

nbewdwxp4#

不,不,不,不,不,不

#!/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

slwdgvem

slwdgvem5#

1个月1次
第4年第4周第9年第6年

  • 希望它将工作的所有。因为这将工作的我打印没有报价。*

相关问题