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

2024-03-16 08:20

本文主要是介绍[善用佳软]推荐掌握小工具:Json解析的命令行工具jq,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图片

前言:

我们在各种生产环境或者开发测试环境中,一定遇到有很多信息都是使用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/, 你会发现,它基本上已经接近一种“语言”了。因此,把它纳入日常的辅助性工具,非常有意义。

图片

这篇关于[善用佳软]推荐掌握小工具:Json解析的命令行工具jq的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814873

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工