首页 > 系统相关 >Linux jq 命令讲解与实战操作(json字符串解析工具)

Linux jq 命令讲解与实战操作(json字符串解析工具)

时间:2024-07-12 11:53:35浏览次数:10  
标签:age JSON jq cat json Linux data

Linux jq 命令讲解与实战操作(json字符串解析工具) 大数据老司机2023-08-09 14:23  

一、概述

jq 是一个强大的命令行工具,用于处理 JSON 格式的数据。它可以帮助你查询、过滤、修改和处理 JSON 数据,使得在命令行环境下处理 JSON 变得非常方便。


GitHub 地址:https://github.com/stedolan/jq
jq 官方网站: https://stedolan.github.io/jq/

二、jq 命令安装

yum install epel-releaseyum install -y jq

三、jq 命令语法与示例详解

jq 命令有很多参数和选项,可以帮助你处理和转换 JSON 数据。以下是一些常用的 jq 命令参数和选项:

1)基本用法

jq [options] [filter] [file]
  • options: 可选参数,用于指定 jq 的选项。
  • filter: 必需参数,用于指定 JSON 数据的查询和转换操作。
  • file: 可选参数,要处理的 JSON 数据文件。

2)常用选项

  • -r: 输出原始格式,而不是 JSON 编码。
  • -c: 输出时将结果按行分隔。
  • -s: 将输入视为多个 JSON 对象,用于处理多个 JSON 对象的数组。

3)查询和过滤

  • .: 表示当前对象,用于访问字段或属性。
  • .fieldName: 选择指定字段的值。
  • []: 用于遍历数组元素。
  • select(condition): 根据条件选择元素。
  • map(transform): 对数组中的每个元素应用转换操作。

当使用 jq 进行查询和过滤 JSON 数据时,你可以根据需要执行各种操作。以下是一些常见的查询和过滤示例,假设我们有以下 JSON 数据:

[  {    "name": "Alice",    "age": 25,    "city": "New York"  },  {    "name": "Bob",    "age": 30,    "city": "Los Angeles"  },  {    "name": "Charlie",    "age": 22,    "city": "Chicago"  }]

1、选择字段

查询并选择所有人的姓名:

cat data.json | jq '.[].name'

输出:

"Alice""Bob""Charlie"

2、过滤

选择年龄大于 25 岁的人的姓名和城市:

cat data.json | jq '.[] | select(.age > 25) | .name, .city'

输出:

"Bob""Los Angeles"

3、遍历数组

遍历并输出所有人的年龄:

cat data.json | jq '.[] | .age'

输出:

253022

4、组合操作

选择年龄在 25 到 30 岁之间的人的姓名和城市,并按照姓名排序:

cat data.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city' | sort
"Alice""New York""Bob""Los Angeles"

这些只是一些基本的查询和过滤示例。jq 支持更多的操作和功能,你可以根据需要进行组合和定制。请根据你的数据和需求来调整和扩展这些示例。

4)修改和创建

  • .fieldName = value: 修改字段的值。
  • del(.fieldName): 删除指定字段。
  • .newField = value: 创建新的字段。

使用 jq 进行 JSON 数据的修改和创建可以帮助你更新数据或添加新的字段。以下是一些示例,假设我们有以下 JSON 数据:

{  "name": "Alice",  "age": 25,  "city": "New York"}

1、修改字段值:

修改年龄字段的值为 26:

cat data.json | jq '.age = 26'

输出:

{  "name": "Alice",  "age": 26,  "city": "New York"}

2、创建新字段:

添加一个新的字段 country 并设置其值为 "USA":

cat data.json | jq '.country = "USA"'

输出:

{  "name": "Alice",  "age": 25,  "city": "New York",  "country": "USA"}

3、组合操作:

修改年龄字段的值为 26,并添加一个新的字段 country:

cat data.json | jq '.age = 26 | .country = "USA"'

输出:

{  "name": "Alice",  "age": 26,  "city": "New York",  "country": "USA"}

4、条件修改

如果年龄小于 30,则将城市修改为 "Chicago":

cat data.json | jq 'if .age < 30 then .city = "Chicago" else . end'

输出(由于年龄小于 30,城市被修改):

{  "name": "Alice",  "age": 25,  "city": "Chicago"}

