Linux shell jq工具操作文档(jq --help使用示例)

news2024/9/22 5:35:10

文章目录

  • jq工具介绍
  • `jq --help`解读
    • 英文
    • 中文
  • 使用示例
    • 1. 使用最简单的过滤器。将输入复制到输出,不做任何修改(除了格式化)
    • 2. 使用 `-c` 选项进行紧凑输出而非美化输出
    • 3. 使用 `-n` 选项以 `null` 作为单一输入值(用于创建新json,不必提供json输入)
    • 4. 使用 `-e` 选项设置基于输出的退出状态代码
    • 5. 使用 `-s` 选项将所有输入读取(slurp)到一个数组中,并对其应用过滤器
    • 6. 使用 `-r` 选项输出原始字符串,而非JSON文本
    • 7. 使用 `--arg a v` 设置变量 `$a` 的值为 `<v>`
    • 8. 使用 `--argjson a v` 设置变量 `$a` 的值为 JSON `<v>`
    • 9. 使用 `--slurpfile a f` 设置变量 `$a` 为从 `<f>` 读取的 JSON 文本数组
      • 注意,对于命令`jq -n --slurpfile data xxx.json '. + {"data": $data}'`,如果不加`-n`参数,执行将会卡住(hanging)
        • 解决方法
          • 方法1:加`-n`参数
          • 方法2:管道指定输入json
      • 方法3:用here string语法指定输入json
    • 10. 使用 `--rawfile a f` 设置变量 `$a` 为 `<f>` 内容的字符串
      • 示例

jq工具介绍

jq 是一个轻量级且灵活的命令行 JSON 处理工具。它可以用来解析、过滤、查询和操作 JSON 数据。

以下是 jq 的一些主要特性:

  1. 读取 JSON:你可以使用 jq 来读取 JSON 文件或者其他 JSON 数据源,并将数据转换为易于阅读的格式。

  2. 过滤和查询jq 提供了强大的过滤和查询功能,你可以使用它来提取和查看 JSON 数据中的特定部分。例如,你可以使用 .foo.bar 来提取名为 “foo” 的对象中名为 “bar” 的字段。

  3. 数据操作:你可以使用 jq 来修改 JSON 数据。例如,你可以添加、删除或更改字段,或者你可以将数据从一种形式转换为另一种形式。

  4. 脚本和自动化:由于 jq 是一个命令行工具,所以你可以在脚本或者自动化任务中使用它来处理 JSON 数据。

  5. 强大的函数库jq 有一个强大的函数库,可以用来对 JSON 数据进行各种复杂的操作。例如,你可以使用 map() 函数来处理数组,或者你可以使用 select() 函数来过滤数据。

参考文章:Linux shell jq工具(shell读取json、shell脚本读取json、shell json、json工具)

jq --help解读

英文

root@ky:/# jq --help
jq - commandline JSON processor [version 1.6]

Usage:  jq [options] <jq filter> [file...]
        jq [options] --args <jq filter> [strings...]
        jq [options] --jsonargs <jq filter> [JSON_TEXTS...]

jq is a tool for processing JSON inputs, applying the given filter to
its JSON text inputs and producing the filter's results as JSON on
standard output.

The simplest filter is ., which copies jq's input to its output
unmodified (except for formatting, but note that IEEE754 is used
for number representation internally, with all that that implies).

For more advanced filters see the jq(1) manpage ("man jq")
and/or https://stedolan.github.io/jq

Example:

        $ echo '{"foo": 0}' | jq .
        {
                "foo": 0
        }

