在处理 JSON 数据时,我们经常需要在命令行中进行过滤、查询和编辑的操作。jq 是一个强大的命令行 JSON 处理工具,它可以让我们轻松地对 JSON 数据进行各种操作。本文将简要介绍 jq 的基本概念和常用功能,并提供一些实际的例子。

一、jq 简介

jq 是一个轻量级且灵活的命令行 JSON 处理器。它允许你基于键、值和数组索引来提取、过滤和修改 JSON 数据。jq 主要有以下特性:

  1. 基于流式处理,适用于大型 JSON 数据文件。
  2. 提供了丰富的操作符和函数,与 Unix 的管道(pipe)和 I/O 重定向兼容。
  3. 支持条件过滤、字符串操作、数学运算和自定义函数等高级功能。

二、安装 jq

在大多数 Linux 发行版上,可以通过包管理器轻松安装 jq:

  • 在基于 Debian 的发行版上:
    sudo apt-get install jq
  • 在基于 RHEL 的发行版上:
    sudo yum install jq
  • 在 Arch Linux 上:
    sudo pacman -S jq
  • 在 macOS 上,可以使用 Homebrew 安装:
    brew install jq

三、常用 jq 用法

以下是 jq 的一些常见用法。

1. 读取属性值

要从输入的 JSON 对象中提取属性值,可以使用. 操作符。

举例:有一个名为 sample.json 的文件,内容如下:

{
"name": "Alice",
"age": 30,
"city": "New York"
}

提取名字:

cat sample.json | jq '.name'

输出结果:

"Alice"

2. 过滤数组元素(列表中嵌套字典)

要对数组元素进行过滤,可以使用 [] 操作符。

举例:有一个名为 students.json 的文件,内容如下:

[
{
"name": "Alice",
"age": 30,
"city": "New York"
},
{
"name": "Bob",
"age": 25,
"city": "San Francisco"
},
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles"
}
]

提取所有名字:

cat students.json | jq '.[].name'

输出结果:

"Alice"
"Bob"
"Charlie"

3. 选择特定数组元素

如果要返回具有某些属性的特定元素,则可以使用选择器。例如,要选择年龄超过 25 岁的学生:

cat students.json | jq '.[] | select(.age > 25)'

输出结果:

{
"name": "Alice",
"age": 30,
"city": "New York"
}
[root@mcw02 machangwei]# cat mcwstudents.json | jq '.[]'
{
"name": "Alice",
"age": 30,
"city": "New York"
}
{
"name": "Bob",
"age": 25,
"city": "San Francisco"
}
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles"
}
[root@mcw02 machangwei]# cat mcwstudents.json | jq '.[0]'
{
"name": "Alice",
"age": 30,
"city": "New York"
}
[root@mcw02 machangwei]# cat mcwstudents.json | jq '.[] | select(.age > 25) '
{
"name": "Alice",
"age": 30,
"city": "New York"
}
[root@mcw02 machangwei]#

4. 排序和唯一化数组

可以使用 sort,sort_by() 和 unique 函数对数组进行操作。

例如,对来自 sample-array.json 文件的年龄进行排序和去重:

[30, 20, 25, 30, 25, 20]

排序且去重:

cat sample-array.json | jq 'unique | sort'

输出结果:

[
20,
25,
30
]

[root@mcw02 machangwei]# vim sample-array.json
[root@mcw02 machangwei]# cat sample-array.json
[30, 20, 25, 30, 25, 20]
[root@mcw02 machangwei]# cat sample-array.json| jq 'unique'
[
20,
25,
30
]
[root@mcw02 machangwei]# cat sample-array.json| jq 'unique|sort'
[
20,
25,
30
]
[root@mcw02 machangwei]#
 

5. 修改数据

除了筛选和查询,jq 还支持创建和修改数据。例如,为 students.json 中的每个学生添加 “isActive” 属性:

cat students.json | jq '.[] | {name, age, city, isActive: true}'

输出结果:

{
"name": "Alice",
"age": 30,
"city": "New York",
"isActive": true
}
{
"name": "Bob",
"age": 25,
"city": "San Francisco",
"isActive": true
}
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles",
"isActive": true
}

可以添加键值对,但只是显示发生改变,并没有修改掉文件内容

