[善用佳软]推荐掌握小工具: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

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模