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/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.mfbz.cn/a/305482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

podman configure insecure certificate registry【podman 设置非安全镜像仓库】

预备条件 docker registry仓库私搭并配置证书centos 7.9 部署 harbor 镜像仓库实践harbor 部署入门指南Podman 部署私有镜像仓库 设置 $ vim /etc/hosts 192.168.23.47 registry.ghostwritten.com$ vim /etc/containers/registries.conf ... [[registry]] location "r…

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

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

RequestMapping注解的使用和常见的GET和POST请求方式

RequestMapping注解的使用和常见的GET和POST请求方式 1、使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的话需要以/开头。它…

家用洗地机哪款性价比高,口碑最好的洗地机推荐

随着社会生活水平的提高和人们对卫生的迫切关注&#xff0c;洗地机在家庭清洁中扮演着至关重要的角色。其成为现代生活中的清洁利器&#xff0c;既满足了人们对卫生的需求&#xff0c;又符合人们对清洁方式的追求。但是面对市面上满目琳琅的洗地机品牌&#xff0c;究竟如何选呢…

linux开发板静态IP无法ping通外网

硬件平台&#xff1a;韦东山的6ull开发板 问题&#xff1a; 使用网线直连路由器&#xff0c;动态获取IP时能ping通外网&#xff1b; 改为静态IP时&#xff0c;能ping通局域网&#xff0c;但无法ping通外网。 改为静态IP&#xff1a;修改/etc/network/interfaces 测试&#…

【Kubernetes】如何使用 kubectl 操作 cluster、node、namespace、pod

如何使用 kubectl 操作 cluster、node、namespace、pod 在列出、描述、修改或删除其他命名空间中的对象时&#xff0c;需要给 kubectl 命令传递 --namespace&#xff08;或 -n&#xff09;选项。如果不指定命名空间&#xff0c;kubectl 将在当前上下文中配置的默认命名空间中执…

Unity 利用UGUI之Scrollbar制作进度条

在Unity中除了用Slider、Image做进度条&#xff0c;其实用Scrollbar也可以做进度条。 首先&#xff0c;在场景中新建一个Scrollbar组件和一个Text组件&#xff1a; 其次&#xff0c;创建模拟进度的一个脚本&#xff0c;Scrollbar_Progressbar.cs: using System.Collections; …

深度解析HubSpot数据分析:洞察未来商业趋势

在当今数字化的商业环境中&#xff0c;数据是推动决策和业务增长的关键。作为业内领先的CRM平台&#xff0c;HubSpot不仅为企业提供了高效的客户关系管理工具&#xff0c;同时也成为了数据分析的利器。 1. HubSpot数据分析的核心价值 1.1 洞察客户行为和趋势 HubSpot数据分析…

歌手荆涛演唱的春节回家:传统与现代的交织,歌声里的乡愁与期盼

随着冬日渐寒&#xff0c;春节的脚步愈发临近。这是一个充满温馨与期待的时刻&#xff0c;一个穿越时空、凝聚亿万华夏儿女情感的盛大节日。春节&#xff0c;它不仅仅是一个传统习俗的展现&#xff0c;更是一种心灵的归宿&#xff0c;一种文化的传承。 在悠久的历史长河中&…

【博士每天一篇论文-综述】Brain Inspired Computing : A Systematic Survey and Future Trends

阅读时间&#xff1a;2023-11-17 1 介绍 年份&#xff1a;2023 作者&#xff1a;李国琪 期刊&#xff1a;TechRxiv 引用量&#xff1a;2 这篇论文主要介绍了脑启发计算&#xff08;Brain Inspired Computing&#xff0c;BIC&#xff09;以及其在人工智能&#xff08;Artifici…

【HarmonyOS】掌握 Stage 模型的核心概念与应用

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

JS逆向之无限debugger对抗

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

【Flutter】webview页面访问不了 显示err_cleartext_not_permitted

在AndroidManifest.xml中添加语句 android:usesCleartextTraffic"true"位置如图&#xff1a;

Python 使用input函数从键盘输入数据

在Python中&#xff0c;input()函数可以从键盘获取用户的输入数据。当我们使用input()函数时&#xff0c;会暂停程序的执行&#xff0c;等待用户输入数据&#xff0c;并将用户输入的数据作为字符串返回。 如&#xff1a; name input("请输入你的姓名&#xff1a;"…

2024年1月10日 十二生肖 今日运势

小运播报&#xff1a;2024年1月10日&#xff0c;星期三&#xff0c;农历十一月廿九 &#xff08;癸卯年乙丑月癸酉日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;龙、牛、蛇 需要注意&#xff1a;鸡、狗、兔 喜神方位&#xff1a;东南方 财神方位&#xff1…

扩展学习|数据融合助推商务智能与分析

文献来源&#xff1a;[1]李爱华,续维佳,石勇.基于数据融合的商务智能与分析架构研究[J].计算机科学,2022,49(12):185-194. 一、信息融合 &#xff08;一&#xff09;信息融合定义演变 早期信息融合的定义指出&#xff0c;其主要任务是综合分析若干传感器观测到的信息[9,…

pod探针2:

就绪探针演示&#xff1a; 演示探针失败 存活探针&#xff08;livenessProde&#xff09;&#xff1a;探测容器是否是否运行正常&#xff0c;如果探测失败则kubelet杀掉容器&#xff08;不是Pod&#xff09;&#xff0c;容器会根据重启策略决定是否重启 就绪探针&#xff08;re…

LINE网页版使用方法(内含LINE网页版特点总结)

如果想要在电脑上使用LINE&#xff0c;但是又觉得下载客户端很累赘的话&#xff0c;LINE网页版是你最好的选择。但是LINE网页版相对于其他平台来说使用方式比较少。所以今天就来讲讲&#xff0c;我们有什么方式可以在电脑中使用LINE。 LINE网页版使用方法 1.需要使用Chrome浏览…

Nginx配置反向代理实例一

Mac 安装Nginx教程 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 反向代理实例一实现的效果 在浏览器地址栏输入www.testproxy.com, 跳转到系统Tomcat主页面。 反向代理准备工作 第一步&#xff1a;在系统的 hosts 文件进行ip和域名对应关系的配置。 …