jq - JSON 数据过滤命令

jq 是一款在命令行中处理 JSON 数据的工具,可以读取标准输入、管道或文件中的 JSON 数据,并通过过滤器和表达式输出需要的结果。

安装

安装方式可参考 jq 官方下载页

CentOS / RHEL 系

yum install -y epel-release
yum install -y jq

Ubuntu / Debian 系

apt update
apt install -y jq

常用选项

-c 紧凑输出
-n 使用 null 作为单个输入值
-e 根据输出设置退出状态码
-s 将所有输入读取到数组中,再应用过滤器
-r 输出原始字符串,而不是 JSON 文本
-R 读取原始字符串,而不是 JSON 文本
-C 为 JSON 输出着色
-M 不为 JSON 输出着色
-S 按键名排序对象
--tab 使用制表符缩进
--arg a v 将变量 $a 设置为字符串 v
--argjson a v 将变量 $a 设置为 JSON 值 v
--slurpfile a f 将变量 $a 设置为从文件 f 读取的 JSON 文本数组
--rawfile a f 将变量 $a 设置为文件 f 的原始内容
--args 将其余参数作为字符串参数
--jsonargs 将其余参数作为 JSON 参数
-- 终止参数处理

使用示例

echo '{"name":"voidking"}' | jq .
echo '{"name":"voidking"}' | jq .name
echo '{"name":"voidking"}' | jq -r .name
 
echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq .name.firstname
echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq -r .name.firstname
echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq '.name | .firstname'
echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq '.name | .firstname,.lastname'
 
echo '[{"firstname":"Void","lastname":"King"},{"firstname":"Hao","lastname":"Jin"}]' |
  jq '.[] | .firstname,.lastname'
 
echo '[{"firstname":"Void","lastname":"King"},{"firstname":"Hao","lastname":"Jin"}]' | jq .
echo '[{"firstname":"Void","lastname":"King"},{"firstname":"Hao","lastname":"Jin"}]' | jq -c .

数组过滤

.[].[]?.[2].[10:15] 可用于处理数组。

echo '[{"name":"JSON","good":true},{"name":"XML","good":false}]' | jq '.[1]'

输出:

{
  "name": "XML",
  "good": false
}

构造对象

echo '{"user":"stedolan","titles":["JQ Primer","More JQ"]}' |
  jq '{user, title: .titles[]}'

输出:

{
  "user": "stedolan",
  "title": "JQ Primer"
}
{
  "user": "stedolan",
  "title": "More JQ"
}

参考资料