如何用jq解析linux命令行上的json文件

JSON是在web上传输基于文本的数据的最流行格式之一。到处都是,你一定会遇到的。我们将向您展示如何使用jq命令从Linux命令行处理它。...

JSON是在web上传输基于文本的数据的最流行格式之一。到处都是,你一定会遇到的。我们将向您展示如何使用jq命令从Linux命令行处理它。

json和jq

JSON代表JavaScript对象表示法。这是一种允许数据以自我描述的方式编码成纯文本文件的方案。JSON文件中没有注释,内容应该是不言自明的。每个数据值都有一个名为“name”或“key”的文本字符串,它告诉您数据值是什么。他们一起被称为名称:值对,或键:值对。冒号(:)将键与其值分开。

“对象”是键:值对。在JSON文件中,对象以大括号({)开始,以大括号(})结束。JSON还支持“数组”,即值的有序列表。数组以左括号([)开始,以右括号(])结束。

当然,从这些简单的定义中,可以产生任意的复杂性。例如,对象可以嵌套在对象中。对象可以包含数组,数组也可以包含对象。所有这些都可以有开放的嵌套级别。

但实际上,如果JSON数据的布局错综复杂,那么数据布局的设计可能需要重新考虑。当然,如果您没有生成JSON数据,只是尝试使用它,那么您在它的布局中就没有发言权。不幸的是,在这种情况下,你只需要处理它。

大多数编程语言都有允许它们解析JSON数据的库或模块。遗憾的是,bashshell没有这样的功能。

需要是发明之母,然而,jq实用程序诞生了!使用jq,我们可以轻松地在bashshell中解析JSON。不管你是必须使用精心设计、优雅的JSON,还是噩梦中的那些东西。

如何安装jq

我们必须在研究本文时使用的所有Linux发行版上安装jq。

要在Ubuntu上安装jq,请键入以下命令:

sudo apt-get install jq

如何用jq解析linux命令行上的json文件

要在Fedora上安装jq,请键入以下命令:

sudo dnf install jq

如何用jq解析linux命令行上的json文件

要在Manjaro上安装jq,请键入以下命令:

sudo pacman -Sy jq

如何用jq解析linux命令行上的json文件

如何使json可读

JSON不关心空格,布局也不影响它。只要遵循JSON语法规则,处理JSON的系统就可以读取和理解它。正因为如此,JSON通常作为一个简单的长字符串进行传输,而不考虑布局。这节省了一些空间,因为JSON中不必包含制表符、空格和新行字符。当然,这一切的缺点是当人类试图阅读它时。

让我们从NASA的网站上提取一个短的JSON对象,它告诉我们国际空间站的位置。我们将使用curl,它可以下载文件来检索JSON对象。

我们不关心curl通常生成的任何状态消息,因此我们将使用-s(silent)选项键入以下内容:

curl -s http://api.open-notify.org/iss-now.json

如何用jq解析linux命令行上的json文件

现在,稍加努力,你就能读到这个。您必须选择数据值,但这既不容易也不方便。让我们重复一遍,但这次我们将通过jq来实现。

jq使用过滤器来解析JSON,其中最简单的是句点(.),这意味着“打印整个对象”。默认情况下,jq将打印输出。

我们将所有内容放在一起,并键入以下内容:

curl -s http://api.open-notify.org/iss-now.json | jq .

如何用jq解析linux命令行上的json文件

好多了!现在,我们可以看到到底发生了什么。

整个对象用大括号括起来。它包含两个键:名称对:消息和时间戳。它还包含一个名为iss\u position的对象,其中包含两个键:值对:经度和纬度。

我们再试一次。这次我们将键入以下内容,并将输出重定向到名为iss.json文件”:

curl -s http://api.open-notify.org/iss-now.json | jq . > iss.json cat iss.json

如何用jq解析linux命令行上的json文件

这为我们在硬盘上提供了一个布局良好的JSON对象副本。

相关:如何使用curl从Linux命令行下载文件

访问数据值

正如我们在上面看到的,jq可以从JSON提取通过管道传输的数据值。它还可以处理存储在文件中的JSON。我们将使用本地文件,这样命令行就不会被curl命令弄得乱七八糟。这样应该会更容易理解。

从JSON文件中提取数据的最简单方法是提供一个键名来获取其数据值。键入句点和关键字名称,两者之间不留空格。这将根据关键字名称创建一个筛选器。我们还需要告诉jq要使用哪个JSON文件。

我们键入以下内容以检索消息值:

jq .message iss.json

如何用jq解析linux命令行上的json文件

jq在终端窗口中打印消息值的文本。

