2016-09-23 74 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