2016-11-28 349 views
-1

在bash,我從一個蒙戈查詢的JSON響應:解析JSON的字符串

... 
json=`echo $con` 
echo $json 

結果看起來是這樣的:

{ "_id" : "579289cc0", "externalId" : "2911", "externalTenantGUID" : "29d3928e53b", "name" :["X", "Y"] ... }{ "_id" : "5792892323", "externalId" : "291e31", "externalTenantGUID" : "29d3928e3253b", "name" :["X", "Y"] ... }{ "_id" : "57923320", "externalId" : "293211", "externalTenantGUID" : "29d3928322e53b", "name" :["X", "Y"] ... } 

在這裏,我想分析這個響應$ con並且只得到映射到「_id」的值,比如579289cc0,5792892323,57923320.我嘗試使用sed和awk沒有成功(對於manny條件),有沒有更簡單的方法,而不安裝python?

+1

你能得到'jq'嗎? –

+0

hwo我可以得到jq嗎? –

+0

請參閱[這裏](https://stedolan.github.io/jq/download/)。 –

回答

0

使用正則表達式perl語法,可以按以下步驟進行。雖然這是一種難以實現的用例,但建議使用jq修復破損的json字符串並提取這些標識符。現在你可以做,

perl -lne 'print "$1" if /.*\"_id\" : \"([[:alnum:]]+)\".*/' file 
579289cc0 
5792892323 
57923320 

此外,您還可以使用grep啓用PCRE,即具有-P標誌的Perl風格的正則表達式匹配。

grep -Po "\"_id\" :\K \"([[:alnum:]]+)\"" <<<"$json" 
"579289cc0" 
"5792892323" 
"57923320" 
+0

很好它的工作,但不幸它只返回最後json的_id值,可能是因爲文件中的jsons在一行。我怎麼能設置這個爲所有值匹配到「_id」? –

+0

@CatalinaCenan:是的,我假定內容是在你的問題中的新行 – Inian

+0

我提到這是一個mongo查詢調用 –

0

做這樣的事情

<?php 

$con = '{ "products":[ 
         { 
          "_id": "579289cc0", 
          "externalId": "2911", 
          "externalTenantGUID": "29d3928e53b" 
         }, { 
          "_id": "5792892323", 
          "externalId": "291e31", 
          "externalTenantGUID": "29d3928e3253b" 
         }, { 
          "_id": "57923320", 
          "externalId": "293211", 
          "externalTenantGUID": "29d3928322e53b" 
         } 
        ] 
     }'; 
echo $con; 
$JSON_OBG = json_decode($con, true); 

// print_r($JSON_OBG); 

$Results = ''; 
foreach($JSON_OBG['products'] as $OBG) 
{ 
$Results .= $OBG['_id'].','; 
} 
$Results = rtrim($Results,','); 
echo $Results ; 
?> 
+0

它顯示以下錯誤:./ gettnt.sh:第18行:意外標記附近的語法錯誤'(' ./gettnt.sh:第18行:'$ JSON_OBG = json_decode($ con,true);'無論如何,沒有產品密鑰 –

+0

你必須看看如何創建一個JSON對象來處理,,,, –

1

隨着JQ:

$ jq '._id' infile 
"579289cc0" 
"5792892323" 
"57923320" 

或者,如果你不想讓身邊的結果的報價,使用-r爲 「原始輸出」:

$ jq -r '._id' infile 
579289cc0 
5792892323 
57923320 

如果你的JSON數據是在一個變量,而不是在一個文件中,您可以使用一個here string

$ jq -r '._id' <<< "$json" 
579289cc0 
5792892323 
57923320