解析curl json响应并使用响应来构建另一个请求

时间:2015-04-14 07:32:53

标签: bash curl grep

我正在尝试构建一个shell脚本,它将获取随机XKCD漫画的图像URL,以便我可以使用Übersicht显示它。因为你只能向XKCD API索取我需要的最新漫画或特定漫画:

  1. GET发送http://xkcd.com/info.0.json个请求,获取num元素的值。
  2. http://xkcd.com/XXX/info.0.json发送另一个请求,其中XXX的值为num
  3. 我当前的命令如下所示,并成功返回漫画编号:

    curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+'
    
    1. 我无法弄清楚如何将捕获组与grep一起使用,所以我需要两次使用json。常见的建议是使用-P,这在Mac OS X 10.10中不受支持。
    2. 我不知道如何将grep的输出(如XXX)读入第二个curl -s 'http://xkcd.com/XXX/info.0.json'命令。

1 个答案:

答案 0 :(得分:9)

  1. 在OS X上,您可以使用系统Perl:

     curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/'
    
  2. 您可以使用命令替换将输出保存到变量:

    num=$(curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/')
    curl -sS "http://xkcd.com/${num}/info.0.json"
    

    或更简洁,二合一,尽管不太可读:

    curl -sS "http://xkcd.com/$(curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/')/info.0.json"
    

  3. 顺便说一下,我强烈推荐jq作为命令行JSON处理器。要使用num提取jq,它就像

    一样简单
    curl -sS http://xkcd.com/info.0.json | jq '.num'
    

    虽然你没有要求它,但这里有一个简单的单行代码jq,它提取最新图像的URI:

    curl -sS "http://xkcd.com/$(curl -sS http://xkcd.com/info.0.json | jq '.num')/info.0.json" | jq -r '.img'
    

    示例输出:

    http://imgs.xkcd.com/comics/spice_girl.png