Linux jq命令的使用解读

2025-11-11 22:50
文章标签 linux jq 解读 命令 使用

本文主要是介绍Linux jq命令的使用解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务...

一. 简介

jqlinux 中的命令行工具,用于处理 JSON 数据。

你可以把它看作是 JSON 的 sed 或 awk,可以用来查看、过滤、修改、格式化 JSON 数据。

Linux jq命令的使用解读

  • github 地址https://github.com/stedolan/jq
  • jq 官方网站https://stedolan.github.io/jq/
option解释
-r输出原始格式,而不是 JSON 编码 ⇒ 去掉字段带的"双引号
-R把输入当作原始字符串处理(Raw Input),而不是默认的 JSON 结构。
-c将内容压缩到一行输出。
-s将输入视为多个 JSON 对象,用于处理多个 JSON 对象的数组。
filter解释
.表示当前对象,用于访问字段或属性。
.fieldName选择指定字段的值。
[]用于遍历数组元素。
select(condition)根据条件选择元素。
map(transform)对数组中的每个元素应用转换操作。
格式转换解释
@csv输出 CSV 格式(数组)
@tsv输出 Tab 分隔格式
@json把值转成 JSON 字符串

二. 选项

2.1.

默认的格式化输出

apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | jq .
{
  "id": 1,
  "name": "zhangsan",
  "score": [
    75,
    85,
    90
  ]
}

2.2-c

-c选项将内容压缩到一行输出

apluser@FengYeHong-HP:~$ cat data2.json
{
  "id": 1,
  "name": "zhangsan",
  "score": [
    75,
    85,
    90
  ]
}
apluser@FengYeHong-HP:~$ cat data2.json | jq -c
{"id":1,"name":"zhangsan","score":[75,85,90]}

2.3-r

-r选项可以去掉字段两旁的"

apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | \
jq '.name' -r
zhangsan

2.4-R

  • 把输入当作原始字符串处理(Raw Input),而不是默认的 JSON 结构。
  • sed 's/"//g':将csv中的"给替换为空。
  • jq -R '[splits(",")]':将逗号分隔的文本行转成数组。
apluser@FengYeHong-HP:~$ cat data.txt
"id","name","age","score"
"1","zhangsan","17","75"
"2","lisi","16","80"
"3","wangwu","18","85"
"4","zhaoliu","18","90"
apluser@FengYeHong-HP:~$ awk 'NR > 1' data.txt | sed 's/"//g' | jq -R '[splits(",")]'
[
  "1",
  "zhangsan",
  "17",
  "75"
]
[
  "2",
  "lisi",
  "16",
  "80"
]
[
  "3",
  "wangwu",
  "18",
  "85"
]
[
  "4",
  "zhaoliu",
  "18",
  "90"
]

三. 字段提取

3.1 普通字段

提取单个字段

apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | \
> jq '.name'
"zhangsan"

提取多个字段

apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | \
jq '.id, .name'
1
"zhangsan"

提取嵌套字段

apluser@FengYeHong-HP:~$ cat data3.json
{
  "name": "Alice",
  "age": 26,
  "city": "New York",
  "iwww.chinasem.cnnfo": {
    "sub_id": 10,
    "sub_address": "地球",
    "sub_num_list": [100, 200, 300]
  }
}
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_address'
"地球"
# | 的管道符起到过滤作用
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info | .sub_address'
"地球"

3.2 数组字段

提取数组字段中的指定元素,支持切片提取(类似于python的list语法)

apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[0]'
100
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[1]'
200
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[2]'
300
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[0:2]'
[
  100,
  200
]

数组字段中的对象属性

apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '.items[].name'
"すてきな雑貨"
"格好いい置物"
apluser@FengYeHong-HP:~$ cat data1.json
[
  {
    "name": "Alice",
    "age": 25,
    "city": "New York"
  },
  {
    "name": "Bob",
    "age": 30,
    "city": "Los Angeles"
  },
  {
    "name": "Charlie",
    "age": 22,
    "city": "Chicago"
  }
]
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | .age'
25
30
22
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[].age'
25
30
22

数组展开

apluser@FengYeHong-HP:~$ echo -n '[75, 85, 90]' | jq '.[]'
75
85
90

四. 编辑

4.1 字段更新

更新一个字段

apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '.name = "贾飞天"'
{
  "name": "贾飞天",
  "age": 25,
  "city": "New York"
}

