跳到主要内容

Linux jq 命令 - JSON 数据处理器

介绍

jq 是一个轻量级的和灵活的命令行 JSON 处理器,用于解析、查询和转换 JSON 数据。它可以帮助用户在命令行中轻松地处理和操作 JSON 格式的数据。

jq 的一个常见的使用场景是处理 JSON 输入,设置过滤器应用于其 JSON 文本输入,并将过滤器的结果生成为新的 JSON 文本打印到标准输出。最简单的过滤器是 .,它将 jq 的输入未经修改地复制到其输出中(格式设置除外)。

另外,需要注意的是,jq 当前仅支持 64 位双精度浮点数(IEEE754)。

安装

使用前请确保你的系统上已经安装 jq 工具,如果未安装,可以参考下面安装方法:

sudo apt install jq

语法

jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]

选项

  • -c:使用紧凑而不是漂亮的输出。
  • -n:使用 null 作为单个输入值。
  • -e:根据输出设置退出状态代码。
  • -s:将所有输入读取(slurp)到数组中;对其应用过滤器。
  • -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 参数,而不是文件。
  • --:终止参数处理。

示例

以漂亮的方式输出全部 JSON 数据:

$ echo '{ "home": { "bedroom": { "temperature": 25.0 } } }' | jq '.'
{
"home": {
"bedroom": {
"temperature": 25
}
}
}

以紧凑的方式输出全部 JSON 数据:

$ echo '{ "home": { "bedroom": { "temperature": 25.0 } } }' | jq -c '.'
{"home":{"bedroom":{"temperature":25}}}

获取一个键的值(可以试试 .home.home.bedroom.home? 等过滤条件):

$ echo '{ "home": { "bedroom": { "temperature": 25.0 } } }' | jq '.home.bedroom.temperature'
25

数组运算(可以试试 .[].[]?.[2].[0:10] 等过滤条件):

$ echo '[{"name":"bedroom1", "temp":22.0}, {"name":"bedroom2", "temp":28.0}]' | jq '.[1]'
{
"name": "bedroom2",
"temp": 28
}

构造一个数组/对象(通过 [], {}):

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

计算一个值的长度(通过 length):

$ echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length'
2
6
1
0

取出数组中的键(通过 keys):

$ echo '{"abc": 1, "abcd": 2, "Foo": 3}' | jq 'keys'
[
"Foo",
"abc",
"abcd"
]

使用多个过滤器(通过 ,):

$ echo '{ "foo": 42, "bar": "something else", "baz": true}' | jq '.foo, .bar'
42
"something else"

通过管道将一个过滤器的输出当做下一个过滤器的输入(通过 |):

$ echo '[{"name":"bedroom1", "temp":22.0}, {"name":"bedroom2", "temp":28.0}]' | jq '.[] | .name'
"bedroom1"
"bedroom2"

通过 select() 选择器筛选,选出大于等于 3 的值:

$ echo '[1,5,3,2,0,4,7]' | jq 'map(select(. >= 3))'
[
5,
3,
4,
7
]

通过 map() 将每个输入的值加一:

$ echo '[1,2,3]' | jq 'map(.+1)'
[
2,
3,
4
]

条件判断(if-then-else-end):

$ echo '2' | jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end'
"many"

在字符串中插入值并进行运算(通过 \() 表达式):

$ echo '12' | jq '"The input was \(.), which is one less than \(.+1)"'
"The input was 12, which is one less than 13"