[root@mcw02 machangwei]# cat mcwstudents.json
[
{
"name": "Alice",
"age": 30,
"city": "New York"
},
{
"name": "Bob",
"age": 25,
"city": "San Francisco"
},
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles"
}
]
[root@mcw02 machangwei]# cat mcwstudents.json |jq '.[]'
{
"name": "Alice",
"age": 30,
"city": "New York"
}
{
"name": "Bob",
"age": 25,
"city": "San Francisco"
}
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles"
}
[root@mcw02 machangwei]#
[root@mcw02 machangwei]# cat mcwstudents.json |jq '.[]|{name,age,city,isActive:true,shengao:164cm}'
jq: error: syntax error, unexpected IDENT, expecting '}' (Unix shell quoting issues?) at <top-level>, line 1:
.[]|{name,age,city,isActive:true,shengao:164cm}
jq: 1 compile error
[root@mcw02 machangwei]# cat mcwstudents.json |jq '.[]|{name,age,city,isActive:true,shengao:"164cm"}'
{
"name": "Alice",
"age": 30,
"city": "New York",
"isActive": true,
"shengao": "164cm"
}
{
"name": "Bob",
"age": 25,
"city": "San Francisco",
"isActive": true,
"shengao": "164cm"
}
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles",
"isActive": true,
"shengao": "164cm"
}
[root@mcw02 machangwei]# cata mcwstudents.json
-bash: cata: command not found
[root@mcw02 machangwei]# cat mcwstudents.json
[
{
"name": "Alice",
"age": 30,
"city": "New York"
},
{
"name": "Bob",
"age": 25,
"city": "San Francisco"
},
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles"
}
]
[root@mcw02 machangwei]#

如下,写上哪个键,就会显示哪个键的。如果不存在的键,需要写上值;如果已经存在的键,不需要写值,默认是文件里的值;如果已经存在的键,又写上值,那么就会替换为修改的值。上面操作不会改变原文件。不过想要这个结果,可以追加到新的文件中。

[root@mcw02 machangwei]# cat mcwstudents.json
[
{
"name": "Alice",
"age": 30,
"city": "New York"
},
{
"name": "Bob",
"age": 25,
"city": "San Francisco"
},
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles"
}
]
[root@mcw02 machangwei]#
[root@mcw02 machangwei]# cat mcwstudents.json |jq '.[]|{name,age:18,shengao:"164cm"}'
{
"name": "Alice",
"age": 18,
"shengao": "164cm"
}
{
"name": "Bob",
"age": 18,
"shengao": "164cm"
}
{
"name": "Charlie",
"age": 18,
"shengao": "164cm"
}
[root@mcw02 machangwei]# cat mcwstudents.json
[
{
"name": "Alice",
"age": 30,
"city": "New York"
},
{
"name": "Bob",
"age": 25,
"city": "San Francisco"
},
{
"name": "Charlie",
"age": 23,
"city": "Los Angeles"
}
]
[root@mcw02 machangwei]#

6、字典嵌套列表嵌套字典

[root@mcw02 machangwei]# vim xiaoma.json
[root@mcw02 machangwei]# cat xiaoma.json
{
"data": [
{
"appid": "222",
"companyId": 1,
"projectId": 93,
"projectName": "Cloak Private Browser(H5)",
"projectType": 0,
"remark": "",
"roleName": "root"
},
{
"appid": "111",
"companyId": 1,
"projectId": 95,
"projectName": "tyj_test",
"projectType": 0,
"remark": "",
"roleName": "root"
}
],
"return_code": 0,
"return_message": "success",
"showStackMessage": false
} [root@mcw02 machangwei]# cat xiaoma.json |jq '.data[0]'
{
"appid": "222",
"companyId": 1,
"projectId": 93,
"projectName": "Cloak Private Browser(H5)",
"projectType": 0,
"remark": "",
"roleName": "root"
}
[root@mcw02 machangwei]# cat xiaoma.json |jq '.data[0].appid'
"222"
[root@mcw02 machangwei]#

四、总结

jq 是个非常强大的命令行 JSON 处理工具,支持各种数据操作功能,能够帮助你在处理 JSON 数据时更加便捷和高效。本文列举了一些常用的 jq 使用案例,但 jq 的功能远不止于此。更多丰富的功能可以在官方文档(点击查看)中找到。 熟练掌握 jq 有助于提高命令行处理 JSON 数据的能力,为其它处理和分析工具提供更方便的数据源。

来源:https://zhuanlan.zhihu.com/p/661537804

