linux命令下jq的用法(curl 格式化输出json 字符串)

本文深入讲解了jq命令的安装、基本语法及如何从JSON文件中筛选特定属性值,演示了排除null值的操作,并展示了如何格式化输出JSON字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是jq命令

官网下载: https://stedolan.github.io/jq/download/

jq可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样,都可以让你轻松地把玩文本。它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的更加简短。
jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;在linux系统中也可以直接用yum安装。

jq常用在从json中解析出过滤出自己想要的属性值、格式化json字符串输出。

1. jq安装

centos yum安装

yum install  jq

Ubuntu可以直接用apt安装

sudo apt-get install jq

2. jq命令的格式

jq [options] filter [files]
options:
–version:输出jq的版本信息并退出
–slurp/-s:读入整个输入流到一个数组。
–raw-input/-R:不作为JSON解析,将每一行的文本作为字符串输出到屏幕。
–null-input/ -n:不读取任何输入,过滤器运行使用null作为输入。一般用作从头构建JSON数据。
–compact-output /-c:使输出紧凑,而不是把每一个JSON对象输出在一行。
–colour-output / -C:打开颜色显示
–monochrome-output / -M:关闭颜色显示
–ascii-output /-a:指定输出格式为ASCII
–raw-output /-r :如果过滤的结果是一个字符串,那么直接写到标准输出(去掉字符串的引号)

filter:
. : 默认输出
.foo: 输出指定属性,foo代表属性。
.[foo] :输出指定数组元素。foo代表数组下标。
.[]:输出指定数组中全部元素
, :指定多个属性作为过滤条件时,用逗号分隔
| : 将指定的数组元素中的某个属性作为过滤条件

files:
JOSN格式文件。

从json文件 对象数组中取出一组特定的属性的值

举例:
从json文件 对象数组中取出一组特定的属性的值。

[root@VM_0_14_centos ~]# jq -r '.[].rustc_target_feature' < "./rustc-target-features-optimized.json"
+adx
+sha
+sse2
+avx2
+avx
+sse4.2
+sse4.1
[root@VM_0_14_centos ~]# 

rustc-target-features-optimized.json文件内容:

[
  {
    "rustc_target_feature": "+adx",
    "check_cpu_for_feature": "adx"
  },
  {
    "rustc_target_feature": "+sha",
    "check_cpu_for_feature": null
  },
  {
    "rustc_target_feature": "+sse2",
    "check_cpu_for_feature": "sse2"
  },
  {
    "rustc_target_feature": "+avx2",
    "check_cpu_for_feature": "avx2"
  },
  {
    "rustc_target_feature": "+avx",
    "check_cpu_for_feature": "avx"
  },
  {
    "rustc_target_feature": "+sse4.2",
    "check_cpu_for_feature": "sse4_2"
  },
  {
    "rustc_target_feature": "+sse4.1",
    "check_cpu_for_feature": "sse4_1"
  }
]

在shell 脚本 中,我们可以执行结果 复制给某个变量。例如:

optimized_release_rustc_target_features=$(jq -r '.[].rustc_target_feature' < "./rustc-target-features-optimized.json")

它的结果如下,就是你的jq执行结果字符串,使用单引号括起来。

optimized_release_rustc_target_features='+adx
+sha
+sse2
+avx2
+avx
sse4.2
+sse4.1'
从json文件 对象数组中取出一组特定的属性的值,并排除null值

举例: 从json文件 对象数组中取出一组特定的属性的值,并排除值是null的

如下,json还是刚才的json文件,我们这次取的是 check_cpu_for_feature 属性的值 通过 | select(. != null)’ 排除了一个值为null值。

cpu_features_required_for_optimized_release=$(jq -r '.[].check_cpu_for_feature | select(. != null)' < "./rustc-target-features-optimized.json")

结果如下:

cpu_features_required_for_optimized_release='adx
sse2
avx2
avx
sse4_2
sse4_1'
格式化输出json 字符串
[root@VM_0_14_centos ~]# echo '{"name":"she","age":20}' |jq
{
  "name": "she",
  "age": 20
}
[root@VM_0_14_centos ~]# 
### 创建和处理 JSON 格式的请求或响应数据包 #### 使用 `curl` 发送带有 JSON 数据的 HTTP 请求 在 Linux 下可以通过命令行工具 `curl` 来发送包含 JSON 负载的 HTTP 请求。为了确保服务器能够正确识别并解析这些负载,在发起请求时需指定合适的 MIME 类型。 对于 POST 方法而言,可利用 `-d` 参数传递要提交的数据,并通过 `-H` 参数设定必要的头部信息: ```bash curl -d '{"key":"value"}' \ http://example.com/api/endpoint ``` 上述命令向目标 URL 发起了一个携带 JSON 对象 `{ "key": "value" }` 的 POST 请求[^4]。 #### 利用编程语言库来构建复杂的 JSON 结构 当面对更复杂的应用场景时,建议采用支持 JSON 序列化的高级编程语言及其配套库来进行开发工作。Python 是一种流行的选择之一,它内置了 json 模块用于轻松转换 Python 字典与 JSON 文本之间相互转化。 下面是一个简单的例子展示怎样借助 requests 和 json 这两个模块完成同样的任务: ```python import requests import json url = 'http://example.com/api/endpoint' payload = {'key': 'value'} headers = { 'content-type': "application/json", } response = requests.post(url, data=json.dumps(payload), headers=headers) print(response.text) ``` 这段脚本同样实现了向特定地址推送 JSON 编码后的键值对的操作[^3]。 #### 解析接收到的 JSON 响应内容 无论是哪种方式获取到的服务端返回结果,只要是以 JSON 形式呈现出来的字符串形式,则都可以调用相应的方法将其转回易于操作的对象结构以便后续逻辑处理。比如继续沿用上面提到过的 python 示例的话,就可以直接访问 response.json() 得到字典型的结果集;而对于 shell 中的情况来说则可能需要用到 jq 工具辅助解析输出流里的 JSON 片段[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值