更新多个字段

apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '. += {"name":"贾飞天", "age":26}'
{
  "name": "贾飞天",
  "age": 26,
  "city": "New York"
}

4.2 字段追加

追加一个字段

apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '.country = "USA"'
{
  "name": "Alice",
  "age": 25,
  "city": "New York",
  "country": "USA"
}

追加一个字段的同时,修改既存的字段

apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '.country = "USA" | .age = 50'
{
  "name": "Alice",
  "age": 50,
  "city": "New York",
  "country": "USA"
}

4.3 字段删除

删除一个字段

apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq 'del(.city)'
{
  "name": "Alice",
  "age": 25
}

4.4 转换为csv格式

apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq .
{
  "items": [
    {
      "item_id": 1,
      "name": "すてきな雑貨",
      "price": 2500
    },
    {
      "item_id": 2,
      "name": "格好いい置物",
      "price": 4500
    },
    {
      "item_id": 3,
      "name": "ナイスなお皿",
      "price": 4500
    }
  ]
}
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '.items[] | [.item_id, .name, .price] | @csv' -r
1,"すてきな雑貨",2500
2,"格好いい置物",4500
3,"ナイスなお皿",4500

五. 过滤

5.1 字段整合

apluser@FengYeHong-HP:~$ echo '{"iteChina编程ms":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '.items[] | { name: .name, yen: .price }'
{
  "name": "すてきな雑貨",
  "yen": 2500
}
{
  "name": "格好いい置物",
  "yen": 4500
}

5.2 select过滤

一个条件

apluser@FengYeHong-HP:~$ cat data1.json
[
  {
    "name": "Alice",
    "age": 25,
    "city": "New York"
  },
  {
    "name": "Bob",
    "age": 30,
    "city": "Los Angeles"
  },
  {
    "name": "Charlie",
    "age": 22,
    "city": "Chicago"
  }
]
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | select(.age >= 25) | .name, .city'
"Alice"
"New York"
"Bob"
"Los Angeles"
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | select(.age >= 25) | .name, .city' | paste -d "," - -
"Alice","New York"
"Bob","Los Angeles"

多个条件

apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city' | sort
"Alice"
"Bob"
"Los Angeles"
"New York"

六. 函数

6.1 统计函数

6.1.1 add

apluser@FengYeHong-HP:~$ echo '1 2 3 4' | jq -s 'add'
10
apluser@FengYeHong-HP:~$ seq 4 | jq -s 'add'
10
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '[.items[].price]'
[
  2500,
  4500
]
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '[.items[].price] | add'
7000

6.1.2 map

apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '.items | map({ name: .name, yen: .price })'
[
  {
    "name": "すてきな雑貨",
    "yen": 2500
  },
  {
    "name": "格好いい置物",
    "yen": 4500
  }
]
apluser@FengYeHong-HP:~$ seq 4 | jq -s 'map(tostring) | join(",")'
"1,2,3,4"

6.1.3 reduce

apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | jq '.items[]'
{
  "item_id": 1,
  "name": "すてきな雑貨",
  "price": 2500
}
{
  "item_id": 2,
  "name": "格好いい置物",
  "price": js4500
}
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq 'reduce .items[] as $item (0; . + $item.price)'
7000

6.1.4 unique

apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '[.items[].price]'
[
  2500,
  4500,
  4500
]
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いいwww.chinasem.cn置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '[.items[].price] | unique'
[
  2500,
  4500
]

6.1.5 length

apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '.items'
[
  {
    "item_id": 1,
    "name": "すてきな雑貨",
    "price": 2500
  },
  {
    "item_id": 2,
    "name": "格好いい置物",
    "price": 4500
  },
  {
    "item_id": 3,
    "name": "ナイスなお皿",
    "price": 4500
  }
]
apluser@FengYeHong-HP:~$ echo '{"items":[{"编程China编程item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '.items | length'
3

6.2 字符串函数

6.2.1 contains

apluser@FengYeHong-HP:~$ echo hello | jq -R 'contains("he")'
true

6.2.2startswith/endswith

apluser@FengYeHong-HP:~$ echo hello | jq -R 'startswith("he")'
true
apluser@FengYeHong-HP:~$ echo hello | jq -R 'endswith("llo")'
true

6.2.3ltrimstr/rtrimstr

