2016年01月27日
写脚本还是以shell为主,但是在调用api或者访问服务的时候,经常用到json,这时候会用python来解析json数据,所以是否需要解析json一直是我决定用python还是shell编写脚本的参考依据。某天遇到一个大神,他说你知道jq嘛,回去搜一搜,简直了。废话少说,上代码说话。
ubuntu用户可以直接apt-get安装,自己安装就好。
基础用法
下面是一个典型的json串:
$ aliyuncli slb DescribeLoadBalancers
"LoadBalancers": {
"LoadBalancer": [
"AddressType": "internet",
"RegionIdAlias": "cn-hangzhou",
"LoadBalancerId": "123",
"LoadBalancerName": "1.xnow.com"
"AddressType": "internet",
"RegionIdAlias": "cn-hangzhou",
"LoadBalancerId": "456" ,
"LoadBalancerName": "2.xnow.com"
"AddressType": "internet",
"RegionIdAlias": "cn-hangzhou",
"LoadBalancerId": "789",
"LoadBalancerName": "3.xnow.com"
"RequestId": "xyz"
}
这串json实际上是我用aliyuncli管理工具获取到的三台阿里云slb的信息,当然是简化版,使用jq取得LoadBalancerName的方法如下:
获取某一台机器的LoadBalancerName:
$ aliyuncli slb DescribeLoadBalancers | jq ".LoadBalancers.LoadBalancer[1].LoadBalancerName"
"2.xnow.com"
获取所有LoadBalancerName
$ aliyuncli slb DescribeLoadBalancers | ".LoadBalancers.LoadBalancer[].LoadBalancerName"
"1.xnow.com"
"2.xnow.com"
"3.xnow.com"
利用jq的管道取出特定的字段,
$ aliyuncli slb DescribeLoadBalancers | jq ".LoadBalancers.LoadBalancer | .[0].LoadBalancerId"
"123"
$ aliyuncli slb DescribeLoadBalancers | jq ".LoadBalancers.LoadBalancer[0].LoadBalancerId"
"123"
拼接新json
自定义输出的字段名,拼接取得的字符串成新json:
$ aliyuncli slb DescribeLoadBalancers | jq ".LoadBalancers.LoadBalancer | \
{"id1" : .[0].LoadBalancerId, name1: .[0].LoadBalancerName}"
"name1": "1.xnow.com",
"id1": "123"
}
甚至:
$ aliyuncli slb DescribeLoadBalancers | jq "[.LoadBalancers.LoadBalancer[] | \
{"id" : .LoadBalancerId, name: .LoadBalancerName}]"
"name": "1.xnow.com",
"id": "123"
"name": "2.xnow.com",
"id": "456"
"name": "3.xnow.com",
"id": "789"
]
各种方法生成新json
$ aliyuncli slb DescribeLoadBalancers | jq "[.LoadBalancers.LoadBalancer[] | \
{"id" : .LoadBalancerId, name: .LoadBalancerName, type: [.AddressType]}]"
"type": [
"internet"
"name": "1.xnow.com",
"id": "123"
"type": [
"internet"
"name": "2.xnow.com",
"id": "456"
"type": [
"internet"
"name": "3.xnow.com",
"id": "789"
]
最后一例
看完上面的例子,相信就能够使用jq解析json了,下面再送上1个小命令,例如查看元素个数,如果shell使用for循环会用到:
$ aliyuncli slb DescribeLoadBalancers | jq ".LoadBalancers | length"
$ aliyuncli slb DescribeLoadBalancers | jq ".LoadBalancers.LoadBalancer | length"
$ aliyuncli slb DescribeLoadBalancers | jq ".LoadBalancers.LoadBalancer[0] | length"
4
更新:从json中获取多个字段
实例文档
example.json
内容如下:
[
"name": "libai",
"age": "46"
"name": "dufu",
"age": "34"
如果既要获取name,又要获取age, 可以采用如下的方式完成:
$ jq '.[] | .name + " is at age " + .age' example.json
"libai is at age 46"
"dufu is at age 34"
jq功能超级强大,甚至包括index,add,逻辑判断,正则表达式,debug,try-catch,while,split等等,可以作为一门语言来学,这里就不详细展开来,主要是我也不会。有兴趣看这里
https://stedolan.github.io/jq/manual/
python和shell相比较而言,shell具有短平快的特点(其实,主要是python还不熟)。配合好用的工具,shell还是极其强大的。
标签:
bash
,
json
,
jq
,
shell
Grey
: 写的很好,博主加油
2023年02月
2022年04月
2021年11月
2021年04月
2021年03月
2020年11月
2020年08月
2020年07月
2020年04月
2019年12月
2019年11月
2019年10月
2018年03月
2017年08月
2017年03月
2017年02月
2016年11月
2016年05月
2016年04月
2016年03月
2016年02月
2016年01月
2015年12月
2015年11月
2015年10月
2015年08月
2015年07月
2015年04月
2015年03月
2015年02月
2014年12月
2014年11月
2014年03月
2014年02月
2014年01月
2013年12月
2013年08月
2013年06月
2013年03月
2012年11月
2012年10月
2012年08月
2012年05月
2012年04月
2012年03月
2012年02月