跳转至

jq 命令学习

一个灵活的轻量级命令行JSON处理器

补充说明

jq 是 stedolan 开发的一个轻量级的和灵活的命令行JSON处理器,源码请参考 jq 项目主页

jq 用于处理JSON输入,将给定过滤器应用于其JSON文本输入并在标准输出上将过滤器的结果生成为JSON。

最简单的过滤器是.,它将jq的输入未经修改地复制到其输出中(格式设置除外)。

请注意,jq 当前仅支持64位双精度浮点数(IEEE754)。

安装

dnf 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               将所有输入读取(吸取)到数组中;应用过滤器;
-r               输出原始字符串,而不是JSON文本;
-R               读取原始字符串,而不是JSON文本;
-C               为JSON着色;
-M               单色(不要为JSON着色);
-S               在输出上排序对象的键;
--tab            使用制表符进行缩进;
--arg a v        将变量$a设置为value<v>;
--argjson a v    将变量$a设置为JSON value<v>;
--slurpfile a f  将变量$a设置为从<f>读取的JSON文本数组;
--rawfile a f    将变量$a设置为包含<f>内容的字符串;
--args           其余参数是字符串参数,而不是文件;
--jsonargs       其余的参数是JSON参数,而不是文件;
--               终止参数处理;

例子

1、 以漂亮的格式输出 .

[root@cmzhu cmzhu]# echo '{"foo":{"jqa":1}}' | jq '.'
{
  "foo": {
    "jqa": 1
  }
}
[root@cmzhu cmzhu]#

2、 获取某一个键的值

[root@cmzhu cmzhu]# echo '{"foo":{"jqa":1}}' | jq '.foo'
{
  "jqa": 1
}
[root@cmzhu cmzhu]#

3、 .foo, .foo.bar, .foo?: 获取一个键的值

[cmzhu@cmzhu ~]$ echo '{"foo": 42, "bar": "less interesting data"}' | jq '.foo'
42
[cmzhu@cmzhu ~]$

4、.[], .[]?, .[2], .[10:15]: 数组运算

[cmzhu@cmzhu ~]$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[1]'
{
  "name": "XML",
  "good": false
}
[cmzhu@cmzhu ~]$
[cmzhu@cmzhu ~]$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[]'
{
  "name": "JSON",
  "good": true
}
{
  "name": "XML",
  "good": false
}
[cmzhu@cmzhu ~]$
[cmzhu@cmzhu ~]$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[]?'
{
  "name": "JSON",
  "good": true
}
{
  "name": "XML",
  "good": false
}
[cmzhu@cmzhu ~]$

5、 [],{}构建一个数组对象

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

6、 length: 计算一个值的长度

[cmzhu@cmzhu ~]$ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' | jq '.titles | length'
2
[cmzhu@cmzhu ~]$
[cmzhu@cmzhu ~]$ echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length'
2
6
1
0
[cmzhu@cmzhu ~]$

7、keys: 取出数组中的键

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

8、 , 使用多个过滤器

[cmzhu@cmzhu ~]$ echo '{ "foo": 42, "bar": "something else", "baz": true}' | jq '.foo, .bar'
42
"something else"
[cmzhu@cmzhu ~]$

9、 通过管道将上一个过滤器的输出当作下一个过滤器的输入

[cmzhu@cmzhu ~]$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[] | .name'
"JSON"
"XML"
[cmzhu@cmzhu ~]$
[cmzhu@cmzhu ~]$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[]' |jq '.name'
"JSON"
"XML"
[cmzhu@cmzhu ~]$

10、 select(foo): 如果foo返回true,则输入保持不变

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

11、 map(foo): 每个输入调用过滤器

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

12、 if-then-else-end: 条件判断

[cmzhu@cmzhu ~]$ echo '2' | jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end'
"many"
[cmzhu@cmzhu ~]$
[cmzhu@cmzhu ~]$ echo '1' | jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end'
"one"
[cmzhu@cmzhu ~]$

13、\(foo): 在字符串中插入值并进行运算

[cmzhu@cmzhu ~]$ echo '42' | jq '"The input was \(.), which is one less than \(.+1)"'
"The input was 42, which is one less than 43"
[cmzhu@cmzhu ~]$
[cmzhu@cmzhu ~]$ echo '{"age":42, "agenext":55}' | jq '"The input was \(.age), which is one less than \(.agenext)"'
"The input was 42, which is one less than 55"
[cmzhu@cmzhu ~]$