2016-09-23 76 views
1

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

这可能会帮助您:http://stackoverflow.com/questions/1955505/parsing-json-with-unix-tools – deathyr

+0

尝试'grep的 - o -P'“id”:。*?“,'json.file | sed's /”\ |,// g''应该可以帮助你......但是如果你想要了解一些json工具。 –

+0

@Stark [不要在问题正文中使用标记标记](http://meta.stackexchange.com/q/114860/250916),[不要使用内联代码跨度来强调](http:// meta .stackexchange.com/q/135112/250916),并且该问题显示为“单行JSON”,因此打印出来没有任何意义。你还添加了一个额外的'}',使JSON无效。 –

回答

5

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

$ 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" 
} 
+0

https://stedolan.github.io/jq/,有助于使其脱机。 +1为它 – Vikrant

+0

@Stark第一次提到“jq”实际上是该网站的链接;) –

+0

我注意到了它。所以+1 ..是不是太小,得不到通知? :D – Vikrant