功能说明:jq是一个用于处理JSON数据的命令行工具,可以解析、筛选、格式化JSON数据。与sed、awk工具类似,jq在处理JSON数据方面非常强大。
语 法:
jq [options] <jq filter> [file…]
jq [options] –args <jq filter> [strings…]
jq [options] –jsonargs <jq filter> [JSON_TEXTS…]
补充说明:jq是一个处理 JSON 输入的工具,应用给定的过滤器到其 JSON 文本输入,并将过滤器的结果作为 JSON 输出到标准输出。最简单的过滤器是.符号,它将jq的输入原封不动地复制到输出(除了格式化,注意内部使用 IEEE754 进行数字表示)。有关更高级的过滤器,请参见jq(1)手册页(“man jq”)和/或 https://stedolan.github.io/jq。
选 项:
-c 压缩输出,去除空白和换行符,以便生成紧凑的 JSON 格式,而非美化格式
-r 以原始格式输出,不加引号,通常用于输出字符串值
-R 读取原始字符串,而非 JSON 文本
-s 将所有输入的 JSON 对象合并为一个数组
-n 使用 `null` 作为唯一输入值。也就是不读取输入,通常与其他表达式结合使用,可以用于生成新的 JSON 对象
-e 根据输出设置退出状态码
-S 对输出的对象按键进行排序
-C 为 JSON 上色。jq默认会为输出的JSON数据上色
-M 单色(不为 JSON 上色)
–tab 使用制表符进行缩进
–arg a v 将变量 $a 设置为值<v>
–argjson a v 将shell变量 $a 设置为 JSON 值 <v>
–slurpfile a f 将shell变量 $a 设置为从 <f> 文件读取的 JSON 文本数组
–rawfile a f 将shell变量 $a 设置为由 <f> 文件的内容组成的字符串
–args 剩余参数是字符串参数,而非文件
–jsonargs 剩余参数是 JSON 参数,而非文件
— 终止参数处理
其中,命名参数也可以作为 $ARGS.named[] 使用,而位置参数可以作为 $ARGS.positional[] 使用。
参 数:
file… 一个或多个文件
strings… 一个或多个字符串
JSON_TEXTS… 一个或多个JSON字符串
过 滤 器:
. 表示当前输入的 JSON 对象,可以用来访问字段
[] 用于访问数组中的元素
| 用于将前一个表达式的输出作为下一个表达式的输入
{} 用于创建新的 JSON 对象
[] | .field 用于遍历数组并提取特定字段
运算符和内建函数:
+,-
*,/,%
>, >=, <=, <
and, or, not
==,!=
in
abs
length
utf8bytelength
has(key)
map(f), map_values(f)
path(path_expression)
del(path_expression)
select(boolean_expression)
add
any
all
bsearch(x)
repeat(exp)
while(cond; update)
indices(s)
index(s), rindex(s)
contains(element)
unique, unique_by(path_exp)
min, max, min_by(path_exp), max_by(path_exp)
flatten, flatten(depth)
字符串相关函数
join(str)
split(str)
implode
explode
rtrimstr(str)
ltrimstr(str)
endswith(str)
startswith(str)
reverse
正则表达式相关函数
test(val), test(regex; flags)
match(val), match(regex; flags)
capture(val), capture(regex; flags)
sub(regex; tostring), sub(regex; tostring; flags)
splits(regex), splits(regex; flags)
split(regex; flags)
scan(regex), scan(regex; flags)
gsub(regex; tostring), gsub(regex; tostring; flags)
数学相关函数
sqrt
range(upto), range(from; upto), range(from; upto; by)
floor
更多参考官方文档https://jqlang.github.io/jq/manual/#builtin-operators-and-functions
流程控制语句:
if A then B else C end
try-catch
break
实 例:
1 简单的实例
压缩输出,去除空白和换行符,以便生成紧凑的 JSON 格式:
echo ‘{“name”: “Alice”, “age”: 30}’ | jq -c .
输出:{“name”:”Alice”,”age”:30}
以原始格式输出,不加引号,通常用于输出字符串值:
echo ‘{“name”: “Alice”, “age”: 30}’ | jq -r .name
输出:Alice
将所有输入的 JSON 对象合并为一个数组:
$ echo ‘{“name”: “Alice”, “age”: 30}{“name”: “Bob”, “age”: 25}{“name”: “Charlie”, “age”: 35}’ | jq -s .
输出:
[
{
“name”: “Alice”,
“age”: 30
},
{
“name”: “Bob”,
“age”: 25
},
{
“name”: “Charlie”,
“age”: 35
}
]
将 shell 变量传递给 jq 作为变量
name=”Alice”
echo ‘{}’ | jq –arg name “$name” ‘{name: $name}’
输出:{“name”:”Alice”}
2 过滤器实例
[] 用于访问JSON数组中的元素
echo ‘[{“name”: “Alice”}, {“name”: “Bob”}, {“name”: “Charlie”}]’ | jq ‘.[1]’
输出:
{
“name”: “Bob”
}
在这个例子中,.[1] 访问数组中的第二个元素(索引从0开始)。
{}用于创建新的JSON对象,可以根据需要定义键值对
jq -n ‘{name: “Alice”, age: 30}’
输出:
{
“name”: “Alice”,
“age”: 30
}
这里使用 -n 选项表示不读取输入,而是直接创建一个新的 JSON 对象。
[] | .field用于遍历一个数组并提取每个对象中的特定字段
echo ‘[{“name”: “Alice”}, {“name”: “Bob”}, {“name”: “Charlie”}]’ | jq ‘.[].name’
输出:
“Alice”
“Bob”
“Charlie”
在这个例子中,[].name 遍历数组中的每个对象,提取 name 字段的值。
3 运算符、流程控制语句和内置函数实例
echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’ | jq ‘map(if .name==”Alice” then “yes” else “no” end)’
输出:
[
“yes”,
“no”,
“no”
]
4 jq脚本实例
你可以将复杂的 jq 脚本写入一个 .jq 文件,然后在命令行中引用该文件。步骤如下。首先,创建一个名为 script.jq 的文件,并将你的 jq 脚本写入其中:
# script.jq
map(select(.age > 28) | {name: .name, status: (if .age < 35 then “年轻” else “成熟” end)})
然后在命令行中使用 jq 运行这个脚本:
echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’ | jq -f script.jq
输出:
[
{
“name”: “Alice”,
“status”: “年轻”
},
{
“name”: “Charlie”,
“status”: “成熟”
}
]
也可以把JSON数据放到一个文件中,再运行jq脚本来过滤它,例如:
$ echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’>input.json
$ jq -f script.jq input.json
输出:
[
{
“name”: “Alice”,
“status”: “年轻”
},
{
“name”: “Charlie”,
“status”: “成熟”
}
]