[善用佳软]推荐掌握小工具:Json解析的命令行工具jq

[善用佳软]推荐掌握小工具:Json解析的命令行工具jq与我联系 微信公众号 数据库杂记 个人微信 iiihero 我是 iihero 也可以叫我 Sean iihero CSDN https blog csdn net iihero Sean 墨天轮 https www modb pro u 16258 数据库领域的资深爱好者一枚 水木早期数据库论坛发起人 db2

大家好,我是讯享网,很高兴认识大家。

图片
讯享网

与我联系: 微信公众号:数据库杂记   个人微信: iiihero 我是iihero. 也可以叫我Sean. iihero@CSDN(https://blog.csdn.net/iihero)  Sean@墨天轮 (https://www.modb.pro/u/16258) 数据库领域的资深爱好者一枚。 水木早期数据库论坛发起人 db2@smth就是俺,早期多年水木论坛数据库版版主。 国内最早一批DB2 DBA。前后对Sybase ASE及SQLAnywhere, PostgreSQL,  HANA, Oracle, DB2, SQLite均有涉猎。曾长期担任CSDN相关数据库版版主。 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": "m",     "identityzoneid": "m",     "tenantid": "m",     "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": "m",     "uaadomain": "m.authentication.s.cccnd.com",     "zoneid": "m",     "credential-type": "instance-secret",     "trustedclientidsuffix": "|m!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":, "url":"http://i.bob.com"}' | jq . {   "name": "Bob",   "Id": ,   "url": "http://i.bob.com" } # 使用.$name得到目标field值 echo '{"name":"Bob", "Id":, "url":"http://i.bob.com"}' | jq .Id     # 解析嵌套层级数据 jq echo '{"name":"Bob", "Id":, "url":"http://i.bob.com", "contact": {"tel": "", "email":"", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact    {   "tel": "",   "email": "",   "wechat": "bob_wechat" } # 获取联系方式中的电话 jq echo '{"name":"Bob", "Id":, "url":"http://i.bob.com", "contact": {"tel": "", "email":"", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact.tel "" # 获取多个字段: '.Field1,.Field2,...' echo '{"name":"Bob", "Id":, "url":"http://i.bob.com", "contact": {"tel": "", "email":"", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq '.contact.tel, .name' "" "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": "",     "": "",     "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":"","":"","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": "m",     "identityzoneid": "m",     "tenantid": "m",     "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": "m",     "uaadomain": "m.authentication.s.cccnd.com",     "zoneid": "m",     "credential-type": "instance-secret",     "trustedclientidsuffix": "|m!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":, "url":"http://i.bob.com"}' | jq . {   "name": "Bob",   "Id": ,   "url": "http://i.bob.com" } # 使用.$name得到目标field值 echo '{"name":"Bob", "Id":, "url":"http://i.bob.com"}' | jq .Id     # 解析嵌套层级数据 jq echo '{"name":"Bob", "Id":, "url":"http://i.bob.com", "contact": {"tel": "", "email":"", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact    {   "tel": "",   "email": "",   "wechat": "bob_wechat" } # 获取联系方式中的电话 jq echo '{"name":"Bob", "Id":, "url":"http://i.bob.com", "contact": {"tel": "", "email":"", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq .contact.tel "" # 获取多个字段: '.Field1,.Field2,...' echo '{"name":"Bob", "Id":, "url":"http://i.bob.com", "contact": {"tel": "", "email":"", "wechat":"bob_wechat"}, "birth":"2000-01-02"}' | jq '.contact.tel, .name' "" "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": "",     "": "",     "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":"","":"","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/, 你会发现,它基本上已经接近一种“语言”了。因此,把它纳入日常的辅助性工具,非常有意义。

图片

小讯
上一篇 2025-01-07 09:24
下一篇 2025-03-05 20:45

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/59711.html