json 格式化工具_如何在命令行中优雅地处理JSON
当年刚出道的时候,整天使用 grep/cut/awk 处理各种纯文本日志。那时候的日志都是一行一条,内容使用特定分割符。使用各种 unix 命令配合管道真可谓得心应手。
然而,到了 9102 年,好多数据都以 json 形式传输和存储。awk 这类工具在 json 处理方面就有点力不从心了,毕竟是几十年前开发的工具。那有没有针对 json 专门开发的工具呢?答案是肯定的,这就是本文要介绍的 jq 命令。
jqstedolan.github.io
jq 支持各种 unix 系统,请自行安装。现在单讲几种使用场景。
先来一个段 json 数据,内容如下(并写入 a.json 文件):
{"code":0,"message":"0","ttl":1,"data":{"results":[{"item_id":1342,"type":1},{"item_id":1785,"type":2},{"item_id":1413,"type":3}]}}
首先要做的就是格式化,这是 jq 最简单的功能:
cat a.json | jq ''
输出效果如下(还有语法高亮):
如果 json 很长,则可以使用管道传给 less 命令:
cat a.json | jq '' | less
如果你自己试一下就会发现,less 展示的结果没有颜色,这怎么能忍?
终端下的颜色是由转义序列控制的。有兴趣的同学可以参考我的拙作
涛叔:多彩的终端zhuanlan.zhihu.com
像 jq 这类的工具会检测输出目的地是否为终端环境(tty),如果不是(比如管道或普通文件)则不会输出颜色转义序列,否则这些转义序列会破坏文件内容。
但如果确定读写双方都支持转义序列,我们就可以强制开启颜色输出:
jq -C '' a.json|less -R
这里用到了 jq 的 -c
参数和 less 的 -R
参数。
现在介绍 jq 的高级操作。还是以上面的 json 为例。
{"code": 0,"message": "0","ttl": 1,"data": {"results": [{"item_id": 1342,"type": 1},{"item_id": 1785,"type": 2},{"item_id": 1413,"type": 3}]}
}
显然,这是一个比较负杂的数据结构。我们可以使用 jq 提取部分字段
$ cat a.json | jq '.code, .ttl'
0
1
提取字段使用.
操作,提取多个字段可以使用,
连接。
如果我们想提取 results 内容,则可以这样:
$ cat a.json | jq '.data.results'
[{"item_id": 1342,"type": 1},{"item_id": 1785,"type": 2},{"item_id": 1413,"type": 3}
]
是不是清真多了?
传统的 unix 工具是以行为单位,而 json 数组的每个元素可能有复杂的数据结构(多行),我们能否以元素为单位处理 json 数据呢?当然可以。
提取数组的元素字段
$ cat a.json | jq '.data.results' | jq '[].item_id'
1342
1785
1413
提取多个数组元素字段
$ cat a.json | jq '.data.results' | jq '[]|.item_id,.type'
1342
1
1785
2
1413
3
结果是 item_id 和 type 交替出现,传统的 unix 工具依然不好处理。能将同一元素的不同字段放到一行吗?当然可以:
$ cat a.json | jq '.data.results' |jq '.[] |"item_id:(.item_id) type:(.type)"'
"item_id:1342 type:1"
"item_id:1785 type:2"
"item_id:1413 type:3"
这里用到了所谓的 string interpolation 语法,有点像 swift 语言。好了,现在你可以再配合其他 uinx 工具对数据进行处理了。
jq 还支持很多高级特性,有兴趣的同学可以参考官方手册。本文的重点是介绍 jq 最核心的 20% 功能,基本可以解决 80% 的问题。
先写这么多,有问题请留言讨论。
json 格式化工具_如何在命令行中优雅地处理JSON相关推荐
- 如何在命令行中使用jq将JSON转换为CSV
by Knut Melvær 通过纳特·梅尔瓦 如何在命令行中使用jq将JSON转换为CSV (How to transform JSON to CSV using jq in the command ...
- 60行Shell代码实现在命令行中优雅地听歌
本文也发在了我的新个人博客上了,可以点击下面的链接获取更好的阅读体验: 60行Shell代码实现在命令行中优雅地听歌 0. 起因 起因就是对探索新歌失去了兴趣,并且觉得各种音乐播放软件都不怎么好用,而 ...
- centos 计算器_在Linux命令行中使用计算器的5个命令详解
大家好,我是良许. 在使用 Linux 时,我们有时会需要做一些计算,那么我们就可能需要用到计算器.在 Linux 命令行里,有许多计算器工具,这些命令行计算器可以让我们执行科学计算.财务计算或者一些 ...
- mysql 命令行 换行_在MySQL命令行中使用SQL语句的规则
规则1: SQL语句必须以分号(;)或者(\G)结束 分号(;)是SQL语句的结束标志.如果遗忘了分号,而直接按下回车键时,在MySQL客户端上将显示如下 mySQL> SELECT * FRO ...
- linux字符串转大写_在 Linux 命令行中转换大小写
转换文本的大小写可能非常繁琐,尤其是当你要避免无意间的拼写错误时.幸运的是,Linux 提供了一些命令,可以使工作变得非常容易. -- Sandra Henry-stocker(作者) 有很多方法可以 ...
- redis 命令 数据清理_如何在命令行中清理数据
redis 命令 数据清理 我是兼职数据审计师. 可以将我视为校对员,使用数据表而不是散文页面. 这些表是从关系数据库中导出的,通常大小适中:100,000至1,000,000条记录和50至200个字 ...
- 中使用mysql连接失败_如何在命令行下使用 MySQL 连接数据库不用每次都输入密码?...
点击上方☝SpringForAll社区 轻松关注! 及时获取有趣有料的技术文章 本文来源:http://rrd.me/g7J9e 我们知道在命令行下可以使用下面的命令连接 MySQL ,其中 xxx ...
- plsql中导入csvs_在命令行中使用sql分析csvs
plsql中导入csvs If you are familiar with coding in SQL, there is a strong chance you do it in PgAdmin, ...
- linux图片裁剪工具,Linux_在Linux的命令行中实现裁剪图片的方法 ,当涉及到在Linux中转换或编辑 - phpStudy...
在Linux的命令行中实现裁剪图片的方法 当涉及到在Linux中转换或编辑图像文件时,ImageMagick毫无疑问是最为熟知的一体化软件之一.它包含了一整套命令行工具,用以显示.转换,或复制超过20 ...
最新文章
- Script Lab 续:为 Officejs 开发配置 VSCode 环境
- linux运维趋势 37期刊为啥没有,linux运维常见问题
- [Android]使用MVP解决技术债务(翻译)
- 京东取消快递员底薪引热议 官方回应:试点更有激励性的业务提成
- 命令行安装DHCP服务器
- [推荐]白纸上的黑点和黑纸上的白点
- 有关Android插件化的一些总结思考,html5在移动端开发优势更明显
- 使用图形化编程实现灯泡开关设置
- 基于msm8916移植lcd流程
- Android中网络优化
- canvas实现扭蛋机动画效果
- 提供在Linux上运行最新版腾讯QQ与TIM的解决方案 Easiest Way to Run QQTIM on Linux
- Qt5 QML TreeView currentIndex当前选中项的一些问题
- ELGamal算法的编程实现
- 【深度】被加班,狼性文化面纱下的奴性文化
- java模拟运动,java线程赞助以及并发框架模拟运动员跑步比赛
- vue中使用echarts中国地图
- 牛客小白月赛22 D.收集纸片
- 芝麻授权 java调用_【java】手机浏览器怎么调用支付宝进行用户授权呢?
- daphile的dsd设置_PChifi目前最好的播放软件是什么?
热门文章
- 面试必谈的哈希,.Net 程序员温故而知新
- 从CLR GC到CoreCLR GC看.NET Core对云原生的支持
- .netcore 堆栈调用方法小记
- ASP.NET Core Web API 集成测试中使用 Bearer Token
- .NET Core Community 首个千星项目诞生:CAP
- RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World
- 免费开源的 .NET 分布式组件库 Exceptionless Foundatio
- 7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据
- 基于Spring Boot和Spring Cloud实现微服务架构学习
- IOS学习笔记十九NSArray和NSMutableArray