目录
- 引言
- 基础
- 参数[options]
- 过滤器<jq filter>
- 链接符
- 对象操作
- 数组操作
- 数组/对象
- 与shell结合的常见操作
- 总结
引言
jq是一个灵活的轻量级命令行JSON处理器,你可以使用jq命令对JSON进行过滤、遍历或者结构转换等操作
项目主页位于:
https://stedolan.github.io/jq/
你也可以在线体验:
https://jqplay.org/
官方文档参考:
https://stedolan.github.io/jq/manual/#Basicfilters
下面来让我们快速入门一下吧
基础
$ jq -h
jq – commandline JSON processor [version 1.6]
Usage: jq [options] <jq filter> [file…]
jq [options] –args <jq filter> [strings…]
jq [options] –jsonargs <jq filter> [JSON_TEXTS…]
常见的用法是jq [options] <jq filter> [file…],例如
$ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo\’
{
\”bar\”: {
\”baz\”: 123
}
}
$ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq -c \’.foo.bar\’
{\”baz\”:123}
其中-c为options,'.foo'即为filter,两者都会在下文介绍
参数[options]
🌲-r output raw strings, not JSON texts
字符串默认带引号,使用-r可以移除字符串的引号
$ echo \'{\”foo\”: \”bar\”}\’ | jq \’.foo\’
\”bar\”
$ echo \'{\”foo\”: \”bar\”}\’ | jq -r \’.foo\’
bar
🌲-c compact instead of pretty-printed output
jq默认输出格式化之后的json,如果希望能在一行输出使用-c
$ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo | .bar\’
{
\”baz\”: 123
}
$ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq -c \’.foo | .bar\’
{\”baz\”:123}
过滤器<jq filter>
🌲. 输出原始的 JSON 数据
因为jq默认是格式化的,所以这个filter可以当作格式化
$ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.\’
{
\”foo\”: {
\”bar\”: {
\”baz\”: 123
}
}
}
链接符
先看下连接符,具体filter的含义下面会介绍。两个连接符都是用来组合不同filter来完成特定功能的
🌲, 使用多个 filter
需要注意的是使用,每一个filter产生的输出都是一行
$ echo \'{\”user\”:\”stedolan\”, \”projects\”: [\”jq\”, \”wikiflow\”]}\’ | jq \’.user, .projects[]\’
\”stedolan\”
\”jq\”
\”wikiflow\”
🌲| 管道
jq '.a.b.c'、jq '.a | .b | .c'jq '.a' | jq '.b' | jq '.c'是一样的
如果第一个filter产生多个结果,那么下一个filter会对每一个结果都执行。因此.[] | .foo取出数组中的每一个"foo"
$ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[] | .name\’
\”JSON\”
\”XML\”
对象操作
🌲.foo,.foo.bar 获取对象key的值
'.foo'代表获取foo这个key
'.foo.bar'代表获取foo对象中的bar,它和上文介绍的.foo|.bar相同
$ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo\’
{
\”bar\”: {
\”baz\”: 123
}
}
$ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo.bar\’
{
\”baz\”: 123
}
⚠️ 如果对象的key包含特殊字符或者以数字开头,使用'.foo'会报错。此时需要使用双引号包裹:."foo$"、."1foo"
$ echo \'{ \”1foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.1foo\’
jq: error: syntax error, unexpected IDENT, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.1foo
jq: 1 compile error
$ echo \'{ \”1foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.\”1foo\”\’
{
\”bar\”: {
\”baz\”: 123
}
}
❗️当取值不是对象时jq默认会报错,如果想忽略报错可以使用 .foo?
$ echo \'[1,2,3]\’ | jq \’.foo\’
jq: error (at <stdin>:1): Cannot index array with string \”foo\”
$ echo \'[1,2,3]\’ | jq \’.foo?\’
数组操作
🌲.[2] 数组索引
数组索引也是从0开始,同时支持负数
$ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[0]\’
{
\”name\”: \”JSON\”,
\”good\”: true
}
$ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[-2]\’
{
\”name\”: \”JSON\”,
\”good\”: true
}
🌲.[10:15] 数组切片
.[10:15]包含从从0开始10(含)到15(不含)号元素,如果没有值则默认到头/尾
$ echo \'[\”a\”,\”b\”,\”c\”,\”d\”,\”e\”]\’ | jq \’.[1:3]\’
[
\”b\”,
\”c\”
]
$ echo \'[\”a\”,\”b\”,\”c\”,\”d\”,\”e\”]\’ | jq \’.[1:]\’
[
\”b\”,
\”c\”,
\”d\”,
\”e\”
]
数组/对象
🌲.[] 遍历
对于数组来说,会返回数组中的所有元素
$ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[]\’
{
\”name\”: \”JSON\”,
\”good\”: true
}
{
\”name\”: \”XML\”,
\”good\”: false
}
对于对象来说,会返回对象中的所有值
$ echo \'{\”a\”:1,\”b\”:[1,2]}\’ | jq \’.[]\’
1
[
1,
2
]
结合上文提到管道,可以取出数组中的每一个field
$ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[] | .name\’
\”JSON\”
\”XML\”
与shell结合的常见操作
🌲同时将json中的多个值赋值到多个变量
首先利用,来同时解析多个json字段
其次用echo把多行输出转换成单行输出
最后利用read读取到多个变量里
$ read json xml <<< $(echo $(echo \'{\”foo\”:\”JSON\”,\”bar\”:\”XML\”}\’ | jq -c \’.foo, .bar\’)) && \\
echo \”json:$json,xml:$xml\”
json:\”JSON\”,xml:\”XML\”
🌲把多个json字段输出到一行
上面使用echo是一种方式,还有一种更通用,尤其是处理数组时更方便的方式
利用@tsv处理,注意输入需要是数组
# 不加处理
$ echo \'[{\”name\”:\”JSON\”,\”good\”:true},{\”name\”:\”XML\”,\”good\”:false}]\’ | jq -r \’.[] | .name, .good\’
JSON
true
XML
false
# 利用@tsv处理,注意输入需要是数组
$ echo \'[{\”name\”:\”JSON\”,\”good\”:true},{\”name\”:\”XML\”,\”good\”:false}]\’ | jq -r \’.[] | [.name, .good] | @tsv\’
JSON true
XML false
# 还可以输出csv格式的
$ echo \'[{\”name\”:\”JSON\”,\”good\”:true},{\”name\”:\”XML\”,\”good\”:false}]\’ | jq -r \’.[] | [.name, .good] | @csv\’
\”JSON\”,true
\”XML\”,false
🌲遍历数组
对数组中的每一个元素进行处理
$ echo \'[\”a\”,\”b\”,\”c\”,\”d\”,\”e f\”]\’ | jq -c \’.[]\’ | while read i; do echo \”val=${i}\”; done
val=\”a\”
val=\”b\”
val=\”c\”
val=\”d\”
val=\”e f\”
总结
以上主要介绍了用jq提取jso,更多关于jq命令操作JSON的资料请关注悠久资源网其它相关文章!
您可能感兴趣的文章:
- linux命令下jq的用法及说明
- Linux中shell脚本的jq命令用法详解
- 处理JSON最强命令jq使用场景
- 超级好用的轻量级JSON处理命令jq(最新推荐)