[英]Reading and Looping Through A JSON File in BASH
我有一個名為department_groups.json的JSON文件(見下文)。
基本上如果我提出commercial
論證,我希望它能夠回歸:
commercial-team@domain.com
commercial-updates@domain.com
任何人都可以指導/幫助我這樣做嗎?
{
"legal": {
"google_groups":[
["Legal", "legal@domain.com"],
["Legal Team", "legal-team@domain.com"],
["Compliance Checks", "compliance@domain.com"]
],
"samba_groups": ""
},
"commercial":{
"google_groups":[
["Commercial Team", "commercial-team@domain.com"],
["Commercial Updates", "commercial-updates@domain.com"]
],
"samba_groups": ""
},
"technology":{
"google_groups":[
["Technology", "technology@domain.com"],
["Incidents", "incidents@domain.com"]
],
"samba_groups": ""
}
}
這將返回commercial
屬性的google_groups
屬性中每個數組中的第二個元素:
jq --arg key commercial '.[$key].google_groups | .[] | .[1]' file
使用jq -r
以“原始”格式輸出(丟失雙引號)。
$ key=commercial
$ jq -r --arg key "$key" '.[$key].google_groups | .[] | .[1]' file
commercial-team@domain.com
commercial-updates@domain.com
我在這些示例中使用了--arg
來顯示它是如何使用的,可選地使用shell變量。 另一方面,如果commercial
只是一個固定的字符串,那么你可以簡化:
jq -r '.commercial.google_groups | .[] | .[1]' file
要處理輸出的每一行,您可以while read
循環時使用shell:
key=commercial
while read -r email; do
echo "$email"
# process each email individually here
done < <(jq -r --arg key "$key" '.[$key].google_groups | .[] | .[1]' file)
這里我使用的是進程替換<()
,它就像一個可以由shell處理的文件。 與使用管道相比,這樣做的一個優點是不會創建子shell。 除此之外,這意味着循環中使用的變量在while
塊之后仍然在范圍內,因此您可以在以后使用它們。
如果您更喜歡使用管道,只需在done
后移除部件並將命令移至第一行:
jq ... | while read -r email; do # etc.
正如@TomFenech指出的那樣,要求有點不清楚,但如果它是你想要的電子郵件地址,他的答案的以下變體可能會引起關注:
key=commercial
$ jq -r --arg key "$key" '.[$key].google_groups[][] | select(test("@"))' department_groups.json
commercial-team@domain.com
commercial-updates@domain.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.