jq:命令行 JSON 处理神器

JSON 是前端编程经常用到的格式,对于 PHP 或者 Python,解析 JSON 都不是什么大事,尤其是 PHP 的 json_encode 和 json_decode 非常好用。而 Linux 下也有这样的神器,就是 jq 命令,对于运维平常处理 JSON 格式的文件有很大帮助!对于 JSON 格式而言,jq 就像 sed/awk/grep 这些神器一样的方便,而且 jq 没有乱七八糟的依赖,只需要一个 binary 文件 jq 就足矣。

一、安装

apt-get -y install jq

二、使用

1. 格式化 JSON

先准备一个测试文件 json_test.txt:

# cat json_test.txt
{"name":"WuDi",
"location":
{"street":"ZhongShanLu","city":"BeiJing","age":"26","country":"CN"},
"employees":[{"name":"Mark","division":"DevOps"},
{"name":"Lucy","division":"HR"},
{"name":"Elise","division":"Marketing"}
]}

上面的 JSON 是 PHP json_encode 之后 echo 出来的字符串,很明显,可读性太差。前一阵子写文档,需要将前后端的 JSON 写入文档,我当时用的是网上的 JSON 格式化工具。事实上,jq 就可以检查 JSON 的合法性,并把 JSON 格式化成更友好更可读的格式:

# cat json_test.txt | jq '.'
{
  "name": "WuDi",
  "location": {
    "street": "ZhongShanLu",
    "city": "BeiJing",
    "age": "26",
    "country": "CN"
  },
  "employees": [
    {
      "name": "Mark",
      "division": "DevOps"
    },
    {
      "name": "Lucy",
      "division": "HR"
    },
    {
      "name": "Elise",
      "division": "Marketing"
    }
  ]
}

如上所示,jq 将一团乱麻的 JSON 格式化成了更可读的形式,背后其实还检查了 JSON 的合法性:如果 JSON 不合法,jq . 会报错。

2. JSON 解析

对于如下形式的 JSON:

{
  "key_1": "value_1",
  "key_2": "value_2"
}

如何根据 key 获取 value?

jq '.key'

解析不存在的元素,会返回 null。

3. JSON 嵌套解析

[root@workingh ~]# cat json_test.txt | jq '.location.city'
"BeiJing"

4. JSON 数组解析

[root@workingh ~]# cat json_test.txt | jq '.employees[1].name'
"Lucy"

5. 内建函数

jq 还有一些内建函数,如 keys 和 has。

keys 是用来获取 JSON 中的 key 元素的:

[root@workingh ~]# cat json_test.txt | jq 'keys'
[
  "employees",
  "location",
  "name"
]

has 是用来判断是否存在某个 key 的:

[root@workingh ~]# cat json_test.txt | jq 'has("location")'
true
[root@workingh ~]# cat json_test.txt | jq 'has("xxoo")'
false

三、小结

与 JSON 相关的内容就暂时介绍到这里。希望进一步了解 jq 并使用的,可以去 http://stedolan.github.io/jq/manual/ ;希望了解源码实现的,可以去 https://github.com/stedolan/jq ——意料之中的事情是,作者用了 flex 和 bison 来 parse JSON。另外用 Google 搜索时,kernalpanic 中有一篇文章介绍了 jshon 和 json.sh,提供了另外的思路。

参考资料:


   转载规则


《jq:命令行 JSON 处理神器》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
nc(netcat)使用指南(上) nc(netcat)使用指南(上)
nc 即 netcat 命令,这个工具在排查网络故障时非常有用,功能非常强大,因而被业界称为网络界的”瑞士军刀”,请读者务必掌握。默认系统是没有这个命令的,你需要先安装一下。 nc 命令常见的用法是模拟一个服务器程序被其他客户端连接,或者模
2021-01-10
下一篇 
curl 命令详解与常用示例 curl 命令详解与常用示例
在 Linux 中,curl 是一个利用 URL 规则在命令行下工作的文件传输工具,可以说是一款非常强大的 HTTP 命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称 curl 为下载工具。本文先介绍 curl 的常见参
2020-12-27
  目录