使用jq

时间:2016-05-04 23:55:04

标签: json bash jq

作为bash和jq的新手,我试图在bash脚本中使用jq命令从json文件中下载几个url。

我的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命令中重命名该文件。但我不知道我应该在这里使用什么结构。那么如何将标题保留在过滤器中并在之后使用呢?

2 个答案:

答案 0 :(得分: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[@]}"&amp; ${links[@]} ...

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

编辑:更容易&amp;更安全的方法:

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

答案 1 :(得分: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