本文主要介绍Linux命令行工具分析和打印格式JSON的方法。有需要的朋友可以参考一下。
JSON是一种轻量级的与语言无关的数据存储格式,易于与大多数编程语言集成,并且易于人类理解3354。当然,如果格式正确的话。JSON这个词代表JavaScript o object n o station。虽然它是从JavaScript开始的,主要用于服务器和浏览器之间的数据交换,但现在它已经被用于许多领域,包括嵌入式系统。这里,我们将使用Linux上的命令行工具来解析和格式化打印的JSON。它对于处理shell脚本中的大型JSON数据或shell脚本中的JSON数据非常有用。
什么是格式化输出?
JSON数据的结构更加人性化。但是在大多数情况下,JSON数据将被存储在一行中,甚至没有行尾字符。
显然,这对于人工阅读和编辑是不方便的。
这是打印格式漂亮的打印,这是非常有用的。名称本身就说明了问题:重新格式化JSON文本,让人们更清楚地阅读它。这被称为JSON打印格式。
用 Linux 命令行工具解析和格式化输出 JSON
您可以使用命令行文本处理器解析JSON数据,比如awk、sed和gerp。实际上,JSON.awk是一个完成这项工作的awk脚本。然而,也有一些特殊的工具可以用于相同的目的。
Jq或者jshon,shell下的JSON解析器,都很有用。
Shell脚本,如JSON.sh或jsonv.sh,用于在bash、zsh或dash shell中解析JSON。
JSON.awk,JSON解析器的awk脚本。
像json.tool这样的Python模块
Undercore-cli,基于Node.js和javascript。
在本教程中,我只关注jq,它是一个shell下非常强大的JSON解析器,具有高级过滤和脚本功能。
JSON 格式化输出
JSON数据可能很难在一行中读取,因此为了使其可读,可以使用JSON打印格式。
示例:对于来自jsonip.com的数据,使用curl或wget工具获取JSON格式的外部IP地址,如下所示。
$ wget-CQ http://jsonip.com/-O-
实际数据如下所示:
{'ip':'111.222.333.444 ','关于':'/关于','亲!':http://getjsonip.com}
现在使用jq来打印格式化它:
$ wget-CQ http://jsonip.com/-O-| jq ' '
通过jq过滤结果后,它应该看起来像这样:
{
ip': '111.222.333.444 ',
关于':'/关于',
“亲!”:' http://getjsonip.com '
}
也可以通过Python json.tool模块来完成。例子如下:
$ cat any thing . JSON | python-m JSON . tool
这种基于Python的解决方案对大多数用户来说应该没问题,但如果Python没有预装或不能安装,比如在嵌入式系统上,就不合适了。
但是,json.tool Python模块有明显的优势。它是跨平台的。因此,您可以在Windows、Linux或Mac OS上无缝使用它。
如何用 jq 解析 JSON
首先,您需要安装jq,大多数GNU/Linux发行版都选择jq,并使用各自的包安装程序命令进行安装。
在Arch Linux上:
$ sudo pacman -S jq
在Debian、Ubuntu、Linux Mint上:
$ sudo apt-get安装jq
关于Fedora:
$ sudo dnf安装jq
在openSUSE上:
$ sudo zypper安装jq
对于其他操作系统或平台,请参考官方安装说明。
jq 的基本过滤和标识符功能
Jq可以从STDIN或文件中读取JSON数据。可以根据情况使用。
单个符号是最基本的过滤器。这些过滤器也被称为对象标识符-索引。Jq使用单个。过滤器,基本相当于输入JSON文件的打印格式。
单引号:你不必总是使用单引号。但是如果你把几个滤镜组合成一排,那么你就不得不使用它们。
双引号:必须用两个双引号括起任何特殊字符,如@、#、$等,例如jq.foo. "@ bar "。
原始数据打印:无论出于什么原因,如果您只需要最终解析的数据(不包括在双引号中),请使用带有-r标志的jq命令,如下所示:jq -r .foo.bar
解析特定数据
要过滤掉JSON的特定部分,需要知道打印格式的JSON文件的数据层次结构。
来自维基百科的JSON数据示例:
{
名字':'约翰',
姓氏':'史密斯',
'年龄':25,
地址':{
街道地址': '第二街21号',
城市':'纽约',
州':'纽约',
邮政编码:“10021”
},
电话号码':[
{
键入':' home ',
号码':' 212 555-1234 '
},
{
键入':'传真',
号码':' 646 555-4567 '
}
],
性别':
类型':'男性'
}
}
在本教程中,我将使用这个JSON数据作为示例,并将其保存为sample.json
假设我想从sample.json文件中过滤出地址。所以命令应该是这样的:
$ jq。地址sample.json
示例输出:
{
街道地址': '第二街21号',
城市':'纽约',
州':'纽约',
邮政编码:“10021”
}
同样,我想要邮政编码,然后我想添加另一个对象标识符——index,即另一个过滤器。
$ cat sample . JSON | jq . address . postal code
还要注意,过滤器是区分大小写的,您必须使用完全相同的字符串来获得有意义的输出,否则它就是null。
从 JSON 数组中解析元素
JSON数组的元素用方括号括起来,这无疑是很常见的。
要解析数组中的元素,必须使用[]标识符和其他对象标识符索引。
在这个JSON数据示例中,电话号码存储在一个数组中。要从该数组中获取所有内容,只需使用括号,如下例所示:
$ jq。电话号码[] sample.json
假设您只想要数组的第一个元素,然后使用从0开始的数组对象编号。对于第一项,使用[0],对于下一项,每一步都要增加1。
$ jq。电话号码[0] sample.json
脚本编程示例
假设我只想要家庭电话,而不是整个JSON数组数据。这就是编写jq命令脚本的便利之处。
$ cat sample.json | jq -r '。phoneNumber[] | select(。type=='home') |。'编号'
首先,我将一个过滤器的结果传递给另一个过滤器,然后使用select属性选择特定类型的数据,并将结果再次传递给另一个过滤器。
解释每种类型的jq过滤器和脚本编程超出了本教程的范围和目的。强烈建议您阅读jq手册,以便更好地理解以下内容。
资源:
https://stedolan.github.io/jq/manual/
http://www.compciv.org/recipes/cli/jq-for-parsing-json/
https://lzone.de/cheat-sheet/jq
via:https://www . ostechnix . com/how-to-parse-and-pretty-print-JSON-with-Linux-command line-tools/
总结
以上是边肖介绍的Linux命令行工具分析和打印格式JSON的方法。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。