携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天, 点击查看活动详情

用shell做网络请求时经常收到的响应是json格式的,所以解析json是必不可少的一环,这里介绍如何用jq解析和没有jq时的解析方式。

Json数据由httpbin提供,curl命令指向的url是 httpbin.org/json ,非联网环境可以参考该网站的提示,将网站docker容器化到本地。

jq首先需要安装,Ubuntu下默认不自带jq,通过apt install jq命令进行安装。

#!/bin/bash
json_data=$(curl http://httpbin.org/json)
echo $json_data|jq '.slideshow.author'
echo $json_data|jq '.slideshow.slides[0].title'

上面的命令将获取到的响应信息传入jq中,分别展示了取键值和数组的方法。jq取内部的节点和数组元素和一般的编程语言方法一致,较为清晰,能够很容易理解。

调取Python的方式

#!/bin/bash
json_data=$(curl http://httpbin.org/json)
echo $json_data|python3 -c 'import sys, json;json_data=sys.stdin.read();sys.stdout.write(json.dumps(json.loads(json_data).get("slideshow").get("author")));'

使用Python的json库解析时,需要注意python在linux中的形式,ubuntu在20.04版本开始就移除了python2,没有做额外软连接的话,这里脚本中使用python默认应该是python3。

这里将获取到的响应数据json_data作为输入,传入后面的脚本中,在脚本里用sys.stdin.read();进行读入。其他部分和python的语法一致。输出的sys.stdout.write也可以用print替代。

字符串匹配搜索方式

原理就是通过前后的截断,得到最终的字符串。比如下方截取author数据:

#!/bin/bash
json_data=$(curl http://httpbin.org/json)
xx=${json_data#*author\":}
yy=${xx%\"date\"*}
zz=$(echo -n $yy)
zz=${zz%?}
echo $zz|sed 's/\"//g'

对比文章开头的数据部分,要获取author字段的值,要夹取author和date之间的部分。

脚本中下列命令表示截取author之后的部分

${json_data#*author\":} 

下列命令表示截取date之前的部分

${xx%\"date\"*}

最后得到一个字符串如下:

"Yours Truly",

字符串还包含有脏数据,接下来通过echo -n的方式,去掉尾部换行符和空格,通过${zz%?}再去掉最后的逗号,最后传入sed中,去除两侧的引号即可得到author的值。 这种方式需要保证所截取的数据会在一个稳定的结构中。