📅  最后修改于: 2023-12-03 15:16:41.107000             🧑  作者: Mango
jq
是一款针对 JSON 数据的命令行工具,能够方便快捷地处理和转换 JSON 数据。本篇备忘单汇总了 jq
常用的用法和技巧,方便程序员使用。
在 Linux 和 macOS 平台上,使用包管理工具安装即可:
# Ubuntu/Debian
sudo apt-get install jq
# CentOS/RHEL
sudo yum install jq
# macOS
brew install jq
在 Windows 上,可以从官方网站下载二进制文件进行安装。
jq
的基础用法非常简单,只需要输入待处理的 JSON 数据即可:
# 输出整个 JSON 结构
$ cat data.json | jq
# 选择 JSON 中的某个字段
$ cat data.json | jq '.name'
# 选择数组中的元素
$ cat data.json | jq '.tags[0]'
更复杂的操作可以使用 jq
的高级用法,比如使用过滤器和函数等。
jq
的核心是过滤器,可以通过过滤器选择和转换 JSON 数据。
基本过滤器包括 .
, []
, .
和 |
,可以直接用于选择数据或者进行转换。
# 选择 JSON 中的所有 name 字段
$ cat data.json | jq '.name'
# 选择 JSON 中的所有 tags 字段
$ cat data.json | jq '.tags'
# 选择 JSON 中的数组中的第一个元素
$ cat data.json | jq '.tags[0]'
# 筛选 JSON 中 tags 数组中为 frontend 的元素
$ cat data.json | jq '.tags[] | select(. == "frontend")'
可以通过 ()
和 ,
实现嵌套和组合操作。
# 筛选 JSON 中 tags 数组中为 frontend 和 web 的元素
$ cat data.json | jq '.tags[] | select(. == "frontend" or . == "web")'
# 筛选 JSON 中 age 大于 20 的人
$ cat data.json | jq '.people | map(select(.age > 20))'
# 选择 JSON 中的 name 和 color 字段
$ cat data.json | jq '{ name: .name, color: .color }'
jq
内置了很多函数过滤器,可以进行字符串、数值、日期等类型的转换和处理。
# 转换 JSON 中的数字为字符串
$ cat data.json | jq '.age | tostring'
# 获取 JSON 中的时间戳
$ cat data.json | jq '.timestamp | strptime("%Y-%m-%d %H:%M:%S")'
# 替换 JSON 中的字符串
$ cat data.json | jq '.name | sub("Tom"; "Jerry")'
jq
支持变量和流程控制语句,可以实现复杂的逻辑判断和数据处理。
jq
支持定义变量,并通过 $
符号引用变量值。
# 定义变量
$ jq --arg name "Tom" '$name'
# 组合变量和 JSON 数据
$ jq -n --arg name "Tom" '{ "name": $name }'
jq
支持流程控制语句 if-then-else
和 while-do
,可以实现复杂的逻辑判断和迭代操作。
# 判断 JSON 中的 age 字段是否大于 18
$ cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'
# 循环 JSON 中的数值,求和
$ cat data.json | jq '.numbers | reduce .[] as $num (0; .+$num)'
jq
还有很多高级用法,比如模块化、正则表达式、命令行参数等。
jq
支持模块化语法 import
,可以将常用的代码块封装为单独的函数或者模块,并在其它代码中复用。
# 定义并导入模块
$ cat utils.jq
def today: strftime("%Y-%m-%d");
$ jq -n 'include "utils"; { "today": today }'
jq
支持正则表达式操作,可以轻松地进行字符串匹配和替换操作。
# 匹配 JSON 中的字符串
$ cat data.json | jq '.name | test("^[A-Z]{1}[a-z]+")'
# 替换 JSON 中的特定字符串
$ cat data.json | jq '.name | gsub("Tom"; "Jerry")'
jq
支持 -s
参数,可以一次处理多个 JSON 数据。
# 处理多个 JSON 数据
$ jq -s 'map(.name)' data1.json data2.json
# 从命令行参数中读取 JSON 数据
$ echo '{ "name": "Tom" }' | jq -s '.[] | { "name": .name }'
以上是 jq
的常用用法和技巧,希望对程序员有所帮助。