Some of the options include:
  -c               compact instead of pretty-printed output;
  -n               use `null` as the single input value;
  -e               set the exit status code based on the output;
  -s               read (slurp) all inputs into an array; apply filter to it;
  -r               output raw strings, not JSON texts;
  -R               read raw strings, not JSON texts;
  -C               colorize JSON;
  -M               monochrome (don't colorize JSON);
  -S               sort keys of objects on output;
  --tab            use tabs for indentation;
  --arg a v        set variable $a to value <v>;
  --argjson a v    set variable $a to JSON value <v>;
  --slurpfile a f  set variable $a to an array of JSON texts read from <f>;
  --rawfile a f    set variable $a to a string consisting of the contents of <f>;
  --args           remaining arguments are string arguments, not files;
  --jsonargs       remaining arguments are JSON arguments, not files;
  --               terminates argument processing;

Named arguments are also available as $ARGS.named[], while
positional arguments are available as $ARGS.positional[].

See the manpage for more options.

中文

root@ky:/# /ky/tools/jq/jq-linux64 --help
jq - 命令行JSON处理器 [版本 1.6]

使用方法:  jq [选项] <jq过滤器> [文件...]
          jq [选项] --args <jq过滤器> [字符串...]
          jq [选项] --jsonargs <jq过滤器> [JSON_TEXTS...]

jq是一个用于处理JSON输入的工具,将给定的过滤器应用于其JSON文本输入,并在标准输出上产生过滤器的结果作为JSON。

最简单的过滤器是.,它将jq的输入复制到其输出中无修改(除了格式化,但请注意,内部使用IEEE754来表示数字,这意味着所有相关内容)。

更多高级过滤器,请参见jq(1)手册页("man jq")/或https://stedolan.github.io/jq

示例:

        $ echo '{"foo": 0}' | jq .
        {
                "foo": 0
        }

一些选项包括:
  -c               输出紧凑而不是美观打印的输出;
  -n               使用`null`作为单个输入值;
  -e               根据输出设置退出状态码;
  -s               读取(slurp)所有输入到数组中;对其应用过滤器;
  -r               输出原始字符串,而不是JSON文本;
  -R               读取原始字符串,而不是JSON文本;
  -C               为JSON着色;
  -M               单色(不为JSON着色);
  -S               在输出上对对象的键进行排序;
  --tab            使用制表符进行缩进;
  --arg a v        设置变量$a的值为<v>--argjson a v    设置变量$a的JSON值为<v>--slurpfile a f  设置变量$a为从<f>读取的JSON文本数组;
  --rawfile a f    设置变量$a为<f>内容组成的字符串;
  --args           剩余参数是字符串参数,而不是文件;
  --jsonargs       剩余参数是JSON参数,而不是文件;
  --               结束参数处理;

命名参数也可以作为$ARGS.named[]使用,而位置参数可以作为$ARGS.positional[]使用。

查看手册页以获取更多选项。

使用示例

假设我们有一个/ky_cont_img/hw/ky_ai_cont.json

{
    "conts": [
        {
            "contName": "ky_obj",
            "imgPkgName": "ky_ascend_obj_v1.1.tar",
            "imgName": "ky_ascend_obj",
            "imgTag": "v1.1"
        },
        {
            "contName": "ky_obj2",
            "imgPkgName": "ky_ascend_obj_v1.1.tar",
            "imgName": "ky_ascend_obj",
            "imgTag": "v1.1"
        }
    ]
}

1. 使用最简单的过滤器。将输入复制到输出,不做任何修改(除了格式化)

echo '{"foo": 0}' | jq .

在这里插入图片描述

在jq中,. 或者说点表示的是当前处理的JSON数据。当用 . 作为过滤器时,意思是把输入的JSON数据原样输出,不做任何修改。

例如,在命令 echo '{"foo": 0}' | jq . 中,jq . 的作用就是将输入的 {"foo": 0}这个JSON对象直接输出。

另外,还可以使用 . 来访问JSON对象的属性。例如,如果想获取这个JSON对象的 “foo” 属性,可以使用 .foo作为过滤器:echo '{"foo": 0}' | jq .foo,这条命令将会输出 0

2. 使用 -c 选项进行紧凑输出而非美化输出

echo '{"foo": 0, "bar": 1}' | jq -c .

在这里插入图片描述

3. 使用 -n 选项以 null 作为单一输入值(用于创建新json,不必提供json输入)

-n 选项的作用是使jq以 null 作为单一输入值。在默认情况下,jq会期望从标准输入或文件中读取JSON数据。然而,如果想生成新的JSON,而不是对现有的JSON进行处理,那么 -n 选项就会非常有用。

例如,假设想创建一个包含特定键值对的新JSON对象,你可以使用以下命令:

jq -n '{ "foo": "bar", "baz": 42 }' 

这个命令将输出:

{
  "foo": "bar",
  "baz": 42
}

在这里插入图片描述

因此,尽管 -n 选项看起来像是让输入为 null,但它实际上更多的是为了可以创建新的JSON,而不必先提供一个现有的JSON输入。

4. 使用 -e 选项设置基于输出的退出状态代码

-e 选项的作用是设置基于输出的退出状态代码。这主要在脚本编写和自动化任务中使用。

当你使用 -e 选项时,如果jq的最后一个过滤器产生的结果为空(null或者false),那么jq命令将返回非零的退出状态码。否则,如果最后一个过滤器产生的结果非空(也就是有任何有效的JSON值),那么jq命令将返回零的退出状态码。

例如,下面这个命令:

echo '{"foo": 0}' | /ky/tools/jq/jq-linux64 -e .bar

因为 “.bar” 在输入的JSON对象中不存在,所以过滤器的结果是 null,jq命令会返回非零的退出状态码。
在这里插入图片描述
反之如果执行:

echo '{"foo": 100}' | /ky/tools/jq/jq-linux64 -e .foo

jq命令会返回值为零的退出状态码(表示命令正常执行)。

在这里插入图片描述

这种特性通常用于错误检查或条件判断。比如,你可以通过检查jq命令的退出状态来判断某个JSON对象是否包含某个属性。

5. 使用 -s 选项将所有输入读取(slurp)到一个数组中,并对其应用过滤器

如果直接使用 jq . 命令来处理以下数据:

echo -e '{"name": "Alice"}\n{"name": "Bob"}' | jq .

输出结果如下:

{"name": "Alice"}
{"name": "Bob"}

在这里插入图片描述

然而,如果你想将所有输入数据看作一个整体来处理,你可以使用 jq -s . 命令,像这样:

echo -e '{"name": "Alice"}\n{"name": "Bob"}' | jq -s .

输出结果如下:

[
  {"name": "Alice"},
  {"name": "Bob"}
]

在这里插入图片描述

在这个例子中,-s 选项让jq把所有输入数据合并成了一个数组,然后再对这个数组进行处理。这里 -eecho 命令的一个参数,用于开启转义字符的解析,这样 \n 就能被识别为换行符,从而分隔多行的 JSON 数据。

6. 使用 -r 选项输出原始字符串,而非JSON文本

echo '{"foo": "bar"}' | jq -r .foo
echo '{"foo": "bar"}' | jq .foo

在这里插入图片描述

7. 使用 --arg a v 设置变量 $a 的值为 <v>

echo '{}' | jq --arg foo bar '. + {($foo): "value"}'

--arg a v 是 jq 命令的一个选项,它允许你在 jq 脚本中定义一个变量,并给它赋值。这个选项可以用来将 shell 脚本中的变量传递到 jq 脚本中。

例如(<<<是here string语法,用于将一个字符串传给jq命令,与管道类似):

jq --arg myVar value '. + {new_key: $myVar}' <<< '{}'

或者:

echo '{}' | jq --arg myVar value '. + {new_key: $myVar}'

这(两)个命令会创建一个新的 JSON 对象 {},然后添加一个新的键值对,其中键是 “new_key”,值是由 $myVar 变量指定的,即 “value”。所以,这个命令的输出结果是:

{
  "new_key": "value"
}

在这里插入图片描述

在这个例子中,--arg myVar value 的作用是在 jq 脚本中定义一个名为 myVar 的变量,并将其值设置为 “value”。然后,. + {new_key: $myVar} 这部分是 jq 脚本,它使用了刚刚定义的 myVar 变量。

8. 使用 --argjson a v 设置变量 $a 的值为 JSON <v>

echo '{}' | jq --argjson foo '{"bar": "baz"}' '. + $foo'

--argjson a v 是 jq 命令的一个选项,它允许在 jq 脚本中定义一个变量,并将一个 JSON 字符串赋值给它。这个选项在你需要将包含复杂数据(如数组或对象)的 JSON 字符串传递给 jq 脚本时非常有用。

例如:

jq --argjson myVar '{"key": "value"}' '. + {"foo": $myVar}' <<< '{}'

这个命令会创建一个新的 JSON 对象 {},然后添加一个新的键值对到foo字段下,其中键是 “key”,值是由 $myVar 变量指定的,即 “value”。所以,这个命令的输出结果是:

{
  "foo": {
    "key": "value"
  }
}

在这里插入图片描述

在这个例子中,--argjson myVar '{"key": "value"}' 的作用是在 jq 脚本中定义一个名为 myVar 的变量,并将其值设置为一个 JSON 对象 {"key": "value"}。然后,+ {"foo": $myVar} 这部分是 jq 脚本,它使用了刚刚定义的 myVar 变量。

--arg 不同,--argjson 会将输入字符串解析为 JSON,而不是将其视为普通的字符串。这使得你可以方便地处理包含数组或对象的复杂 JSON 数据。

9. 使用 --slurpfile a f 设置变量 $a 为从 <f> 读取的 JSON 文本数组

--slurpfile a fjq 命令的一个选项,它允许你从文件中读取 JSON 数据,并将数据存储到一个数组变量中。这个选项在你需要处理存储在文件中的大量 JSON 数据时非常有用。

例如,以下命令中:

jq -n --slurpfile data /ky_cont_img/hw/ky_ai_cont.json '. + {"data": $data}'

--slurpfile data /ky_cont_img/hw/ky_ai_cont.json 首先会从 /ky_cont_img/hw/ky_ai_cont.json 这个文件中读取所有的 JSON 数据,然后将这些数据合并成一个数组,并将这个数组赋值给 data 变量。

接下来,. + {"data": $data} 这部分是 jq 脚本,它创建了一个新的 JSON 对象,并添加了一个新的键值对,其中键是 “data”,值是由 $data 变量指定的,即刚刚从文件中读取的 JSON 数组。

所以,如果 /ky_cont_img/hw/ky_ai_cont.json 这个文件的内容是 [{"name": "Alice"}, {"name": "Bob"}],那么上述命令的输出结果就会是:

{
  "data": [
    {
      "name": "Alice"
    },
    {
      "name": "Bob"
    }
  ]
}

注意,对于命令jq -n --slurpfile data xxx.json '. + {"data": $data}',如果不加-n参数,执行将会卡住(hanging)

/ky/tools/jq/jq-linux64 --slurpfile data /ky_cont_img/hw/ky_ai_cont.json '. + {"data": $data}'

在这里插入图片描述

解决方法

解决办法是加-n参数(表示无输入),或者指定输入:

方法1:加-n参数
/ky/tools/jq/jq-linux64 -n --slurpfile data /ky_cont_img/hw/ky_ai_cont.json '. + {"data": $data}'

在这里插入图片描述

方法2:管道指定输入json
echo '{}' | /ky/tools/jq/jq-linux64 --slurpfile data /ky_cont_img/hw/ky_ai_cont.json '. + {"data": $data}'

在这里插入图片描述

方法3:用here string语法指定输入json

/ky/tools/jq/jq-linux64 --slurpfile data /ky_cont_img/hw/ky_ai_cont.json '. + {"data": $data}' <<< '{}'

在这里插入图片描述

10. 使用 --rawfile a f 设置变量 $a<f> 内容的字符串

--rawfile a fjq 命令的一个选项,用于将文件 <f> 的内容作为一个字符串读入到变量 $a 中。在这个命令中,a 是变量名,而 f 是你想要读取的文件的路径。

此选项的主要用途是允许你将一个文件的整个内容作为一个字符串处理,而不是试图将其解析为 JSON 数据。这在处理包含大量文本数据的文件时特别有用,因为你可以直接使用 jq 来处理这些文本,而不需要首先将它们转换为 JSON 格式。

例如,你可能有一个包含多行文本的文件,你想要将这个文件的内容添加到一个 JSON 对象中。使用 --rawfile 选项,你可以像这样做:

jq --rawfile text my_file.txt '. + {"text": $text}'

在这个例子中,my_file.txt 的内容会被读入到变量 $text 中,然后被添加到一个 JSON 对象中。最终的结果会是一个如下形式的 JSON 对象:

{
  "text": "the entire content of my_file.txt"
}

在这个 JSON 对象中,text 键对应的值就是 my_file.txt 文件的完整内容。

示例

echo "I'm a test file!" >> test.txt
/ky/tools/jq/jq-linux64 -n --rawfile text test.txt '. + {"text": $text}'

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS逆向之无限debugger对抗

文章目录 JS中实现debugger的方法无限Debugger示例Demo1Demo2Demo3Demo4总结 无限Debugger实战 JS中实现debugger的方法 首先&#xff0c;我们要知道&#xff0c;在浏览器实现debugger的方法有哪些 debugger关键词 &#xff0c;相当于C内联汇编的int3&#xff0c;在代码中嵌入…

进阶学习——Linux网络

目录 一、网络配置命令 1.ifconfig——IP地址 1.1ifconfig的基础用法 1.1.1ifconfig命令详解 1.2常用格式 1.3修改网卡名称 1.3.1临时修改 1.3.2永久修改 1.4临时修改网卡 1.4.1设置虚拟网卡 1.4.2延伸——ethtool 1.5永久修改网卡 1.6实验 —— 双网卡配置 1.…

C++ Primer 第五版 中文版 阅读笔记 + 个人思考

C Primer 第五版 中文版 阅读笔记 个人思考 第 10 章 泛型算法10.1 概述练习10.1练习10.2 第 10 章 泛型算法 泛型的体现&#xff1a;容器类型&#xff08;包括内置数组&#xff09;&#xff0c;元素类型&#xff0c;元素操作方法。 顺序容器定义的操作&#xff1a;insert&a…

计算机丢失mfc140.dll怎么办?解决mfc140.dll缺失的3种方法分享

计算机丢失mfc140.dll怎么办&#xff1f;在使用微软办公软件的时候&#xff0c;可能会弹出一个错误提示框说“找不到mfc140.dll&#xff0c;无法继续执行代码”。为了不影响工作效率&#xff0c;我们可能需要亲自动手尝试修复这一问题。以下是一些mfc140.dll缺失的3种方法相关介…

鸿蒙开发DevEco Studio搭建

DevEco Studio 安装 DevEco Studio 编辑器 下载&#xff1a;https://developer.harmonyos.com/cn/develop/deveco-studio#download Windows(64-bit)Mac(X86)Mac(ARM) 安装&#xff1a;DevEco Studio → 一路 Next运行&#xff1a; 基础安装&#xff1a;Node.js > 16.9.1…

powerdesigner导出sql将name放到comment注释上

1. 批量设置 2. 脚本 Option Explicit ValidationMode True InteractiveMode im_Batch Dim mdl the current modelget the current active model Set mdl ActiveModel If (mdl Is Nothing) ThenMsgBox"There is no current Model " ElseIf Not mdl.IsKindOf(PdPD…

数据结构-函数题

6-2.求二叉树的高度 本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定二叉树BT的高度值…

Tomcat源码解析(一): Tomcat整体架构

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a; Tomcat整体架构 目录 一、Tomcat整体架构1、Tomcat两个核心组件功能2、Tomcat支持的多种I/O模型和应用层协议 二、Connector连接器1、连接器功能汇总2、ProtocolHandler组件2.1、Endpoint2.2、Processor 3、Adapter组件 三…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

MySQL之导入、导出

文章目录 1.navicat导入导出2.mysqldump命令导入导出2.1导出2.2导入 3.load data infile命令导入导出4.远程备份5.思维导图 1.navicat导入导出 使用Navicat工具导入t_log 共耗时 55s 2.mysqldump命令导入导出 2.1导出 导出表数据和表结构 语法&#xff1a; mysqldump -u用…

sentinel入门,转载的,不记得在哪复制的了

sentinel 基本概念 开发的原因&#xff0c;需要对吞吐量&#xff08;TPS&#xff09;、QPS、并发数、响应时间&#xff08;RT&#xff09;几个概念做下了解&#xff0c;查自百度百科&#xff0c;记录如下&#xff1a; 响应时间(RT)   响应时间是指系统对请求作出响应的时间。…

网工内推 | 运维工程师,国企、上市公司,RHCE认证优先

01 广东机场白云信息科技股份有限公司 招聘岗位&#xff1a;基础架构运维工程师&#xff08;中级&#xff09; 职责描述&#xff1a; 1、参与公司业务系统的监控、巡检、维护、故障定位、原因分析&#xff1b; 2、负责业务系统的上线、升级割接工作&#xff1b; 3、负责服务器…

kubectlkubeletrancherhelmkubeadm这几个命令行工具是什么关系?

背景 在最近学习k8s的过程中&#xff0c;发现kubectl&kubelet&rancher&helm&kubeadm这几个命令怎么在交错使用&#xff0c;他们究竟是什么关系&#xff1f;他们分别应该在什么情况下使用呢&#xff1f;这里我进行了简单的总结&#xff0c;做个区分。 各工具说…

HarmonyOS 应用开发学习笔记 ets组件生命周期

HarmoryOS Ability页面的生命周期 Component自定义组件 ets组件生命周期官放文档 本文讲解 ets组件的生命周期&#xff0c;在此之前大家可以先去了解Ability的生命周期&#xff0c;这两个生命周期有有一定的关联性 在开始之前&#xff0c;我们先明确自定义组件和页面的关系&…

互斥、自旋、读写锁的应用场景

互斥、自旋、读写锁的应用场景 锁&#x1f512;1、互斥锁、自旋锁2、读写锁&#xff1a;读写的优先级3、乐观锁和悲观锁总结&#xff1a; 锁&#x1f512; ​ 多线程访问共享资源的生活&#xff0c;避免不了资源竞争而导致错乱的问题&#xff0c;所以我们通常为了解决这一问题…

YOLO物体检测-系列教程6:YOLOv5源码解析1

计算机视觉 全教程 目录 物体检测 系列教程 总目录 1、基本概述 YOLOv5没有一篇对应的论文&#xff0c;是一个对v4更好的实现v5版本是一个在github更新的基于工程项目的实现基本上和v4没有差异&#xff0c;只不过在整个项目上做出了更好的实现效果主要基于github的文档介绍来…

Selenium 学习(0.19)——软件测试之基本路径测试法——拓展案例

1、案例 请使用基本路径法为变量year设计测试用例&#xff0c;year的取值范围是1000<year<2001。代码如下&#xff1a; 2、步骤 先画控制流程图 再转化为控制流图&#xff08;标出节点&#xff09; V(G) 总区域数 4 V(G) E - N 2 (边数 - 节点数 2…

独占锁ReentrantLock的原理

类图结构 ReentrantLock是可重入的独占锁&#xff0c;同时只能有一个线程可以获取该锁&#xff0c;其他获取该锁的线程会被阻塞而被放入该锁的AQS阻塞队列里面。 首先看下ReentrantLock的类图以便对它的实现有个大致了解。 从类图可以看到&#xff0c;ReentrantLock最终还是使…

Pytest成魔之路 —— fixture 之大解剖!

1. 简介 fixture是pytest的一个闪光点&#xff0c;pytest要精通怎么能不学习fixture呢&#xff1f;跟着我一起深入学习fixture吧。其实unittest和nose都支持fixture&#xff0c;但是pytest做得更炫。 fixture是pytest特有的功能&#xff0c;它用pytest.fixture标识&#xff0c…

Unity Editor实用功能:Hierarchy面板的对象上绘制按按钮并响应

目录 需求描述上代码打个赏吧 需求描述 现在有这样一个需求&#xff1a; 在Hierarchy面板的对象上绘制按钮点击按钮&#xff0c;弹出菜单再点击菜单项目响应自定义操作在这里的响应主要是复制对象层级路路径 看具体效果请看动图&#xff1a; 注&#xff1a; 核心是对Edito…