[英]jq and bash : get a specific value in json when other key value pair matches
[英]extract specific key value from json in bash if key matches
我有一個JSON內容(output.json)
{"project": {"id": "A", "content": [{"name": "XYZ", "location": "Berlin", "comments":""}, {"name": "ABC", "location": "NewYork", "comments": "Hwllo"}, {"name": "DEF", "location": "Paris", "comments": "Success"}]}}
我想使用bash或shell命令從上述json中匹配name
說ABC
時提取帶有值的location
鍵
我嘗試了下面類似的方法,使花括號內的內容變得令人滿意。 但不確定是否要搜索特定的密鑰。
cat output.json | grep -o -e "{.*}"
輸出預期:如果name
與ABC
匹配,則將輸出作為"location":"NewYork"
對進一步處理有什么建議嗎?
可能會有更好的方法,這里有一種快速的方法。
cat output.json | sed 's/"name"/\n"name"/g' | grep '"name"' | awk -F',' '{print $2}'
新增| grep <preferred name>
如果需要根據名稱進行過濾,也可以使用| grep <preferred name>
。
從json提取時,請盡可能使用jq。 根據作者的說法,“ jq就像sed一樣用於JSON數據” (源) 。
在您的情況下,應為:
$ jq -r '.project' output.json | jq -r '.content' | jq '.[] | select(.name=="ABC")' | jq -r '.location'
輸出將是:
NewYork
要獲得所需的輸出,請執行以下操作:
"location":"NewYork"
您可以使用:
echo "\"location\":$(jq -r '.project' output.json | jq -r '.content' | jq '.[] | select(.name=="ABC")' | jq '.location')"
在使用jq之前,您應該在Debian和Ubuntu上安裝它,它將是:
$ sudo apt install jq
對於其他操作系統,您應該檢查此站點 。
使用Perl
$ perl -0777 -lne ' while(/"name":\s+"ABC",\s+"location":\s+(\S+)/msg) { print "$1\n" } ' output.json
"NewYork",
$ cat output.json
{"project": {"id": "A", "content": [{"name": "XYZ", "location": "Berlin", "comments":""}, {"name": "ABC", "location": "NewYork", "comments": "Hwllo"}, {"name": "DEF", "location": "Paris", "comments": "Success"}]}}
$
請使用JSON解析器處理JSON。
使用Xidel,它非常簡單:
xidel -s output.json -e '($json//content)()[name="ABC"]/location'
或者:
xidel -s output.json -e '$json/(.//content)()[name="ABC"]/location'
or in full:
xidel -s output.json -e '$json/project/(content)()[name="ABC"]/location'
上面是XPath表示法( 示例#11,讀取JSON )。 點符號(如jq
)也是可行的:
xidel -s output.json -e '($json).project.content()[name="ABC"].location'
[編輯]
上面的命令發出了NewYork
,我才意識到您需要輸出為"location":"NewYork"
。 Xidel也可以做到這一點:
xidel -s output.json -e '($json//content)()[name="ABC"]/concat("""location"":""",location,"""")'
[/編輯]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.