2016-05-04 63 views
0

作爲bash和jq的新手,我試圖在bash腳本中使用jq命令從json文件下載幾個url。使用jq選擇多個json密鑰

我items.json文件看起來像這樣:

[ 
    {"title" : [bob], "link" :[a.b.c]}, 
    {"title" : [alice], "link" :[d.e.f]}, 
    {"title" : [carol], "link" :[]} 
] 

我最初做的只是過濾非空鏈接,並把它們放在一個數組,然後下載數組:

#!/bin/bash 
lnk=($(jq -r '.[].link[0] | select (.!=null)' items.json)) 
for element in ${lnk[@]} 
do 
    wget $element 
done 

但是這種方法的問題是所有下載的文件都使用鏈接作爲文件名。

我希望過濾json文件,但仍然保留鏈接的標題名稱,以便我可以在wget命令中重命名該文件。但我不知道我應該在這裏使用什麼結構。那麼如何將標題保留在過濾器中並在之後使用?

+0

提供的「items.json」文件不是有效的JSON。請提供有效的輸入和預期的輸出樣本。 –

回答

0

您可以使用此:

IFS=$'\n' read -d '' -a titles < <(jq -r '.[] | select (.link[0]!=null) | .title[0]' items.json); 
IFS=$'\n' read -d '' -a links < <(jq -r '.[] | select (.link[0]!=null) | .link[0]' items.json); 

然後你可以遍歷數組"${title[@]}" & ${links[@]} ...

for i in ${!titles[@]}; do 
    wget -O "${titles[i]}" "${links[@]}" 
done 

編輯:更安全&方法:

jq -r '.[] | select (.link[0]!=null) | @sh "wget -O \(.title[0]) \(.link[0])"' items.json | bash 
0

這裏是一個bash腳本,演示閱讀將jq過濾器轉換爲bash變量。

#!/bin/bash 
jq -M -r ' 
    .[] 
    | select(.link[0]!=null) 
    | .title[0], .link[0] 
' items.json | \ 
while read -r title; read -r url; do 
    echo "$title: $url" # replace with wget command 
done