掌握JQ:第1部分

2020-07-01 06:33:48

这是正在进行的掌握JQ系列文章的第一部分。本系列不假定您以前有过使用JQ的经验,但它确实假定您对shell编程有基本的流利性。

JQ是每个快速程序员的工具箱中都有的一个有价值的工具。它蕴含着巨大的力量。在第一部分中,我们将从基础知识开始。

对于JQ的每个应用程序,我们将以一个示例开始,您可以将该示例复制并粘贴到您的shell中,以了解它是如何工作的。本节的其余部分将更详细地讨论应用程序。

JQ最有价值的应用程序之一也是最容易使用的:漂亮的打印json。

将stdin上所需的json传递给jq,它将在stdout上输出漂亮的打印json。JQ';漂亮的印刷为数据增添了形状和颜色。形状和颜色使数据的读取和调试速度更快,如使用眼球调试中所述。需要注意的是,如果JQ';的输出通过管道传输到另一个命令或文件中,则JQ将不会呈现颜色。例如:

或者,如果json数据很大,我们可以通过管道将其转换为较少的数据(使用-R可以正确地呈现颜色)。

但是,如果我们这样做,我们会注意到没有颜色!要取回颜色,我们可以使用JQ的-C标志。

我们漂亮地打印json数据,使其更易于阅读。我们想再走一步,只看相关数据。JQ能做到吗?是。JQ可以选择json数据(并漂亮地打印它)。要了解如何选择相关数据,我们需要稍微了解一下JQ是如何工作的。JQ运行以下算法。

对于每个函数,将该函数应用于结果,并将输出设置为下一个函数的结果。

是标识选择器,它返回整个值。这就是JQ';.';Pretty打印在stdin上传递的整个值的原因。

如果存在json对象和键,则这将为位于";key";处的对象返回值。

其中,n和m是数字。如果结果为:l是结果数组的长度(如果适用):

Echo';[{";n";:";bob";,";v";:100},{";n";:";Jim";,";v";:101}]';|jq';map({name:.n,value:.v})';

有时,我们想要查看的数据本身具有次优的查看结构。我们想做的不仅仅是选择,我们想要改变结构。“选择器”是“过滤器”的特例,JQ拥有丰富而强大的过滤器集合来转换数据。JQ手册中的大多数内容都指定了可以转换JSON数据的不同过滤器。我已经突出显示了我认为最有用的几个过滤器,以及一个可以在shell中运行的示例。您可以在JQ手册中阅读有关它们的更多信息。

FLATEN是从函数式编程中展开的。它将列表列表“展平”为单个列表。

从对象返回键数组。当对象非常大,因此不能仅通过查看数据来确定关键字时,这一点尤其有用。

FROM_ENTRIES与TO_ENTRIES相反,它将键值对数组转换为对象。

到目前为止,我们已经将JQ用于json数据。其他数据格式呢?我们可以和他们一起使用JQ吗?嗯,JQ内置了对换行符分隔数据的支持,所以让我们从那里开始。

要将JQ与换行符数据一起使用,我们需要了解JQ是如何处理多个结果的。

我撒谎了。前面我说过,JQ将每个过滤器应用于单个JSON结果。实际上,可以有多个json结果。JQ将筛选器独立应用于每个结果,并将结果传递给下一个筛选器。

通过使用1个或多个空格(包括换行符)分隔这些值,可以将多个值传递到JQ。从技术上讲,在某些情况下,值之间不需要分隔符,但这不会影响我们的讨论。

要将JQ与换行符数据一起使用,我们还需要了解大约3个JQ标志和一个JQ过滤器。

jq-s从stdin读取,多个值将它们组合成单个数组。在实践中,我们使用它将换行符分隔的结果合并为单个结果。

带引号的f是json字符串,不带引号的f是“原始字符串”。jq-r Pretty将字符串类型的结果打印为原始字符串,而不是带引号的json字符串。

如果我们的输入是换行符分隔的数字,就像我们在示例中看到的那样,我们使用slurp:

如果数据是换行符分隔的字符串,我们还需要使用";原始字符串输入";:

要将字符串数组输出为换行符分隔的字符串,我们还需要使用";原始字符串输出";:

这是掌握JQ的第一步。到目前为止,我们已经看到了JQ如何:

所有这些使用JQ的方法都在JQ手册中进行了讨论。它们很容易买到,也很容易找到。在以后的文章中,我们将更深入地挖掘并揭开JQ隐藏的力量。手册中没有讨论的权力。