51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Linux下jq命令详解

Json文件

对象是属性、值的集合。一个对象开始与"{" ,结束于"}"。每一个属性名和值间用":"分隔。每个属性间用","分隔。
值可以是字符串,数字,逻辑值,数组,对象,null。 数字:整数或浮点数 字符串:在双引号中 逻辑符:true和false
数组:在方括号中 对象:在花括号中 null: 代表空

示范

  • jq "." 解析全部内容
  • jq ".name,.id" 解析key为name和id的value ,为分隔符,基于当前
一般使用
{"name":"lolicp","id":68,"url":"https://lolicp.com"}
解析Json格式文件内容
[root@Frpd-vip ~]# jq . a
{
  "name": "lolicp",
  "id": 68,
  "url": "https://lolicp.com"
}
解析指定key内容
[root@Frpd-vip ~]# jq .name a
"lolicp"
[root@Frpd-vip ~]# jq .name,.id a
"lolicp"
68
常规
  • jq ".name_list|.[].name,.[].id" 解析指定key值,当有[]时需|进行分割
{"name_list":[{"name":"zhangsan","id":12},{"name":"lisi","id":13}],"id":68,"url":"https://lolicp.com"}
[root@Frpd-vip ~]# jq . a
{
  "name_list": [
    {
      "name": "zhangsan",
      "id": 12
    },
    {
      "name": "lisi",
      "id": 13
    }
  ],
  "id": 68,
  "url": "https://lolicp.com"
}
[root@Frpd-vip ~]# jq ".name_list|.[].name,.[].id" a
"zhangsan"
"lisi"
12
13
[root@Frpd-vip ~]# jq ".name_list|.[]|.name,.id" a
"zhangsan"
12
"lisi"
13
添加或更新字段

可以添加或更新 JSON 对象中的字段:

[root@lolicp.com ~]# jq '.id = 11|.ida = 22' a
{
  "name": "lolicp",
  "id": 11,
  "url": "https://lolicp.com",
  "ida": 22
}
删除字段

可以删除 JSON 对象中的某个字段:

[root@lolicp ~]# jq 'del(.id)' a
{
  "name": "lolicp",
  "url": "https://lolicp.com"
}
重新指定输出内容
  • jq ".name_list|.[]|{mingcheng:.name,yonghuid:.id}" 将[]中的内容进行重输出
[root@Frpd-vip ~]# jq ".name_list|.[]|{mingcheng:.name,yonghuid:.id}" a
{
  "mingcheng": "zhangsan",
  "yonghuid": 12
}
{
  "mingcheng": "lisi",
  "yonghuid": 13
}
[root@Frpd-vip ~]# jq ".name_list|.[]|{mingcheng:.name,yonghuid:.id,xinzeng:\"codedd\",xinzen2:12}" a
{
  "mingcheng": "zhangsan",
  "yonghuid": 12,
  "xinzeng": "codedd",
  "xinzen2": 12
}
{
  "mingcheng": "lisi",
  "yonghuid": 13,
  "xinzeng": "codedd",
  "xinzen2": 12
}
过滤字段

根据条件匹配指定关键字:

[root@lolicp ~]# cat a
[
  {"name": "xianyun", "age": 30},
  {"name": "lolicp", "age": 25},
  {"name": "loli", "age": 22}
]
[root@lolicp ~]# jq '.[] | select(.age > 25)' a
{
  "name": "xianyun",
  "age": 30
}

指定名字

[root@lolicp ~]# jq '.[]|select(.name =="xianyun")' a
{
  "name": "xianyun",
  "age": 30
}
指定数值处理
[root@lolicp ~]# jq '.[].age += 1' a
[
  {
    "name": "xianyun",
    "age": 31
  },
  {
    "name": "lolicp",
    "age": 26
  },
  {
    "name": "loli",
    "age": 23
  }
]
高级用法
使用变量

使用变量来简化复杂的查询:

jq --arg city "New York" '.address.city = $city' data.json
复杂过滤

组合多个条件进行复杂过滤:

jq '.[] | select(.age > 25 and .name == "John")' array.json
格式化输出

美化 JSON 输出:

jq '.' data.json > pretty.json
合并多个 JSON 文件

假设有两个 JSON 文件 file1.jsonfile2.json

jq -s '.[0] * .[1]' file1.json file2.json

当然可以,以下是更多 jq 命令的高级用法和示例,以便于更深入地进行教学。

高级过滤和转换
条件表达式

使用条件表达式进行更复杂的处理:

{
  "users": [
    {"name": "John", "age": 30},
    {"name": "Jane", "age": 25},
    {"name": "Doe", "age": 22}
  ]
}

选择年龄大于 25 的用户,并标记其为成年人:

jq '.users[] | if .age > 25 then .adult = true else .adult = false end' users.json
多条件过滤

对 JSON 对象中的元素进行多条件过滤:

jq '.users[] | select(.age > 20 and .name | test("J"))' users.json
包含检查

检查某个 JSON 对象是否包含特定的键:

jq 'has("name")' data.json

对于数组中的元素:

jq '.users[] | select(has("name"))' users.json
数组和对象操作
分组和聚合

对数组中的元素进行分组和聚合:

[
  {"name": "John", "age": 30, "group": "A"},
  {"name": "Jane", "age": 25, "group": "B"},
  {"name": "Doe", "age": 22, "group": "A"}
]

按照 group 字段分组:

jq 'group_by(.group) | map({group: .[0].group, members: .})' array.json
数组拆分

将数组拆分成两个部分:

jq 'split_at(2)' array.json
数组连接

将多个数组连接成一个数组:

[
  {"name": "John"},
  {"name": "Jane"}
]
[
  {"age": 30},
  {"age": 25}
]

连接两个 JSON 文件:

jq -s '.[0] + .[1]' file1.json file2.json
高级 JSON 构建
构建复杂的 JSON 结构

从简单的数据构建复杂的 JSON 结构:

jq -n '{
  users: [
    {name: "John", age: 30},
    {name: "Jane", age: 25}
  ]
}'
生成序列

生成一个数值序列:

jq -n '[range(5)]'
字符串操作

对 JSON 数据中的字符串进行操作,例如拼接:

jq '.name + " Doe"' data.json
文件操作
读取多个文件

可以一次性读取多个 JSON 文件并进行处理:

jq -s '.[0] + .[1]' file1.json file2.json
导出为文件

将处理结果导出到文件中:

jq '.' data.json > output.json
使用模块
导入模块

jq 支持模块化,通过导入模块进行代码重用。假设有一个模块文件 module.jq

# module.jq
def double: . * 2;

使用模块:

jq --argfile mod module.jq -n 'import $mod as m; m::double(4)'
错误处理和调试
错误处理

处理可能出现的错误,例如:

jq 'try .name catch "No name found"' data.json
调试输出

在复杂查询中添加调试输出:

jq 'debug' data.json
其他实用技巧
字符串转义

处理包含特殊字符的字符串:

jq -R 'split("\n")' <<< 'line1\nline2\nline3'
日期处理

假设有一个包含日期的 JSON 文件 dates.json

[
  "2023-01-01T12:00:00Z",
  "2024-01-01T12:00:00Z"
]

转换日期格式:

jq '.[].date = (.[] | fromdateiso8601 | todate)' dates.json
条件计数

计算满足特定条件的元素个数:

jq '[.[] | select(.age > 25)] | length' array.json
赞(2)
未经允许不得转载:工具盒子 » Linux下jq命令详解