linux工具之jq

linux工具之jq

后端开发的工程师经常在linux下开发,当我们拿到一个json格式的数据时,如何有效对这个数据进行分析?我们可以采用python结合json库来分析,但是linux有一个很好用的工具,让我们可以方便地处理json文本,功能非常强大。官方文档


下载

参考官网说明

macOS:

brew install jq

Linux

sudo apt-get install jq

使用

数据准备

jq可以把json的文本输出为可读形式,我准备了一份测试json数据,如下:

{
    "name": "xueyuan",
    "age": 21,
    "birthday": "10th August",
    "email": "im.hexueyuan@outlook.com",
    "skills" : [
        "C/C++",
        "Python",
        "Golang",
        "Node.js"
    ]
}

我使用python的json库把它处理为一个字符串,如下:

{"skills": ["C/C++", "Python", "Golang", "Node.js"], "age": 21, "birthday": "10th August", "name": "xueyuan", "email": "im.hexueyuan@outlook.com"}

这个格式是我们在实际生产中经常看到的格式,比如我们使用curl请求一个接口,返回了一个json,比如我们在自己的项目中测试输出了一个json数据,这种格式往往可读性较差,我们需要进行处理后才能查看。


使用

要转换成python处理前的那一种易读形式很简单,执行:

cat json2.data | jq '.'
#也可以写作 cat json2.data | jq .
#不加引号,但是为了标准最好写上,因为某些时候不加会有问题.

输出
在这里插入图片描述

jq把数据转换成易读格式,还添加了颜色高亮说明,其中key和value使用了不同的颜色。

如果json数据很大,我们只想看其中某个字段数据,那么使用如下语法:

#key是字段名称
jq '.<key>'

测试
在这里插入图片描述

当某个字段是一个列表,jq可以对其进行切片

jq '.<list-key>[s:e]'

测试
在这里插入图片描述

切片支持图中几种格式,注意和python列表切片方式进行区分。

区别一下’.skills’和’.skills[]'两种,可以看到前者输出是一个列表,后者是非json格式的列表成员。


用法详解

上一节是jq的常用用法,这里讲解jq的具体原理。

jq从linux管道或者文件中获取文本输入,如果文本不满足json格式,那么jq会报错,可以用这个方法来检查一个文本是否满足json检查:

jq '.' json_file > /dev/null

jq使用filter来处理json文本,并输出filter处理后的内容到标准输出,filter是用来过滤满足需求的字段的,比如最简单的filter '.',这个表示无过滤策略,因此会输出全部json文本。


key filter

'.<key>'

过滤满足key的字段名,输出这个key的值。


key-value filter

'<key>'

输出key和value,区别key filter,如下

在这里插入图片描述

因为key-value必须归属于某个对象,所以添加外层{}。


index filter

'.<list-key>[index]'
'.<list-key>[index1, index2]'
'.<list-key>[s:e]'
'.<list-key>[:e]'
'.<list-key>[s:]'
'.<list-key>[]'

数组索引和切片,用来操作列表元素。


嵌套层级filter

'.key1.key2.key3'

用于嵌套的json数据filter。


多个filter

'.key1, .key2, .key3'

使用英文单字节逗号分隔filter,用于在一个filter中过滤多个字段。


filter管道

'filter1 | filter2 | filter3'

example

jq '.contact | .phone | .home' people.json

由于大部分filter之后,输出仍然是一个json数据,所以可以将filter通过管道连接。


重新组织filter后输出的数据

有时候我们需要重新构造json的结构,比如去掉某一层嵌套,比如取某几个字段组成一个新的json,这时候我们需要重新改变json的结构,我们可以使用[]{}来重新组织json。

#把输出组织成一个列表
jq '[filter1, filter2, filter3]' data.json

测试

在这里插入图片描述

#把输出组织为新的json对象
jq '{filter1, filter2, filter3}' data.json

测试

在这里插入图片描述

递归展开json结构

有时候我们需要在一个json里边查找某个字段,但是确不知道这个字段在哪个嵌套里边,如果嵌套很深那么很难找到,jq可以把嵌套展开打平之后再查找。

#展开嵌套
jq '..' data.json

测试

在这里插入图片描述

展开之后结合管道再次filter可以查找key。


length filter

计算元素长度,对于对象,length表示对象里的元素个数,对于string,length表示string字符数,对于列表,表示列表元素个数。

测试

在这里插入图片描述

keys filter

输出全部的key,列表形式
测试

在这里插入图片描述

检查某个key是否存在

如果输入是一个对象,那么对象的元素是以"key-value"形式存在的,使用

jq 'has("key-name")' data.json

检查json对象是否含有某个key。


列表遍历

jq支持使用map()或者map_values()遍历列表,或者对象的值。

测试
在这里插入图片描述

删除某个key

jq 'del(filter)' json.data

使用del()删除filter描述的key-value。


了解更多

上一节只说明了jq比较常用的功能,实际上jq还有更多实用的filter,如果上述的功能还没有满足你的需求,你可以在jq项目地址上找到详细说明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值