这些示例演示了如何使用 jq 修改和创建 JSON 数据。你可以根据需要进行组合和调整,以实现你的需求。记住,jq 提供了强大的功能,可以进行更复杂的操作,可以根据文档和教程进一步学习。

5)运算符

  • +, -, *, /: 数值运算。
  • ==, !=, <, >, <=, >=: 比较运算。
  • and, or, not: 逻辑运算。

jq 支持多种运算符,用于在 JSON 数据中执行数值运算、比较和逻辑操作。以下是一些常见的 jq 运算符示例,假设我们有以下 JSON 数据:

{  "a": 10,  "b": 5,  "c": 15}

1、数值运算

进行加法、减法、乘法和除法运算:

cat data.json | jq '.a + .b'cat data.json | jq '.a - .b'cat data.json | jq '.a * .b'cat data.json | jq '.a / .b'

输出:

155502

2、比较运算:

比较字段值,返回布尔结果:

cat data.json | jq '.a > .b'cat data.json | jq '.a >= .c'cat data.json | jq '.b < .c'

输出:

truefalsetrue

3、逻辑运算:

执行逻辑 AND、OR 和 NOT 操作:

cat data.json | jq '.a > 5 and .b < 10'cat data.json | jq '.a > 15 or .b > 10'cat data.json | jq 'not (.c > 20)'

输出:

truetruefalse

4、条件运算:

使用 if 和 then 进行条件运算:

cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end'

输出:

"Less or equal"

这些示例展示了 jq 中的一些常见运算符的用法。你可以根据需要进行更复杂的运算和组合操作,以实现你的需求。在处理 JSON 数据时,jq 提供了广泛的功能来执行各种操作。

6)变量和条件

  • as $variable: 将结果保存到变量中。
  • if condition then ... else ... end: 条件语句。

在 jq 中,你可以使用变量和条件语句来处理和转换 JSON 数据。以下是一些示例,说明如何在 jq 中使用变量和条件语句,假设我们有以下 JSON 数据:

{  "name": "Alice",  "age": 25,  "city": "New York"}

1、使用变量:

将字段值存储到变量中,并在输出中使用变量:

cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"'

输出:

"Name: Alice, Age: 25"

2、条件语句:

使用 if 和 then 进行条件判断:

cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'

输出:

"Adult"

3、条件判断和变量组合:

结合条件语句和变量,根据年龄输出不同的消息:

cat data.json | jq 'if .age > 18 then "Name: \(.name), Status: Adult" else "Name: \(.name), Status: Minor" end'

输出:

"Name: Alice, Status: Adult"

4、使用条件操作修改数据:

根据年龄字段的值,如果大于 30 则修改城市字段:

cat data.json | jq 'if .age > 30 then .city = "Chicago" else . end'

输出(由于年龄不大于 30,所以城市字段不变):

{  "name": "Alice",  "age": 25,  "city": "New York"}

这些示例演示了如何在 jq 中使用变量和条件语句来处理 JSON 数据。你可以根据需要进行组合和定制,以满足你的需求。jq 提供了强大的功能来处理和转换 JSON 数据,可以根据文档和教程进一步学习。

7)函数

jq 支持一些内置函数,如 length, keys, values, tostring 等,用于操作和处理 JSON 数据。

在 jq 中,你可以使用内置的函数来处理和转换 JSON 数据。以下是一些常见的 jq 函数示例,假设我们有以下 JSON 数据:

{  "name": "Alice",  "age": 25,  "city": "New York",  "scores": [85, 90, 78, 95]}

1、length 函数:

获取数组的长度:

cat data.json | jq '.scores | length'

输出:

4

2、map 函数:

对数组中的每个元素应用转换操作:

cat data.json | jq '.scores | map(. * 2)'

输出:

[170,180,156,190]

3、keys 和 values 函数:

获取对象的键和值:

cat data.json | jq '. | keys'cat data.json | jq '. | values'

输出:

["name","age","city","scores"]["Alice",25,"New York",[85,90,78,95]]

4、to_entries 函数:

将对象转换为键值对数组:

cat data.json | jq '. | to_entries'

输出:

[  {"key":"name","value":"Alice"},  {"key":"age","value":25},  {"key":"city","value":"New York"},  {"key":"scores","value":[85,90,78,95]}]

5、自定义函数:

