📜  jq 备忘单 - Javascript (1)

📅  最后修改于: 2023-12-03 15:16:41.107000             🧑  作者: Mango

jq备忘单 - JavaScript

简介

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-elsewhile-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 的常用用法和技巧,希望对程序员有所帮助。