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项目地址上找到详细说明。

linux工具之jq相关推荐

  1. Linux工具快速上手,Linux很实用命令

    Linux工具快速上手 前言 Linux下有很多命令行工具供我们使用,每个工具总是提供了大量参数供我们选择: 实际工作中,我们用到的工具,最常用的总是那么几个参数组合: 为此,我写了这本书相对实用的书 ...

  2. linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

    Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件,交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况).所以这 ...

  3. 发布《Linux工具快速教程》

    发布<Linux工具快速教程> 阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书: 本书Github地址:https://github.com ...

  4. 如何把Linux工具里的“军刀”BusyBox移植到RT-Thread Smart?

    RT-Thread Smart 系列连载 序号 内容 1 <当"树莓派"遇上RT-Thread Smart--应用编程入门> 2 <RT-Thread Smart ...

  5. Kali Linux工具文档翻译计划

    Kali Linux工具文档翻译计划 Kali Tools Translate Volunteers是一个公益项目,简称KTTV,目标是将 http://tools.kali.org/tools-li ...

  6. Linux下安装jq

    Linux下安装jq 查看是否有jq安装包 yum list| grep jq 若有,直接安装jq yum -y install jq 直接在命令行输入:jq,然后回车,看到以下信息说明安装完毕 jq

  7. kali linux怎样下载全部工具,Kali Linux工具大全

    原标题:Kali Linux工具大全 本系列将以介绍工具的使用方法为主要目标,并不会刻意将每个工具定位到渗透测试标准的哪个具体阶段.具体内容我将根据自己的理解角度和实用经验来进行展开,所以它肯定不会是 ...

  8. linux工具类之硬盘检测

    linux工具类之硬盘检测 软raid mount /dev/md0 /opt                 [root@localhost root]# cp /usr/share/doc/rai ...

  9. linux红帽给文件加密,红帽大神制作 Linux 工具,用于旧款罗技无线键盘加密设置...

    Red Hat 的 Hans de Goede 编写了一个 Linux 实用程序,可为那些老化的罗技键盘配置加密链接状态;同时,也使得之前配置的使用加密链接的罗技键盘可以正确地重新配置. 正如 Han ...

最新文章

  1. DATEIF实例说明6
  2. struct ifconf和struct ifreq,获取网线插入状态
  3. DataGrid分页使用小结
  4. xcode 8   去除无用打印信息
  5. win10中微软账户中文名称修改后本地用户文件夹仍为中文名
  6. xshell链接kali
  7. Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息
  8. vscode安装和使用
  9. Leet Code OJ 2. Add Two Numbers [Difficulty: Medium]
  10. hbase replication原理分析
  11. html中%3csvg%3e标签的使用,微信小程序:使用svg
  12. C BNF grammar
  13. IntelliJ IDEA 自定义控制台输出多颜色格式功能 --- 安装Grep Console插件
  14. FFmpeg源代码简单分析:av_write_trailer()
  15. 六、面向对象编程——类和对象
  16. 低功耗STM32L151+RTC唤醒应用总结
  17. Android项目编码规范
  18. ubuntu搜狗拼音输入法无法切换英文
  19. 外贸找客户软件:Yellow Page Spider 8.7.1 Crack
  20. 在计算机储存中读写速度最快的是,储存器中存储速度最快的是哪个

热门文章

  1. Misc简单题目分享-CTF
  2. C# 国际化问题之CultureInfo(小数点的不同一些欧洲国家习惯使用,而非.)
  3. 基于QT ffmpeg的动态桌面壁纸
  4. Android 系统内的守护进程 - core类中的服务 (5) : logd
  5. java接口和抽象类的区别(经典面试题)
  6. python 排序(升序或降序)
  7. 2015百度竞价之如何增加有效点击率?
  8. ascii unicode utf8 gkb之间的关系
  9. C++ 多个指针指向同一个对象
  10. c语言有效的预处理命令,9、C语言之预处理命令(示例代码)