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项目地址上找到详细说明。
linux工具之jq相关推荐
- Linux工具快速上手,Linux很实用命令
Linux工具快速上手 前言 Linux下有很多命令行工具供我们使用,每个工具总是提供了大量参数供我们选择: 实际工作中,我们用到的工具,最常用的总是那么几个参数组合: 为此,我写了这本书相对实用的书 ...
- linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...
Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件,交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况).所以这 ...
- 发布《Linux工具快速教程》
发布<Linux工具快速教程> 阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书: 本书Github地址:https://github.com ...
- 如何把Linux工具里的“军刀”BusyBox移植到RT-Thread Smart?
RT-Thread Smart 系列连载 序号 内容 1 <当"树莓派"遇上RT-Thread Smart--应用编程入门> 2 <RT-Thread Smart ...
- Kali Linux工具文档翻译计划
Kali Linux工具文档翻译计划 Kali Tools Translate Volunteers是一个公益项目,简称KTTV,目标是将 http://tools.kali.org/tools-li ...
- Linux下安装jq
Linux下安装jq 查看是否有jq安装包 yum list| grep jq 若有,直接安装jq yum -y install jq 直接在命令行输入:jq,然后回车,看到以下信息说明安装完毕 jq
- kali linux怎样下载全部工具,Kali Linux工具大全
原标题:Kali Linux工具大全 本系列将以介绍工具的使用方法为主要目标,并不会刻意将每个工具定位到渗透测试标准的哪个具体阶段.具体内容我将根据自己的理解角度和实用经验来进行展开,所以它肯定不会是 ...
- linux工具类之硬盘检测
linux工具类之硬盘检测 软raid mount /dev/md0 /opt [root@localhost root]# cp /usr/share/doc/rai ...
- linux红帽给文件加密,红帽大神制作 Linux 工具,用于旧款罗技无线键盘加密设置...
Red Hat 的 Hans de Goede 编写了一个 Linux 实用程序,可为那些老化的罗技键盘配置加密链接状态;同时,也使得之前配置的使用加密链接的罗技键盘可以正确地重新配置. 正如 Han ...
最新文章
- DATEIF实例说明6
- struct ifconf和struct ifreq,获取网线插入状态
- DataGrid分页使用小结
- xcode 8 去除无用打印信息
- win10中微软账户中文名称修改后本地用户文件夹仍为中文名
- xshell链接kali
- Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息
- vscode安装和使用
- Leet Code OJ 2. Add Two Numbers [Difficulty: Medium]
- hbase replication原理分析
- html中%3csvg%3e标签的使用,微信小程序:使用svg
- C BNF grammar
- IntelliJ IDEA 自定义控制台输出多颜色格式功能 --- 安装Grep Console插件
- FFmpeg源代码简单分析:av_write_trailer()
- 六、面向对象编程——类和对象
- 低功耗STM32L151+RTC唤醒应用总结
- Android项目编码规范
- ubuntu搜狗拼音输入法无法切换英文
- 外贸找客户软件:Yellow Page Spider 8.7.1 Crack
- 在计算机储存中读写速度最快的是,储存器中存储速度最快的是哪个
热门文章
- Misc简单题目分享-CTF
- C# 国际化问题之CultureInfo(小数点的不同一些欧洲国家习惯使用,而非.)
- 基于QT ffmpeg的动态桌面壁纸
- Android 系统内的守护进程 - core类中的服务 (5) : logd
- java接口和抽象类的区别(经典面试题)
- python 排序(升序或降序)
- 2015百度竞价之如何增加有效点击率?
- ascii unicode utf8 gkb之间的关系
- C++ 多个指针指向同一个对象
- c语言有效的预处理命令,9、C语言之预处理命令(示例代码)