当年刚出道的时候,整天使用 grep/cut/awk 处理各种纯文本日志。那时候的日志都是一行一条,内容使用特定分割符。使用各种 unix 命令配合管道真可谓得心应手。

然而,到了 9102 年,好多数据都以 json 形式传输和存储。awk 这类工具在 json 处理方面就有点力不从心了,毕竟是几十年前开发的工具。那有没有针对 json 专门开发的工具呢?答案是肯定的,这就是本文要介绍的 jq 命令。

jq​stedolan.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 ''

输出效果如下(还有语法高亮):

使用 jq 格式化 json

如果 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相关推荐

  1. 如何在命令行中使用jq将JSON转换为CSV

    by Knut Melvær 通过纳特·梅尔瓦 如何在命令行中使用jq将JSON转换为CSV (How to transform JSON to CSV using jq in the command ...

  2. 60行Shell代码实现在命令行中优雅地听歌

    本文也发在了我的新个人博客上了,可以点击下面的链接获取更好的阅读体验: 60行Shell代码实现在命令行中优雅地听歌 0. 起因 起因就是对探索新歌失去了兴趣,并且觉得各种音乐播放软件都不怎么好用,而 ...

  3. centos 计算器_在Linux命令行中使用计算器的5个命令详解

    大家好,我是良许. 在使用 Linux 时,我们有时会需要做一些计算,那么我们就可能需要用到计算器.在 Linux 命令行里,有许多计算器工具,这些命令行计算器可以让我们执行科学计算.财务计算或者一些 ...

  4. mysql 命令行 换行_在MySQL命令行中使用SQL语句的规则

    规则1: SQL语句必须以分号(;)或者(\G)结束 分号(;)是SQL语句的结束标志.如果遗忘了分号,而直接按下回车键时,在MySQL客户端上将显示如下 mySQL> SELECT * FRO ...

  5. linux字符串转大写_在 Linux 命令行中转换大小写

    转换文本的大小写可能非常繁琐,尤其是当你要避免无意间的拼写错误时.幸运的是,Linux 提供了一些命令,可以使工作变得非常容易. -- Sandra Henry-stocker(作者) 有很多方法可以 ...

  6. redis 命令 数据清理_如何在命令行中清理数据

    redis 命令 数据清理 我是兼职数据审计师. 可以将我视为校对员,使用数据表而不是散文页面. 这些表是从关系数据库中导出的,通常大小适中:100,000至1,000,000条记录和50至200个字 ...

  7. 中使用mysql连接失败_如何在命令行下使用 MySQL 连接数据库不用每次都输入密码?...

    点击上方☝SpringForAll社区 轻松关注! 及时获取有趣有料的技术文章 本文来源:http://rrd.me/g7J9e 我们知道在命令行下可以使用下面的命令连接 MySQL ,其中 xxx ...

  8. plsql中导入csvs_在命令行中使用sql分析csvs

    plsql中导入csvs If you are familiar with coding in SQL, there is a strong chance you do it in PgAdmin, ...

  9. linux图片裁剪工具,Linux_在Linux的命令行中实现裁剪图片的方法 ,当涉及到在Linux中转换或编辑 - phpStudy...

    在Linux的命令行中实现裁剪图片的方法 当涉及到在Linux中转换或编辑图像文件时,ImageMagick毫无疑问是最为熟知的一体化软件之一.它包含了一整套命令行工具,用以显示.转换,或复制超过20 ...

最新文章

  1. Script Lab 续:为 Officejs 开发配置 VSCode 环境
  2. linux运维趋势 37期刊为啥没有,linux运维常见问题
  3. [Android]使用MVP解决技术债务(翻译)
  4. 京东取消快递员底薪引热议 官方回应:试点更有激励性的业务提成
  5. 命令行安装DHCP服务器
  6. [推荐]白纸上的黑点和黑纸上的白点
  7. 有关Android插件化的一些总结思考,html5在移动端开发优势更明显
  8. 使用图形化编程实现灯泡开关设置
  9. 基于msm8916移植lcd流程
  10. Android中网络优化
  11. canvas实现扭蛋机动画效果
  12. 提供在Linux上运行最新版腾讯QQ与TIM的解决方案 Easiest Way to Run QQTIM on Linux
  13. Qt5 QML TreeView currentIndex当前选中项的一些问题
  14. ELGamal算法的编程实现
  15. 【深度】被加班,狼性文化面纱下的奴性文化
  16. java模拟运动,java线程赞助以及并发框架模拟运动员跑步比赛
  17. vue中使用echarts中国地图
  18. 牛客小白月赛22 D.收集纸片
  19. 芝麻授权 java调用_【java】手机浏览器怎么调用支付宝进行用户授权呢?
  20. daphile的dsd设置_PChifi目前最好的播放软件是什么?

热门文章

  1. 面试必谈的哈希,.Net 程序员温故而知新
  2. 从CLR GC到CoreCLR GC看.NET Core对云原生的支持
  3. .netcore 堆栈调用方法小记
  4. ASP.NET Core Web API 集成测试中使用 Bearer Token
  5. .NET Core Community 首个千星项目诞生:CAP
  6. RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World
  7. 免费开源的 .NET 分布式组件库 Exceptionless Foundatio
  8. 7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据
  9. 基于Spring Boot和Spring Cloud实现微服务架构学习
  10. IOS学习笔记十九NSArray和NSMutableArray