当我们在LInux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq
我们先安装jq,再来看看如何使用这个工具
yum install jq -y
一般我都选择yum安装,当然也可以使用源码来安装,源码可以在github上下载,地址是:https://github.com/stedolan/jq或者https://pkgs.org/download/jq这个地方下载对应类型的安装包
接下来我们讲讲如何使用jq,首先我们先构建一个json来方便我们下一步的操作讲解,文件名命名为test.json
{ "name": "中国", "province": [{ "name": "黑龙江", "cities": { "city": ["哈尔滨", "大庆"] } }, { "name": "广东", "cities": { "city": ["广州", "深圳", "珠海"] } }, { "name": "台湾", "cities": { "city": ["台北", "高雄"] } }, { "name": "新疆", "cities": { "city": ["乌鲁木齐"] } }] }
解析json对象,我们这样操作
cat test.json | jq '.name' "中国" cat test.json | jq '.province[0].name' #取数组的第一个对象名字 "黑龙江" cat test.json | jq '.province[].name' #不定义索引数组的下标,那么将会遍历输出所有对应对象的名称 "黑龙江" "广东" "台湾" "新疆"
提取节点字段,我们这样操作
cat test.json | jq '.province[0]' #这样我们将得到一个json对象节点 { "cities": { "city": [ "哈尔滨", "大庆" ] }, "name": "黑龙江" } $ cat test.json | jq '.province[]' { "cities": { "city": [ "哈尔滨", "大庆" ] }, "name": "黑龙江" } { "cities": { "city": [ "广州", "深圳", "珠海" ] }, "name": "广东" } { "cities": { "city": [ "台北", "高雄" ] }, "name": "台湾" } { "cities": { "city": [ "乌鲁木齐" ] }, "name": "新疆" } $ cat test.json | jq '.province[0] | {name ,cities}' { "cities": { "city": [ "哈尔滨", "大庆" ] }, "name": "黑龙江" } $ cat test.json | jq '.province[0] | {name}' { "name": "黑龙江" }
内建函数
keys用来提取json中的key元素
$ cat test.json | jq 'keys' [ "name", "province" ] $ cat test.json | jq '.|keys' [ "name", "province" ] $ cat test.json | jq '.province[0]|keys' [ "cities", "name" ] $ cat test.json | jq '.province[]|keys' [ "cities", "name" ] [ "cities", "name" ] [ "cities", "name" ] [ "cities", "name" ]
has用来判断是否存在某个key
$ cat test.json | jq 'has("name")' true $ cat test.json | jq '.province[0] | has("name")' true $ cat test.json | jq 'has("noname")' false
jq
带上-r
选项可以去掉双引号
#不带-r选项 echo '{"a":"foo","b":"bar"} | jq .a "foo" #带-r选项 echo '{"a":"foo","b":"bar"} | jq -r .a foo
验证json,若json串格式错误的话,可以直接使用jq运行,会报出具体错误.