如果键名包含空格或标点符号,则必须用引号将其筛选器括起来。通常注意使用字符、数字和下划线,这样JSON键名就不会有问题。

首先,我们键入以下内容来检索时间戳值:

jq .timestamp iss.json

如何用jq解析linux命令行上的json文件

在终端窗口中检索并打印时间戳值。

但是我们怎样才能访问iss\u position对象中的值呢?我们可以使用JSON点表示法。我们将在键值的“路径”中包含iss\u位置对象名。为此,键所在的对象的名称将位于键本身的名称之前。

我们键入以下内容,包括纬度键名称(注意“.iss_uposition”和“.latitude”之间没有空格):

jq .iss_position.latitude iss.json

如何用jq解析linux命令行上的json文件

要提取多个值,必须执行以下操作:

  • 在命令行中列出关键字名称。
  • 用逗号(,)分隔。
  • 用引号(“)或撇号(')括起来。

有鉴于此,我们键入以下内容:

jq ".iss_position.latitude, .timestamp" iss.json

如何用jq解析linux命令行上的json文件

这两个值打印到终端窗口。

使用阵列

让我们从NASA获取一个不同的JSON对象。

这一次,我们将使用目前在太空的宇航员名单:

curl -s http://api.open-notify.org/astros.json

如何用jq解析linux命令行上的json文件

好吧,那成功了,我们再来一次。

我们将键入以下命令,通过管道将其传递到jq,并将其重定向到名为astro.json文件”:

curl -s http://api.open-notify.org/astros.json | jq . > astro.json

如何用jq解析linux命令行上的json文件

现在,让我们键入以下内容来检查文件:

less astro.json

如何用jq解析linux命令行上的json文件

如下图所示,我们现在看到了太空中宇航员的名单,以及他们的航天器。

如何用jq解析linux命令行上的json文件

这个JSON对象包含一个名为people的数组。我们知道这是一个数组,因为开头的括号([)(在上面的屏幕截图中突出显示)。它是一个对象数组,每个对象包含两个键:值对:名称和工艺。

和前面一样,我们可以使用JSON点符号来访问这些值。我们还必须在数组的名称中包含括号([])。

考虑到所有这些,我们键入以下内容:

jq ".people[].name" astro.json

如何用jq解析linux命令行上的json文件

这一次,所有名称值都打印到终端窗口。我们要求jq为数组中的每个对象打印名称值。很整洁,是吧?

如果将单个对象在数组中的位置放在命令行的方括号([])中,则可以检索该对象的名称。数组使用零偏移索引,这意味着数组第一个位置的对象为零。

要访问数组中的最后一个对象,可以使用-1;要获取数组中倒数第二个对象,可以使用-2,依此类推。

有时,JSON对象提供数组中的元素数,这就是这个数组的情况。它与数组一起包含键:名称对调用值为6的数字。

此数组中的对象数如下:

jq ".people[1].name" astro.json jq ".people[3].name" astro.json jq ".people[-1].name" astro.json jq ".people[-2].name" astro.json

如何用jq解析linux命令行上的json文件

也可以在数组中提供开始和结束对象。这就是所谓的“切片”,它可能有点混乱。记住数组使用零偏移量。

要从索引位置2到(但不包括)索引位置4的对象检索对象,请键入以下命令:

jq ".people[2:4]" astro.json

如何用jq解析linux命令行上的json文件

这将打印数组索引2(数组中的第三个对象)和3(数组中的第四个对象)处的对象。它在数组索引4处停止处理,这是数组中的第五个对象。

更好地理解这一点的方法是在命令行上进行实验。你很快就会明白它的工作原理。

如何使用带过滤器的管道

您可以将输出从一个过滤器传输到另一个过滤器,而不必学习新符号。与Linux命令行相同,jq使用垂直条(|)表示管道。

我们将告诉jq将人员数组导入.name过滤器,该过滤器应在终端窗口中列出宇航员的姓名。

我们键入以下内容:

jq ".people[] | .name" astro.json

如何用jq解析linux命令行上的json文件

相关:如何在Linux上使用管道

创建数组和修改结果

我们可以使用jq来创建新的对象,比如数组。在本例中,我们将提取三个值并创建一个包含这些值的新数组。注意,左括号([)和右括号(])也是筛选器字符串中的第一个和最后一个字符。

我们键入以下内容:

jq "[.iss-position.latitude, iss_position.longitude, .timestamp]" iss.json

如何用jq解析linux命令行上的json文件

输出用括号括起来并用逗号分隔,使其成为一个格式正确的数组。

数值也可以在检索时进行操作。让我们从ISS位置文件中提取时间戳,然后再次提取它并更改返回的值。

为此,我们键入以下内容:

jq ".timestamp" iss.json jq ".timestamp - 1570000000" iss.json

如何用jq解析linux命令行上的json文件

如果需要从值数组中添加或删除标准偏移量,这将非常有用。

让我们输入以下内容来提醒自己iss.json文件文件包含:

jq . iss.json

如何用jq解析linux命令行上的json文件

假设我们想删除这个消息键:值对。这与国际空间站的位置无关。它只是一个标志,表明位置检索成功。如果超出了要求,我们就可以省去它。(你也可以忽略它。)

我们可以使用jq的delete函数del()来删除键:值对。删除邮件键:值对,我们键入以下命令:

jq "del(.message)" iss.json

如何用jq解析linux命令行上的json文件

注意,这实际上并没有从iss.json文件文件;它只是将其从命令的输出中删除。如果您需要创建一个没有消息的新文件键:值对在其中,运行命令,然后将输出重定向到新文件中。

更复杂的json对象

让我们再检索一些NASA的数据。这次,我们将使用一个JSON对象,该对象包含来自世界各地流星撞击站点的信息。这是一个比我们以前处理过的更复杂的JSON结构的更大的文件。

首先,我们将键入以下命令将其重定向到名为**.json”:

curl -s https://data.nasa.gov/resource/y77d-th95.json | jq . > strikes.json

如何用jq解析linux命令行上的json文件

要查看JSON的外观,请键入以下内容:

less strikes.json

如何用jq解析linux命令行上的json文件

如下所示,文件以一个左括号([)开始,因此整个对象是一个数组。数组中的对象是键:值对,还有一个嵌套对象叫做geolocation。地理位置对象包含更多键:值对,以及一个称为坐标的数组。

如何用jq解析linux命令行上的json文件

让我们从索引位置995到数组末尾的对象中检索流星撞击的名称。

我们将键入以下内容以通过三个过滤器传递JSON:

jq ".[995:] | .[] | .name" strikes.json

如何用jq解析linux命令行上的json文件

过滤器的工作方式如下:

  • [995:]:这告诉jq处理从数组索引995到数组末尾的对象。冒号(:)后面没有数字告诉jq继续到数组的末尾。
  • []:这个数组迭代器告诉jq处理数组中的每个对象。
  • .name:此筛选器提取名称值。

只要稍作改动,我们就可以从数组中提取最后10个对象。“-10”指示jq从数组的末尾开始处理对象10。

我们键入以下内容:

jq ".[-10:] | .[] | .name" strikes.json

如何用jq解析linux命令行上的json文件

正如我们在前面的示例中所做的,我们可以键入以下内容来选择单个对象:

jq ".[650].name" strikes.json

如何用jq解析linux命令行上的json文件

我们也可以对字符串应用切片。为此,我们将键入以下内容以请求数组索引234处对象名称的前四个字符:

jq ".[234].name[0:4]" strikes.json

如何用jq解析linux命令行上的json文件

我们也可以看到一个特定的物体的整体。为此,我们键入以下内容并包含一个不带任何关键字:值过滤器:

jq ".[234]" strikes.json

如何用jq解析linux命令行上的json文件

如果只想查看值,则可以在不使用键名的情况下执行相同的操作。

在我们的示例中,我们键入以下命令:

jq ".[234][]" strikes.json

如何用jq解析linux命令行上的json文件

要从每个对象检索多个值,我们在下面的命令中用逗号分隔它们:

jq ".[450:455] | .[] | .name, .mass" strikes.json

如何用jq解析linux命令行上的json文件

如果要检索嵌套值,则必须标识构成这些值的“路径”的对象。

例如,要引用坐标值,我们必须包括全包数组、地理位置嵌套对象和嵌套坐标数组,如下所示。

如何用jq解析linux命令行上的json文件

要查看数组索引位置121处对象的坐标值,请键入以下命令:

jq ".[121].geolocation.coordinates[]" strikes.json

如何用jq解析linux命令行上的json文件

长度函数

jq length函数根据应用的内容提供不同的度量,例如:

  • 字符串:以字节为单位的字符串长度。
  • 对象:数量键:值对在对象中。
  • 数组:数组中数组元素的数目。

以下命令返回JSON数组中10个对象的名称值的长度,从索引位置100开始:

jq ".[100:110] | .[].name | length" strikes.json

如何用jq解析linux命令行上的json文件

看看有多少键:值对在数组的第一个对象中,键入以下命令:

jq ".[0] | length" strikes.json

如何用jq解析linux命令行上的json文件

按键起作用

您可以使用keys函数来了解您必须使用的JSON。它可以告诉您键的名称,以及数组中有多少个对象。

在“中的people对象中查找键”astro.json文件“文件,我们键入以下命令:

jq ".people.[0] | keys" astro.json

如何用jq解析linux命令行上的json文件

要查看人员数组中有多少元素,请键入以下命令:

jq ".people | keys" astro.json

如何用jq解析linux命令行上的json文件

这表明有六个零偏移量的数组元素,编号为0到5。

has()函数

您可以使用has()函数查询JSON并查看对象是否具有特定的键名。注意,密钥名称必须用引号括起来。我们将filter命令用单引号(')括起来,如下所示:

jq '.[] | has("nametype")' strikes.json

如何用jq解析linux命令行上的json文件

将检查数组中的每个对象,如下所示。

如何用jq解析linux命令行上的json文件

如果要检查特定对象,请在数组筛选器中包括其索引位置,如下所示:

jq '.[678] | has("nametype")' strikes.json

如何用jq解析linux命令行上的json文件

没有它不要靠近json

jq实用程序是专业的、强大的、快速的软件的完美例子,它使生活在Linux世界变得如此愉快。

这只是对这个命令的常见功能的简单介绍,还有很多。如果你想更深入的挖掘,一定要查看全面的jq手册。

  • 发表于 2021-04-14 19:24
  • 阅读 ( 255 )
  • 分类:互联网

你可能感兴趣的文章

json-python解析:简单指南

... 有一些库和工具箱可用于从几乎任何语言和环境中解析和生成JSON。本文主要讨论使用python处理JSON时产生的方法和问题。 ...

  • 发布于 2021-03-13 11:20
  • 阅读 ( 289 )

如何让python和javascript使用json进行通信

...,那么您需要下载并安装Python,也许还需要学习一下您的命令行技能。 ...

  • 发布于 2021-03-16 01:22
  • 阅读 ( 299 )

如何用python读写google工作表

Python是一种优秀的编程语言。语法可能看起来奇怪和不寻常,但它很容易学习和使用。它支持Minecraft Pi版,以及一系列网站和学术研究项目。 ...

  • 发布于 2021-03-16 13:43
  • 阅读 ( 587 )

如何用树莓皮打造diy谷歌家庭助理

语音控制助理很快就变得司空见惯了。许多家庭都有一个Alexa或googlehome来控制从灯光到媒体的一切,甚至计时。 ...

  • 发布于 2021-03-22 22:23
  • 阅读 ( 365 )

如何在linux上管理ip地址:查找、设置和更改

...果要从终端ping localhost,由于hosts文件中的第一行,它将解析为127.0.0.1。这就是我们需要用新主机名更新它以确保正确解析的原因。 ...

  • 发布于 2021-03-24 17:34
  • 阅读 ( 260 )

转换json并使用jq使其可读

... 另请参见:JSON Python解析:简单指南 ...

  • 发布于 2021-03-27 02:07
  • 阅读 ( 201 )

如何用cp命令在linux中复制文件

如果您使用cp命令,那么在Linux中复制文件和目录可以快速而轻松。我们将学习如何使用cp,并利用其方便的选择,将使您的复印工作更安全。 ...

  • 发布于 2021-03-28 11:33
  • 阅读 ( 296 )

如何用python3构建基本电报机器人

如果你是一个电报用户,你一定会在某个时候与聊天机器人进行“对话”。Telegram的机器人有着惊人的可定制性,它提供了各种各样的优势——无论是自动完成任务,还是在聊天室里玩游戏。 ...

  • 发布于 2021-03-28 15:23
  • 阅读 ( 393 )

如何在windows命令行上转义文件路径中的空格

命令行环境(如Windows命令提示符和PowerShell)使用空格分隔命令和参数,但文件名和文件夹名也可以包含空格。要指定一个文件路径,其中有一个空格,您需要“转义”它。 命令行101:为什么要逃出空格 “转义”字符会改变...

  • 发布于 2021-04-01 11:39
  • 阅读 ( 581 )

如何在linux上创建手册页

...则编写一个并手动**宏是一项艰巨的工作。创建一个正确解析并看起来正确的手册页的行为可以超越您的目标,从而提供命令的简明、但彻底的描述。 你应该把注意力集中在你的内容上,而不是和一组晦涩难懂的宏作斗争。 相...

  • 发布于 2021-04-01 21:08
  • 阅读 ( 273 )
biubuipiupa
biubuipiupa

0 篇文章

相关推荐