jq 工具及其常用用法的更多相关文章

  1. web报表工具FineReport常用函数的用法总结(日期和时间函数)

    web报表工具FineReport常用函数的用法总结(日期和时间函数) 说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd.而且必须用英文环境下双引号(" " ...

  2. MySQL的mysqldump工具的基本用法

    导出要用到MySQL的mysqldump工具,基本用法是:    shell> mysqldump [OPTIONS] database [tables]    如果你不给定任何表,整个数据库将 ...

  3. linux 系统监控、诊断工具之 lsof 用法简介

    1.lsof 简介 lsof 是 Linux 下的一个非常实用的系统级的监控.诊断工具. 它的意思是 List Open Files,很容易你就记住了它是 "ls + of"的组合 ...

  4. grep知识及常用用法梳理

    1. grep语法及其参数说明 grep是文本搜索工具,能根据用户指定的'PATTERN模式'目标文本进行逐行匹配检查,注意grep默认会以 行 为单位打印匹配到的行. 以下是grep命令的语法及常用 ...

  5. centos的vi常用用法

    centos的vi常用用法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...

  6. MySql与SqlServer的一些常用用法的差别

    MySql与SqlServer的一些常用用法的差别 本文为转载 本文将主要列出MySql与SqlServer不同的地方,且以常用的存储过程的相关内容为主. 1. 标识符限定符 SqlServer [] ...

  7. [转]ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

  8. 【三支火把】---一份程序看懂C程序printf()的几种常用用法

    闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...

  9. grep参数说明及常用用法

    grep参数说明及常用用法 趁着午休的时间把自己经常使用的一些grep命令整理一下. 方便以后查看. 后续会逐步把awk/sed/find等常用的命令理一理. 增强下记忆. 也算是对得起自己了. ^^ ...

  10. ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

随机推荐

  1. 网络协议之:memcached text protocol详解

    目录 简介 memcached protocol介绍 memcached支持的命令 存储命令 读取命令 常用的其他命令 memcached服务器的返回值 支持UDP协议 总结 简介 用过缓存系统的肯定 ...

  2. 带你玩转OpenHarmony AI:基于Seetaface2的人脸识别

    简介 随着时代的进步,全民刷脸已经成为一种新型的生活方式,这也是全球科技进步的又一阶梯,人脸识别技术已经成为一种大趋势,无论在智慧出行.智能家居.智慧办公等场景均有较广泛的应用场景,本文介绍了基于Se ...

  3. 比nestjs更优雅的ioc:跨模块访问资源

    使用ts的最佳境界:化类型于无形 在项目中使用ts可以带来类型智能提示与校验的诸多好处.同时,为了减少类型标注,达到化类型于无形的效果,CabloyJS引入了ioc和依赖查找的机制.在上一篇文章中,我 ...

  4. 数据结构实验代码分享 - 5 (HashTable - 链接法)

    题目:通信录查询系统(查找应用) [问题描述] 设计散列表(哈希表)实现通讯录查找系统. (1) 设每个记录有下列数据项:电话号码.用户名.地址: (2) 从键盘输入各记录,分别以电话号码为关键字建立 ...

  5. SKG 渠道中台借助 SAE + 大禹打造云原生 DevOPS,提效 60%

    简介: 新零售标杆 SKG 全面拥抱 Serverless,敏捷交付! 作者:陈列昂(SKG).昕辰.龙琛.黛忻 项目背景 未来穿戴健康科技股份有限公司(SKG)是一家专注为个人与家庭提供智能可穿戴健 ...

  6. 直播回顾 | 云原生混部系统 Koordinator 架构详解(附完整PPT)

    简介: 近期,来自 Koordinator 社区的两位技术专家从项目的架构和特性出发,分享了 Koordinator 是如何应对混部场景下的挑战,特别是提升混部场景下工作负载的运行的效率和稳定性,以及 ...

  7. 阿里云边缘云全新架构升级,助力CDN操控新体验

    ​简介: 本次升级根据上万企业客户的使用反馈和行业应用特征,从简单开通到个性化定制,从内容分发到边缘计算完整解决方案,对客户侧的使用体验进行了全局梳理和全链路优化,推进边缘云CDN操控革新,并逐步构建 ...

  8. 2018-8-10-C#-字符串首字符大写

    title author date CreateTime categories C# 字符串首字符大写 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:2 ...

  9. mosquitto的安装与使用

      一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机.嵌入式 ...

  10. 电路笔记03—kcl、kvl,独立源,受控源

    电路笔记03-kcl.kvl,独立源,受控源 听起来简单,做起来需要思考.所以做作业,思考很有 必要.电路的功率守恒,4种受控源,用两类约束列方程.电路分析力最难的一部分,怎么把一个量用其它量表示,后 ...