与我联系:
微信公众号:数据库杂记 个人微信: iiihero
我是iihero. 也可以叫我Sean.
iihero@****(https://blog.****.net/iihero)
Sean@墨天轮 (https://www.modb.pro/u/16258)
数据库领域的资深爱好者一枚。
水木早期数据库论坛发起人 db2@smth就是俺,早期多年水木论坛数据库版版主。
国内最早一批DB2 DBA。前后对Sybase ASE及SQLAnywhere, PostgreSQL,
HANA, Oracle, DB2, SQLite均有涉猎。曾长期担任****相关数据库版版主。
SAP数据库技术专家与开发架构师,PostgreSQL ACE.
代表作有:<<Java2网络协议内幕>> <<Oracle Spatial及OCI高级编程>>
<<Sybase ASE 15.X全程实践>>
兴趣领域:数据库技术及云计算、GenAI
业余专长爱好:中国武术六段 陈式太极拳第13代传人(北京陈式太极拳第5代传人)
职业太极拳教练,兼任北京陈式太极拳研究会副秘书长。
如果想通过习练陈式太极拳强身健体,也可以与我联系。
前言:
我们在各种生产环境或者开发测试环境中,一定遇到有很多信息都是使用JSON串或者文本文件作为输入的。在没有JQ命令行工具之前,我们要从中获取真正的输入,大都把它复制到文本里头,然后使用文本编辑器进行加工整理。
比如,提取用户名(username)、密码(password)、连接的url、证书(certificate)等。
一个典型的连接信息如下:
{
"clientid": "sb-aaaabbbbbbb",
"clientsecret": "ZfWzDxxxxxxxxxxxcxxxxxxxx0xc=",
"url": "https://m.authentication.s.cccnd.com",
"identityzone": "m2222222",
"identityzoneid": "m2222222",
"tenantid": "m2222222",
"tenantmode": "dedicated",
"sburl": "https://internal-m.authentication.s.cccnd.com",
"apiurl": "https://api.m.authentication.s.cccnd.com",
"verificationkey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW\n2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyM\nziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD\n/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU\n4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8\nAr4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV57\n7wIDAQAB\n-----END PUBLIC KEY-----",
"xsappname": "xsuaa-m",
"subaccountid": "m2222222",
"uaadomain": "m.authentication.s.cccnd.com",
"zoneid": "m2222222",
"credential-type": "instance-secret",
"trustedclientidsuffix": "|m2222222!b73"
}
上边的信息已经做过脱敏处理。
我们使用jq就可以快速得到相关项的值。
使用示例
就以上边的输入为例,假设上述内容对应的文件名为:demo.json, 我们很快就能得到 clientid的值:
jq .clientid -r demo.json
sb-aaaabbbbbbb
apiurl:
jq .apiurl -r demo.json
https://api.m.authentication.s.cccnd.com
verificationkey:
jq .verificationkey -r demo.json
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW
2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyM
ziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD
/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU
4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8
Ar4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV57
7wIDAQAB
-----END PUBLIC KEY-----
我们还能看到jq -r能自动去掉值里头的一些回车换行符:"\n"。这就省去了我们用文本编辑器进行相关替换的麻烦。
我们也可以看到不带 -r选项时处理结果的明显不同。这只是一个简单的示例。
基本使用
jq 是 stedolan 开发的一个轻量级的和灵活的命令行 JSON 处理器。它主要用于在命令行界面处理 JSON 输入,并使用给定的过滤条件来过滤符合条件的新的 JSON 串。通常在类 Unix 环境下,我们可以快速的使用 jq
来进行 JSON 数据格式化过滤和处理。
安装过程比较直接明了。
# Ubuntu 系列
$ sudo apt-get install jq
# CentOS 系列
$ yum install jq
1、语法
jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]
# options 可选参数列表和说明
-c 将格式化json输出为紧凑的字符串格式;
-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参数,而不是文件;
-- 终止参数处理;
也可以使用jq --help得到类似的帮助提示。可能让你很吃惊的是,它有一个完整的文档网址:https://jqlang.github.io/jq/manual/
2、基础使用
2.1、简单字段解析
# 使用 . 参数默认格式化整个json数据
echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com"}' | jq .
{
"name": "Bob",
"Id": 123345,
"url": "http://i.bob.com"
}
# 使用.$name得到目标field值
echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com"}' | jq .Id
123345
# 解析嵌套层级数据
jq echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com", "contact": {"tel": "13600000000", "email":"bob@qq.com", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact
{
"tel": "13600000000",
"email": "bob@qq.com",
"wechat": "bob_wechat"
}
# 获取联系方式中的电话
jq echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com", "contact": {"tel": "13600000000", "email":"bob@qq.com", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact.tel
"13600000000"
# 获取多个字段: '.Field1,.Field2,...'
echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com", "contact": {"tel": "13600000000", "email":"bob@qq.com", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq '.contact.tel, .name'
"13600000000"
"Bob"
但是我们要注意一点的是,在shell里头,需要使用quote:
Unix shells: jq '.["foo"]'
Powershell: jq '.[\"foo\"]'
Windows command shell: jq ".[\"foo\"]"
2.2、列表、迭代与管道
给定一个输入文件:demo2.json
{
"Name": "CloudNativeOps",
"Owner": "GoOps",
"WebSite": "https://bgbiao.top/",
"Contact": {
"Email": "weichuangxxb@qq.com",
"QQ": "371990778",
"WeChat": "GoOps"
},
"Skills": [
{
"name": "Python",
"type": "dev"
},
{
"name": "Golang",
"type": "dev"
},
{
"name": "Ansible",
"type": "ops"
},
{
"name": "Kubernetes",
"type": "dev"
},
{
"name": "ElasticSearch",
"type": "ops"
}
]
}
或者用一长串作输入也可:
'{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}'
# 解析数组与列表
jq .Skills demo2.json
[
{
"name": "Python",
"type": "dev"
},
{
"name": "Golang",
"type": "dev"
},
{
"name": "Ansible",
"type": "ops"
},
{
"name": "Kubernetes",
"type": "dev"
},
{
"name": "ElasticSearch",
"type": "ops"
}
]
# 按序号或按范围进行检索:如 '.Skills[1:3]'
echo '[1,2,3]' | jq '.[2]'
3
jq '.Skills[1:3]' demo2.json
[
{
"name": "Golang",
"type": "dev"
},
{
"name": "Ansible",
"type": "ops"
}
]
# 值的迭代器
jq '.Skills[]' demo2.json
{
"name": "Python",
"type": "dev"
}
{
"name": "Golang",
"type": "dev"
}
{
"name": "Ansible",
"type": "ops"
}
{
"name": "Kubernetes",
"type": "dev"
}
{
"name": "ElasticSearch",
"type": "ops"
}
# 过滤器中使用管道, 比如在 .Skills中再对name进行过滤
jq '.Skills[] | .name' demo2.json
"Python"
"Golang"
"Ansible"
"Kubernetes"
"ElasticSearch"
其实,这里,它可以直接取 .name
jq '.Skills[].name' demo2.json
"Python"
"Golang"
"Ansible"
"Kubernetes"
"ElasticSearch"
# 组合不同层级的示例
echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}' | jq '.user, .projects[]'
"stedolan"
"jq"
"wikiflow"
# 简单运算:
echo '{"num": [1,2,3,4]}' | jq '[.num[] | . * 2 ]'
[
2,
4,
6,
8
]
# 求和
echo 1 2 3 | jq -n 'reduce inputs as $i (0; . + $i)'
6
我们再回到最开始的时候,提供的那个输入,我们不想让verificationkey的值被换行,同时还要去掉'\n', 可以用:
jq '.verificationkey' -c demo.json
"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW\n2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyM\nziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD\n/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU\n4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8\nAr4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV57\n7wIDAQAB\n-----END PUBLIC KEY-----"
要再去掉里边的"\n", 直接:
jq '.verificationkey' -c demo.json | sed 's/\\[tn]//g'
"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyMziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8Ar4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV577wIDAQAB-----END PUBLIC KEY-----"
# 去掉首尾的"
jq '.verificationkey' -c demo.json | sed 's/\\[tn]//g; s/"\(.*\)"/\1/'
-----BEGIN PUBLIC KEY-----MIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyMziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8Ar4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV577wIDAQAB-----END PUBLIC KEY-----
总结:
上边所有内容只是很基础的一部分使用。jq功能其实非常强大,如果仔细阅读https://jqlang.github.io/jq/manual/, 你会发现,它基本上已经接近一种“语言”了。因此,把它纳入日常的辅助性工具,非常有意义。
前言:
我们在各种生产环境或者开发测试环境中,一定遇到有很多信息都是使用JSON串或者文本文件作为输入的。在没有JQ命令行工具之前,我们要从中获取真正的输入,大都把它复制到文本里头,然后使用文本编辑器进行加工整理。
比如,提取用户名(username)、密码(password)、连接的url、证书(certificate)等。
一个典型的连接信息如下:
{
"clientid": "sb-aaaabbbbbbb",
"clientsecret": "ZfWzDxxxxxxxxxxxcxxxxxxxx0xc=",
"url": "https://m.authentication.s.cccnd.com",
"identityzone": "m2222222",
"identityzoneid": "m2222222",
"tenantid": "m2222222",
"tenantmode": "dedicated",
"sburl": "https://internal-m.authentication.s.cccnd.com",
"apiurl": "https://api.m.authentication.s.cccnd.com",
"verificationkey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW\n2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyM\nziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD\n/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU\n4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8\nAr4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV57\n7wIDAQAB\n-----END PUBLIC KEY-----",
"xsappname": "xsuaa-m",
"subaccountid": "m2222222",
"uaadomain": "m.authentication.s.cccnd.com",
"zoneid": "m2222222",
"credential-type": "instance-secret",
"trustedclientidsuffix": "|m2222222!b73"
}
上边的信息已经做过脱敏处理。
我们使用jq就可以快速得到相关项的值。
使用示例
就以上边的输入为例,假设上述内容对应的文件名为:demo.json, 我们很快就能得到 clientid的值:
jq .clientid -r demo.json
sb-aaaabbbbbbb
apiurl:
jq .apiurl -r demo.json
https://api.m.authentication.s.cccnd.com
verificationkey:
jq .verificationkey -r demo.json
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW
2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyM
ziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD
/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU
4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8
Ar4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV57
7wIDAQAB
-----END PUBLIC KEY-----
我们还能看到jq -r能自动去掉值里头的一些回车换行符:"\n"。这就省去了我们用文本编辑器进行相关替换的麻烦。
我们也可以看到不带 -r选项时处理结果的明显不同。这只是一个简单的示例。
基本使用
jq 是 stedolan 开发的一个轻量级的和灵活的命令行 JSON 处理器。它主要用于在命令行界面处理 JSON 输入,并使用给定的过滤条件来过滤符合条件的新的 JSON 串。通常在类 Unix 环境下,我们可以快速的使用 jq
来进行 JSON 数据格式化过滤和处理。
安装过程比较直接明了。
# Ubuntu 系列
$ sudo apt-get install jq
# CentOS 系列
$ yum install jq
1、语法
jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]
# options 可选参数列表和说明
-c 将格式化json输出为紧凑的字符串格式;
-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参数,而不是文件;
-- 终止参数处理;
也可以使用jq --help得到类似的帮助提示。可能让你很吃惊的是,它有一个完整的文档网址:https://jqlang.github.io/jq/manual/
2、基础使用
2.1、简单字段解析
# 使用 . 参数默认格式化整个json数据
echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com"}' | jq .
{
"name": "Bob",
"Id": 123345,
"url": "http://i.bob.com"
}
# 使用.$name得到目标field值
echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com"}' | jq .Id
123345
# 解析嵌套层级数据
jq echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com", "contact": {"tel": "13600000000", "email":"bob@qq.com", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact
{
"tel": "13600000000",
"email": "bob@qq.com",
"wechat": "bob_wechat"
}
# 获取联系方式中的电话
jq echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com", "contact": {"tel": "13600000000", "email":"bob@qq.com", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact.tel
"13600000000"
# 获取多个字段: '.Field1,.Field2,...'
echo '{"name":"Bob", "Id":123345, "url":"http://i.bob.com", "contact": {"tel": "13600000000", "email":"bob@qq.com", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq '.contact.tel, .name'
"13600000000"
"Bob"
但是我们要注意一点的是,在shell里头,需要使用quote:
Unix shells: jq '.["foo"]'
Powershell: jq '.[\"foo\"]'
Windows command shell: jq ".[\"foo\"]"
2.2、列表、迭代与管道
给定一个输入文件:demo2.json
{
"Name": "CloudNativeOps",
"Owner": "GoOps",
"WebSite": "https://bgbiao.top/",
"Contact": {
"Email": "weichuangxxb@qq.com",
"QQ": "371990778",
"WeChat": "GoOps"
},
"Skills": [
{
"name": "Python",
"type": "dev"
},
{
"name": "Golang",
"type": "dev"
},
{
"name": "Ansible",
"type": "ops"
},
{
"name": "Kubernetes",
"type": "dev"
},
{
"name": "ElasticSearch",
"type": "ops"
}
]
}
或者用一长串作输入也可:
'{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}'
# 解析数组与列表
jq .Skills demo2.json
[
{
"name": "Python",
"type": "dev"
},
{
"name": "Golang",
"type": "dev"
},
{
"name": "Ansible",
"type": "ops"
},
{
"name": "Kubernetes",
"type": "dev"
},
{
"name": "ElasticSearch",
"type": "ops"
}
]
# 按序号或按范围进行检索:如 '.Skills[1:3]'
echo '[1,2,3]' | jq '.[2]'
3
jq '.Skills[1:3]' demo2.json
[
{
"name": "Golang",
"type": "dev"
},
{
"name": "Ansible",
"type": "ops"
}
]
# 值的迭代器
jq '.Skills[]' demo2.json
{
"name": "Python",
"type": "dev"
}
{
"name": "Golang",
"type": "dev"
}
{
"name": "Ansible",
"type": "ops"
}
{
"name": "Kubernetes",
"type": "dev"
}
{
"name": "ElasticSearch",
"type": "ops"
}
# 过滤器中使用管道, 比如在 .Skills中再对name进行过滤
jq '.Skills[] | .name' demo2.json
"Python"
"Golang"
"Ansible"
"Kubernetes"
"ElasticSearch"
其实,这里,它可以直接取 .name
jq '.Skills[].name' demo2.json
"Python"
"Golang"
"Ansible"
"Kubernetes"
"ElasticSearch"
# 组合不同层级的示例
echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}' | jq '.user, .projects[]'
"stedolan"
"jq"
"wikiflow"
# 简单运算:
echo '{"num": [1,2,3,4]}' | jq '[.num[] | . * 2 ]'
[
2,
4,
6,
8
]
# 求和
echo 1 2 3 | jq -n 'reduce inputs as $i (0; . + $i)'
6
我们再回到最开始的时候,提供的那个输入,我们不想让verificationkey的值被换行,同时还要去掉'\n', 可以用:
jq '.verificationkey' -c demo.json
"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW\n2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyM\nziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD\n/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU\n4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8\nAr4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV57\n7wIDAQAB\n-----END PUBLIC KEY-----"
要再去掉里边的"\n", 直接:
jq '.verificationkey' -c demo.json | sed 's/\\[tn]//g'
"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyMziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8Ar4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV577wIDAQAB-----END PUBLIC KEY-----"
# 去掉首尾的"
jq '.verificationkey' -c demo.json | sed 's/\\[tn]//g; s/"\(.*\)"/\1/'
-----BEGIN PUBLIC KEY-----MIIBIjANBgkqxxxxxxxxxxxxxxxIBCgKCAQEA51Yl/x6794sUZSpuBNTW2txOr2vy4I05riI+H3T3kpNqdO/Gbo4NZa7gXs0Of/XYG6pq0XRwOVUcBsW5qPyMziEPcYeDkQXBeQk+vmfoXjHj5gMWoXNj2/qdguMX8iR8plkoPyZBVhJk5GbgcxQD/8gGHCw5/47x/4TNWyj2wamQrzf8+cz8LsnGMEOcLTV5tY5Ph+p/NQLbqVxt+obU4M2avhN2ypQyPnqjxGfdJAxaND7SklxWBR4RBdcHkiYiAt9uZsXdNHyAL4EVraP8Ar4HZ58RHlI8I3pLBVahn+Gg+6dw7vxxxxxxxxxxxxxxxxxcr4SoQV577wIDAQAB-----END PUBLIC KEY-----
总结:
上边所有内容只是很基础的一部分使用。jq功能其实非常强大,如果仔细阅读https://jqlang.github.io/jq/manual/, 你会发现,它基本上已经接近一种“语言”了。因此,把它纳入日常的辅助性工具,非常有意义。