我想从这一行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"}
答案 0 :(得分:19)
如果你有一个可以执行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"
这只是id
对象中data
键的简单过滤器。
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"
}
答案 1 :(得分:3)
我发现自己最好的方法是使用python,因为它本机处理JSON,并且如今已预安装在大多数系统上,与jq不同:
$ python -c 'import sys, json; print(json.load(sys.stdin)["data"]["id"])' < infile.json
4dCYd4W9i6gHQHvd
答案 2 :(得分:0)
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