这个快速参考备忘单提供了使用 jq 命令的各种方法。

入门

介绍

jq 就像用于 JSON 数据的 sed - 您可以使用它来切片、过滤、映射和转换结构化数据

安装

1
2
3
4
5
6
$ sudo apt-get install jq # Debian& Ubuntu
$ sudo dnf install jq # Fedora
$ sudo zypper install jq # openSUSE
$ sudo pacman -S jq # Arch
$ brew install jq # macOS & Homebrew
$ port install jq # macOS & MacPorts

语法

1
2
3
$ 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
$ echo '{"foo": 42, "bar": "less interesting data"}' | jq '.foo'

输出结果

1
42

数组运算

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

输出结果

1
2
3
4
{
"name": "XML",
"good": false
}

构造一个数组/对象

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

输出结果

1
2
3
4
5
6
7
8
{
"user": "stedolan",
"title": "JQ Primer"
}
{
"user": "stedolan",
"title": "More JQ"
}

计算一个值的长度

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

输出结果

1
2
3
4
2
6
1
0

取出数组中的键

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

输出结果

1
2
3
4
5
[
"Foo",
"abc",
"abcd"
]

使用多个过滤器

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

输出结果

1
2
42
"something else"

管道传递给下一个过滤器

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

输出结果

1
2
"JSON"
"XML"

条件语句判断

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

输出结果

1
2
3
4
5
[
5,
3,
7
]

每个输入调用过滤器

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

输出结果

1
2
3
4
5
[
2,
3,
4
]

条件判断

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

输出结果

1
"many"

字符串插入值并进行运算

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

输出结果

1
"The input was 42, which is one less than 43"

字符串转 JSON 数组

1
$ echo 'a b c d' | jq -R 'split(" ")'

输出结果

1
2
3
4
5
6
[
"a",
"b",
"c",
"d"
]

更改发布注册表

1
echo "$(jq '.publishConfig.registry = "https://npm.pkg.github.com"' package.json)" > package.json

将组织范围添加到包名称

1
echo "$(jq '.name = "@scope/package"' package.json)" > package.json

另见


评论
avatar
竹山一叶
技术分享 个人心得
Follow Me
公告
欢迎光临小站,这里是我日常工作和学习中收集和整理的总结,希望能对你有所帮助:)

本站的内容经过个人加工总结而来,也参考了网友们分享的资料,如有侵权,请第一时间联系我,我将及时进行修改或删除😊
文章归档文章分类文章标签复制本文标题复制本文地址
随便逛逛