簡體   English   中英

如果密鑰匹配,則從bash中的json中提取特定的密鑰值

[英]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中匹配nameABC時提取帶有值的location

我嘗試了下面類似的方法,使花括號內的內容變得令人滿意。 但不確定是否要搜索特定的密鑰。

cat output.json | grep -o -e "{.*}"

輸出預期:如果nameABC匹配,則將輸出作為"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM