jq命令简易教程——Linux中处理JSON数据的利器

在shell脚本中,当我们需要对JSON数据(例如ceph、kubernetes等一些命令的输出,或是调用API获得的响应)进行处理和提取时,如果使用传统的文本三剑客sed、awk和grep,命令将会非常臃肿不可读。虽然这三个命令在处理松散结构的数据时很有用,但当面对JSON这类数据时,却显得不够优雅。

jq就是这样一个命令行工具,专门用于处理JSON数据,特别适用于shell脚本。

jq命令的使用

首先我们需要安装jq命令:yum install jq -y

创建如下的示例文件(一张学生成绩表):

# cat test.json
[{ "name": "zhangsan", "gender": "male", "score": 80 },{ "name": "lisi", "gender": "male", "score": 90 },{ "name": "wangerma", "gender": "female", "score": 100 }
]

jq命令的标准语法为jq [options] <jq filter> [file...],最简单的过滤器为.,它将输入原封不动地转换为输出(会做格式化、高亮),例如:

#  jq '.' test.json 
[{"name": "zhangsan","gender": "male","score": 80},{"name": "lisi","gender": "male","score": 90},{"name": "wangerma","gender": "female","score": 100}
]

这个命令可以用于检测输入是否为合格的json,例如将test.json修改为:

# cat test.json
[{ "name": "zhangsan", "gender": "male", "score": 80 },{ "name": "lisi", "gender": "male", "score": 90 },{ "name": "wangerma", "gender": "female", "score": 100 }

则命令会报错:

#  jq '.' test.json 
parse error: Unfinished JSON term at EOF at line 6, column 0

所以我们可以写如下shell作判断:

#!/bin/bash
if jq '.' test.json >/dev/null 2>&1
thenecho "valid json"
else echo "invalid json"
fi

检索键值

如果我们将需要获取所有学生的姓名列表,如下:

["zhangsan","lisi","wangerma"
]

该怎么做?为此我们需要先使用数组迭代器.[]来获取列表中每一项值:

#  jq '.[]' test.json 
{"name": "zhangsan","gender": "male","score": 80
}
{"name": "lisi","gender": "male","score": 90
}
{"name": "wangerma","gender": "female","score": 100
}

然后获取每一项输出的name键值,这里使用我们熟悉的管道符|

#  jq '.[] | .name' test.json 
"zhangsan"
"lisi"
"wangerma"

如果想要去掉输出中的双引号,可以使用-r参数输出原始字符串:

#  jq -r '.[] | .name' test.json 
zhangsan
lisi
wangerma

接下来我们可以在过滤器的最外层加上[]来讲结果转换为列表:

#  jq '[.[] | .name]' test.json 
["zhangsan","lisi","wangerma"
]

以上过滤器的表达式看起来似乎有些臃肿了,好在jq提供了map函数,因此我们可以将上述表达式替换为:

#  jq 'map(.name)' test.json 
["zhangsan","lisi","wangerma"
]

使用add函数对键值进行求和

仿照上述语法,我们可以可以获得所有学生的成绩列表:

#  jq 'map(.score)' test.json 
[80,90,100
]

同样。使用管道符|add函数,即可轻松获取所有学生的成绩总和:

#  jq 'map(.score) | add' test.json 
270

使用select获取部分键值

如果我们想要对所有男生的成绩进行求和,就需要使用select(condition)函数了,所有conditiontrue的输入会被保留,false则会被丢弃,如我们获取所有性别为男的数据gender == "male"

#  jq 'map(select(.gender == "male"))' test.json 
[{"name": "zhangsan","gender": "male","score": 80},{"name": "lisi","gender": "male","score": 90}
]

进一步获取所有男生的分数:

#  jq 'map(select(.gender == "male").score)' test.json 
[80,90
]

最后求和:

#  jq 'map(select(.gender == "male").score) | add' test.json 
170

将输入转换为新的格式输出

如果我们想将上述步骤中的输出合并为一个新的json数据并输出,则可以使用如下方式进行格式化输出:

#  jq '{ students: map(.name), totalscore: map(.score) | add, totalmalescore: map(select(.gender == "male").score) | add }' test.json 
{"students": ["zhangsan","lisi","wangerma"],"totalscore": 270,"totalmalescore": 170
}

总结

在shell脚本中处理json数据,jq命令是个很好的选择。

本教程将对这个命令的用法只进行了简单入门介绍,如需了解详细语法,可以参看官方文档:https://jqlang.github.io/jq/manual/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云视频点播配置说明 | Modstart

开通云点播 开通云点播 云点播VOD_音视频点播_直播回看_音视频上传、存储转码AI处理方案-腾讯云 获取腾讯云 SecretId 和 SecretSecret 注册并且登录 腾讯云

14. 【Android教程】文本输入框 EditText

在上一节我们讲到了 TextView&#xff0c;它用来显示一段文本。这一节可以算作成是 TextView 的延续&#xff0c;因为从功能上 EditText 在 TextView 的基础之上多了一个输入的功能&#xff1b;从代码上 EditText 是继承自 TextView 的子类&#xff0c;所以我们可以大胆的理解为…

下载python电子书

下面展示一些 内联代码片。 import requests from lxml import etree from urllib import parse from pprint import pprint from tqdm import tqdm class PythonBook: def init(self): self.url“https://m.jb51.net/books/list476_1.html” self.url_page“https://m.jb51.n…

数字乡村发展新模式:科技创新引领农业现代化与乡村振兴协同发展

随着信息技术的飞速发展&#xff0c;数字乡村已成为新时代农业现代化与乡村振兴协同发展的新模式。科技创新作为推动这一模式的核心动力&#xff0c;正引领着乡村产业结构的优化升级&#xff0c;促进农村经济的全面振兴&#xff0c;让农民在现代化的进程中共享发展成果。 一、科…

transformer上手(1) —— transformer介绍

1 起源与发展 2017 年 Google 在《Attention Is All You Need》中提出了 Transformer 结构用于序列标注&#xff0c;在翻译任务上超过了之前最优秀的循环神经网络模型&#xff1b;与此同时&#xff0c;Fast AI 在《Universal Language Model Fine-tuning for Text Classificat…

vue页面跳转过渡动画与防止抖动

目录 整页跳转动画页面抖动我的代码 整页跳转动画 总是看到别人的页面有个淡入淡出效果&#xff0c;但是自己一直不知道怎么实现&#xff0c;感觉不能是每个组件都加一个动画&#xff0c;于是我去看了vue的官方文档。 官方给了这两个东西&#xff1a; <transition> 元…

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而电路和协…

基于Java SpringBoot+Vue的体育用品库存管理系统

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

力扣739. 每日温度

Problem: 739. 每日温度 文章目录 题目描述思路复杂度Code 题目描述 思路 若本题目使用暴力法则会超时&#xff0c;故而使用单调栈解决&#xff1a; 1.创建结果数组res&#xff0c;和单调栈stack&#xff1b; 2.循环遍历数组temperatures&#xff1a; 2.1.若当stack不为空同时…

如何判断一个linux机器是物理机还是虚拟机

https://blog.csdn.net/qq_32262243/article/details/132571117 第一种方式&#xff1a;dmesg命令 [rootnshqae01adm03 ~]# dmesg | grep -i hypervisor [ 0.000000] Hypervisor detected: Xen PV [ 1.115297] VPMU disabled by hypervisor. 在我的机器上 dmesg也是能够用来判…

【C语言】扫雷【附源码】

一、扫雷游戏规则 尽快找到雷区中的所有不是地雷的格子,而不许踩到地雷。点开的数字是几&#xff0c;则说明该数字旁边的8个位置中有几个雷&#xff0c;如果挖开的是地雷&#xff0c;则会输掉游戏。 二、代码思路&#xff1a; 宏定义&#xff1a; Row 和 Col 定义了棋盘的行数和…

计算机研究生规划

一、计算机研究生技术栈 两条腿走路: 左侧工程实践能力&#xff1a;要掌握python编程语言&#xff0c;它和机器学习、神经网络&#xff08;这两门几乎是必须掌握的技能&#xff09;的学习有很大关系 右侧学术创新能力 二、编程语言能力提升 左边基础&#xff0c;右边教你写…

在ubuntu系统上安装ffmpeg支持rrweb使用rrvideo对视频文件转mp4格式遇到的一些问题及解决办法

在ubuntu系统上安装ffmpeg支持rrweb使用rrvideo对视频文件转mp4格式遇到的一些问题及解决办法 1,ubuntu系统上安装ffmpeg4.4.1稳定版本1,ubuntu系统上安装ffmpeg4.4.1稳定版本 按照ChatGPT3.5来 sudo apt updatesudo apt install build-essential git sudo apt-get instal…

上传应用程序到苹果应用商店的工具和要点

引言 在今天的移动应用市场中&#xff0c;将应用程序上传到苹果应用商店&#xff08;App Store&#xff09;是许多开发者的首要任务之一。然而&#xff0c;不同操作系统下的开发者可能需要使用不同的工具和遵循不同的要求来完成这一任务。本文将介绍在 macOS、Windows 和 Linu…

蓝桥杯算法题:练功

【问题描述】 小明每天都要练功&#xff0c;练功中的重要一项是梅花桩。 小明练功的梅花桩排列成 n 行 m 列&#xff0c;相邻两行的距离为 1&#xff0c;相邻两列的距离也为 1。 小明站在第 1 行第 1 列上&#xff0c;他要走到第 n 行第 m 列上。小明已经练了一段时间&#xff…

gcc/g++:编译阶段翻译成平台汇编代码

编译阶段翻译成平台汇编代码&#xff0c;是在预编译阶段上加码&#xff0c;将C/C代码翻译成平台相关的汇编代码。 示例&#xff1a; 1&#xff09;用户程序 /*brief test demo-for-compile-to-asm? show you hereauthor wenxuanpeiemail 15873152445163.com(query for any q…

OpenHarmony实战:瑞芯微RK3566移植案例(下)

OpenHarmony实战&#xff1a;瑞芯微RK3566移植案例&#xff08;下&#xff09; OpenHarmony实战&#xff1a;瑞芯微RK3566移植案例&#xff08;中&#xff09; WIFI 整改思路及实现流程 整改思路 接下来熟悉HCS文件的格式以及"HDF WIFI”核心驱动框架的代码启动初始化…

大话设计模式——11.桥接模式(Bridge Pattern)

简介 将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。 UML图&#xff1a; 应用场景&#xff1a; 系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性不想使用继承导致系统类的个数急剧增加某个类存在多个变化维度使用继承方式容易出现类的膨胀 示例…

Windows编译运行TensorRT-YOLOv9 (C++)

Windows编译运行yolov9-bytetrack-tensorrt&#xff08;C&#xff09; 1 基础环境2 编译yolov9-bytetrack-tensorrt&#xff08;1&#xff09;下载yolov9-bytetrack-tensorrt源码&#xff08;2&#xff09;修改CMakeLists.txt&#xff08;3&#xff09;CMake编译 3 yolov9模型转…

js怎样控制浏览器前进、后退、页面跳转

window.open(")&#xff1b;--这种方法可以打开新的标签页并在新标签页跳转到页面。 window.open(页面链接) window.location.href"&#xff1b;-这种方法可以直接改变当前页面的地址&#xff0c;不打开新的标签页。 window.location.href页面链接 window…