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

文章目录

  • 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/jqExample:$ 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.mzph.cn/news/620173.shtml

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

相关文章

STL——stack容器和queue容器详解

目录 &#x1f4a1;stack &#x1f4a1;基本概念 常用接口 &#x1f4a1;queue &#x1f4a1;基本概念 &#x1f4a1;常用接口 &#x1f4a1;stack &#x1f4a1;基本概念 栈&#xff08;stack&#xff09;&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端…

OpenGL 网格拾取坐标(Qt)

文章目录 一、简介二、代码实现三、实现效果参考资料一、简介 有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就…

pyside6 捕捉主窗口关闭后,进行释放相关的资源

import sys from PySide6 import QtGui from PySide6.QtWidgets import QWidget,QApplication,QMessageBoxclass Message(QWidget):def __init__(self):# 如果希望窗口内嵌于其他部件&#xff0c;可添加parent参数super(Message, self).__init__()# 调用初始化方法self.initUI(…

Python基本语法与变量的相关介绍

python基本语法与变量 python语句的缩进 Python代码块使用缩进对齐表示代码逻辑&#xff0c;Python每段代码块缩进的空白数量可以任意&#xff0c;但要确保同段代码块语句必须包含相同的缩进空白数量。建议在代码块的每个缩进层次使用单个制表符或两个空格或四个空格 , 切记不…

flutter使用get库管理路由,并设页面跳转动画和常见动画

get库还是非常强大的一个仓库&#xff0c;里面包含了非常常用的一些方法&#xff0c;比如路由管理&#xff0c;这是最常见和最常用的一个功能了&#xff0c;我们可以先配置一个路由对象&#xff0c;然后在里面配置路由列表&#xff0c;并且设置路由跳转方式。 第一种方式&…

教师资格证照片分辨率怎么调?教师资格证上传照片要求

最近教师资格证考试开始报名了&#xff0c;在报名之前需要准备好一些必备的材料&#xff0c;比如证件照片&#xff0c;报名考试平台一般都会对上传的证件照有具体的要求&#xff0c;比如考生本人近6个月以内的免冠正面证件照&#xff1b;照片格式及大小&#xff1a;JPG/JPEG格式…

Springboot读取配置文件

多种配置文件格式 springboot项目中不同配置文件的优先加载顺序 为&#xff1a;properties> yml >yaml>自定义核心类配置 自定义配置文件的加载 一般系统会加载默认的application.properties或者application.yml,但如果使用自定义配置文件&#xff0c;可使用下面方…

SpringSecurity入门demo(二)表单认证

上一篇博客集成 Spring Security&#xff0c;使用其默认生效的 HTTP 基本认证保护 URL 资源&#xff0c;下面使用表单认证来保护 URL 资源。 一、默认表单认证&#xff1a; 代码改动&#xff1a;自定义WebSecurityConfig配置类 package com.security.demo.config; import or…

Next.js 集成 Auth0 登入和自定义登入页面

Next.js 集成 Auth0 和自定义登入页面 注册账号和基本配置进入 auth0 官网注册账号并登入进入控制台后访问 Applications/Applications进入程序配置页面添加配置 在 Next.js 使用在项目中集成 通过 Auth0Lock 配置方式自定义登入页面效果展示实现过程 注册账号和基本配置 进入…

scroll-view在小程序页面里实现滚动,uniapp项目

要实现红框中的区域进行滚动,scroll-view必须写高 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><textv-for"(ite…

Alibaba-> EasyExcel 整理3

1 导入依赖 <!-- easyExcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version >3.2.1</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</art…

what is BERT?

BERT Introduction Paper 参考博客 9781838821593_ColorImages.pdf (packt-cdn.com) Bidirectional Encoder Representation from Transformer 来自Transformer的双向编码器表征 基于上下文&#xff08;context-based&#xff09;的嵌入模型。 那么基于上下文&#xff08;…

【MySQL性能优化】- MySQL结构与SQL执行过程

MySQL结构与SQL执行过程 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正…

开源了一款Vue3 Ts Vite4 uni-app 驱动的跨端快速启动模板

一、开源项目简介 由 Vue3 & Ts & Vite4 & uni-app 驱动的跨端快速启动模板。推荐使用 VSCode 编辑器开发&#xff0c;集成了 Prettier ESLint StyleLint husky lint-staged commitlint UnoCSS Vue3 TypeScript Vite4 setup&#xff0c;开箱即用。 二、…

【计算机组成原理】程序的转换及机器级表示 常用计算机术语英文缩写汇总

编码 二进制编码的十进制数&#xff08;BCD&#xff09;&#xff1a;Binary Coded Decimal美国信息交换标准代码&#xff08;ASCII&#xff09;&#xff1a;American Standard Code for Information Interchange 数据的排列顺序 最低有效位&#xff08;LSB&#xff09;&…

全链路追踪关键技术-TraceId、SpanId生成规则

链路追踪的traceid原理梳理 如何追踪微服务调用&#xff1f; ● traceId&#xff0c;用于标识某一次具体的请求ID。当用户的请求进入系统后&#xff0c;会在RPC调用网络的第一层生成一个全局唯一的traceId&#xff0c;并且会随着每一层的RPC调用&#xff0c;不断往后传递&…

day17 平衡二叉树 二叉树的所有路径 左叶子之和

题目1&#xff1a;110 平衡二叉树 题目链接&#xff1a;110 平衡二叉树 题意 判断二叉树是否为平衡二叉树&#xff08;每个节点的左右两个子树的高度差绝对值不超过1&#xff09; 递归遍历 递归三部曲 1&#xff09;确定递归函数的参数和返回值 2&#xff09;确定终止条…

uniapp小程序当页面内容超出时显示滚动条,不超出时不显示---样式自定义

使用scroll-view中的show-scrollbar属性 注意:需要搭配enhanced使用 否则无效 <scroll-view class"contentshow" scroll-y :show-scrollbartrue :enhancedtrue><view class"content" :show-scrollbartrue><text>{{vehicleCartinfo}}<…

【动态规划】LeetCode-42. 接雨水

42. 接雨水。 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1…

Quartus 软件界面介绍与部分使用技巧

内容太多&#xff0c;只能慢慢补充完善了~ 对一个软件的熟练掌握&#xff0c;不仅在于完成项目工程&#xff0c;还在于对一个软件的各个功能的位置与使用要熟稔于心&#xff08;个人看法&#xff09;。 软件界面 默认打开的软件界面如下&#xff1a; 关掉所有能关闭的窗口&am…