使用自定义函数进行操作:

cat data.json | jq 'def average: reduce .[] as $item (0; . + $item) / length; .scores | average'

输出:

87

这些是一些常见的 jq 命令参数和选项,可以帮助你进行 JSON 数据的查询、过滤、修改和转换。你可以通过查阅 jq 的官方文档和教程,深入学习和掌握更多功能和用法。

标签:age,JSON,jq,cat,json,Linux,data
From: https://www.cnblogs.com/cheyunhua/p/18298023

相关文章

  • linux 路由表详解
    MarkdownExamplelinux路由表详解通过route命令查看Linux内核的路由表:$routeKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIfacedefault_gateway0.0.0.0UG000p5p1......
  • Linux & Shell 编程基础—— 构建基本脚本(练习)
    1.创建shell脚本文件、显示消息练习1:•构建一个脚本文件执行创建新用户、给新用户分组、查看当前登录的用户•为刚刚构建的脚本文件添加输出前的提示•运行该脚本文件查看返回结果2、使用变量、输出重定向、用wc命令查看文件行数练习2......
  • 在Linux中,列出几种常见打包工具并写相应解压缩参数。
    在Linux中,有多种常见的打包工具,它们各自具有不同的特点和用法。以下是几种常见的打包工具及其相应的解压缩参数:1.tar简介:tar(tapearchive)是一种广泛使用的Linux打包工具,它主要用于将多个文件和目录打包成单个文件,但不进行压缩。通过与其他压缩工具结合使用,可以实现打包和压缩......
  • 在Linux中,我们都知道,dns采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么 时候采
    DNS(DomainNameSystem)确实既使用UDP协议也使用TCP协议,这是因为不同的DNS操作有不同的需求和优化目标。1.UDP协议的使用DNS主要使用UDP协议,这是由于UDP的无连接性质和较低的开销。以下是使用UDP的一些情况及其原因:标准查询:何时使用:对于大多数DNS查询,特别是常见的域名解......
  • 在Linux中,当用户在浏览器当中输入⼀个网站,计算机对dns解释经过那些流程?
    当用户在Linux系统下的浏览器中输入一个网站URL时,DNS(DomainNameSystem,域名系统)解析的过程大致遵循以下步骤:本地缓存检查:浏览器首先检查其自身的DNS缓存中是否存在该域名的记录。如果缓存中有有效的记录,浏览器可以直接使用这个IP地址访问网站,而无需进一步的DNS查询。......
  • 在Linux中,如何实现,每星期天早8点服务器定时重启?
    在Linux系统中,要实现每星期天早上8点自动重启服务器,你可以使用cron服务来安排这项任务。cron是一个基于时间的作业调度器,它允许你安排程序在特定的时间自动运行。下面是具体步骤来实现这一需求:1.编辑Cron作业首先,你需要以root用户身份登录到你的Linux服务器,因为重启系统需要管......
  • 在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信
    在Linux系统中,当你遇到使用touchtest.file命令创建新文件时报错提示磁盘已满,但使用df-h命令查看磁盘使用率时却显示只有60%的磁盘空间被使用,这种情况可能由以下几个原因造成:inode耗尽:在Linux文件系统中,每个文件或目录都需要一个inode(索引节点)来存储其元数据(如权限、所有者......
  • Linux命令总结
    输入infconfig,查询ip地址serviceiptablesstop关闭防火墙serviceiptablesstart开启防火墙serviceiptablesrestart重启防火墙serviceiptablesstatus查看防火墙状态关闭防火墙(链接Xshell,一定要关闭防火墙)链接Xshell步骤(可直接新建连接,也可输入快捷......
  • Linux常用
    Linux常用命令基础切换用户suyao//切换为用户"yao",输入后回车需要输入该用户的密码exit//退出当前用户目录搜索目录find/bin-name'a*'//查找/bin目录下的所有以a开头的文件或者目录文件新增文件touch......
  • Linux创建组和用户groupadd:无法锁定/etc/group问题解决
    问题原因:相关关键文件进行了锁定,不能被访问和修改1.确认是否是使用root用户执行,2.确定文件权限没问题使用lsattr命令查看隐藏权限设定情况[abc@localhost~]$lsattr/etc/group----------------/etc/group[abc@localhost~]$lsattr/etc/passwd----------------/etc/......