apluser@FengYeHong-HP:~$ echo ' hello ' | jq -R 'ltrimstr(" ") | rtrimstr(" ")' -r
hello

6.2.4 大小写转换

apluser@FengYeHong-HP:~$ echo hello | jq -R 'ascii_downcase' -r
hello
apluser@FengYeHong-HP:~$ echo hello | jq -R 'ascii_upcase' -r
HELLO

6.2.5 json对象与json字符串转换

json字符串 ⇒ json对象

apluser@FengYeHong-HP:~$ echo -n '{"id":1,"name":"zhangsan","age":"17","attr":"{\"weight\":56,\"height\":178}"}' | \
jq '.attr = (.attr|fromjson)'
{
  "id": 1,
  "name": "zhangsan",
  "age": "17",
  "attr": {
    "weight": 56,
    "height": 178
  }
}

json对象 ⇒ json字符串

apluser@FengYeHong-HP:~$ echo -n '{"id":1,"name":"zhangsan","age":"17","attr":{"weight":56,"height":178}}' | \
jq '.attr = (.attr|tojson)'
{
  "id": 1,
  "name": "zhangsan",
  "age": "17",
  "attr": "{\"weight\":56,\"height\":178}"
}
apluser@FengYeHong-HP:~$ echo -n '{"id":1,"name":"zhangsan","age":"17","attr":{"weight":56,"height":178}}' | \
jq '.attr = (.attr|tojson)' -c
{"id":1,"name":"zhangsan","age":"17","attr":"{\"weight\":56,\"height\":178}"}

6.3 字段

apluser@FengYeHong-HP:~$ cat data3.json
{
  "name": "Alice",
  "age": 26,
  "city": "New York",
  "info": {
    "sub_id": 10,
    "sub_address": "地球",
    "sub_num_list": [100, 200, 300]
  }
}

6.3.1 keys

  • 获取所有key
apluser@FengYeHong-HP:~$ cat data3.json | jq '. | keys'
[
  "age",
  "city",
  "info",
  "name"
]

6.3.2 values

  • 获取所有value
  • jq-1.6.values方法不好用,此处用[.[]]开替代
apluser@FengYeHong-HP:~$ jq --version
jq-1.6
apluser@FengYeHong-HP:~$ cat data3.json | jq '[.[]]'
[
  "Alice",
  26,
  "New York",
  {
    "sub_id": 10,
    "sub_address": "地球",
    "sub_num_list": [
      100,
      200,
      300
    ]
  }
]

6.3.3 to_entries

  • 转换为键值对数组
apluser@FengYeHong-HP:~$ cat data3.json | jq '. | to_entries'
[
  {
    "key": "name",
    "value": "Alice"
  },
  {
    "key": "age",
    "value": 26
  },
  {
    "key": "city",
    "value": "New York"
  },
  {
    "key": "info",
    "value": {
      "sub_id": 10,
      "sub_address": "地球",
      "sub_num_list": [
        100,
        200,
        300
      ]
    }
  }
]

七. 排序

排序之前

apluser@FengYeHong-HP:~$ echo '[{"name": "Tom", "age": 25},{"name": "Jerry", "age": 18},{"name": "Alice", "age": 30}]' | jq
[
  {
    "name": "Tom",
    "age": 25
  },
  {
    "name": "Jerry",
    "age": 18
  },
  {
    "name": "Alice",
    "age": 30
  }
]

按照指定 字段(age) 升序排序

apluser@FengYeHong-HP:~$ echo '[{"name": "Tom", "age": 25},{"name": "Jerry", "age": 18},{"name": "Alice", "age": 30}]' | \
jq 'sort_by(.age)'
[
  {
    "name": "Jerry",
    "age": 18
  },
  {
    "name": "Tom",
    "age": 25
  },
  {
    "name": "Alice",
    "age": 30
  }
]

按照指定 字段(age) 降序排序

apluser@FengYeHong-HP:~$ echo '[{"name": "Tom", "age": 25},{"name": "Jerry", "age": 18},{"name": "Alice", "age": 30}]' | \
jq 'sort_by(.age) | reverse'
[
  {
    "name": "Alice",
    "age": 30
  },
  {
    "name": "Tom",
    "age": 25
  },
  {
    "name": "Jerry",
    "age": 18
  }
]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Linux jq命令的使用解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156133

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他