shell编程学习之使用jq对json数据进行提取
shell编程学习之使用jq对json提取
jq命令允许直接在命令行下对JSON进行操作,包括分片、过滤、转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;在linux系统中也可以直接用yum安装。
下载地址 https://stedolan.github.io/jq/download/
本文主要介绍其使用,默认是已经安装好的,没有安装的,请自行百度安装。
现在先准备json串,如下kumufengchun.json:
{"name":"kumufengchun","age":"18","city":"beijing","email":"kumufengchun@gmail.com","date":"Thursday","country":"China","company":["baidu","google","alibaba"]}"
如下test.json:
[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
1.用jq .直接查看
jq . kumufengchun.json
或者
cat kumufengchun.json | jq .
输出如下:
[root@localhost ~]$ cat kumufengchun.json | jq .
{
"name": "kumufengchun",
"age": "18",
"city": "beijing",
"email": "kumufengchun@gmail.com",
"date": "Thursday",
"country": "China",
"company": [
"baidu",
"google",
"alibaba"
]
}
是已经格式化的json数据串,在linux系统下还高光显示,key和value用不同的颜色表示,如下图:

2.输出某个字段或者某个索引的值
语法:jq '.' ,这里key是字段名称
[root@localhost ~]$ jq .name kumufengchun.json
"kumufengchun"
[root@localhost ~]$ jq '.name' kumufengchun.json
"kumufengchun"
[root@localhost ~]$ jq '.company' kumufengchun.json
[
"baidu",
"google",
"alibaba"
]
3.输出数组的值
语法:jq '.[]' ,这里value是数组的索引整数值
[root@localhost ~]$ jq '.company[1]' kumufengchun.json
"google"
[root@localhost ~]$ jq '.company[2]' kumufengchun.json
"alibaba"
4.输出列表、数组的一部分,对其进行切片
语法:jq '.[s:e]',返回的是数组或者列表的index从s开始(包括s)到e结束(不包括e)
[root@localhost ~]$ jq '.company[0:2]' kumufengchun.json
[
"baidu",
"google"
]
也可以省略开始的index,只有结束的index,如下,仍然是不包括结束index的值:
[root@localhost ~]$ jq '.company[:3]' kumufengchun.json
[
"baidu",
"google",
"alibaba"
]
也可以省略结束的index,只有开始的index,如下,输出到最后:
[root@localhost ~]$ jq '.company[1:]' kumufengchun.json
[
"google",
"alibaba"
]
开始的索引也可以是负数,表示从后边倒着数,从-1开始数:
[root@localhost ~]$ jq '.company[-2:]' kumufengchun.json
[
"google",
"alibaba"
]
5.循环输出所有的值,如数组嵌套
语法:jq '.[]'
[root@localhost ~]$ jq '.[]' test.json
{
"name": "JSON",
"good": true
}
{
"name": "XML",
"good": false
}
[root@localhost ~]$ jq '.[]' kumufengchun.json
"kumufengchun"
"18"
"beijing"
"kumufengchun@gmail.com"
"Thursday"
"China"
[
"baidu",
"google",
"alibaba"
]
6.输出多个索引的值,可以用逗号分割
语法: jq '.key1,.key2'
[root@localhost ~]$ jq '.name,.age' kumufengchun.json
"kumufengchun"
"18"
[root@localhost ~]$ jq '.date,.company[]' kumufengchun.json
"Thursday"
"baidu"
"google"
"alibaba"
如果是数组,用中括号括起来要输出的键值,键值先写谁,先输出谁
[root@localhost ~]$ jq '.company[2,0]' kumufengchun.json
"alibaba"
"baidu"
7.用管道符号|可以对其进行再次处理
语法:jq .[] | .
[root@localhost ~]$ jq '.[]|.name' test.json
"JSON"
"XML"
8.括号的作用
[root@localhost ~]$ echo 1 | jq '(.+2)*5'
15
[root@localhost ~]$ echo {1,2,3} | jq '(.+2)*5'
15
20
25
9.length求长度
如果是字符串是求的字符串的长度,如果是数组则求得是数组的长度
[root@localhost ~]$ cat kumufengchun.json | jq '.[] | length'
12
2
7
22
8
5
3
10.输出所有的keys
语法: jq keys
[root@localhost ~]$ cat kumufengchun.json | jq 'keys'
[
"age",
"city",
"company",
"country",
"date",
"email",
"name"
]
输出数组的keys:
[root@localhost ~]$ cat kumufengchun.json | jq '.company | keys'
[
0,
1,
2
]
11.判断存不存在某个键
[root@localhost ~]$ cat kumufengchun.json | jq 'has("email")'
true
[root@localhost ~]$ cat kumufengchun.json | jq 'has("address")'
false
12.更多用法
参见文档 https://stedolan.github.io/jq/manual/#Invokingjq
shell编程学习之使用jq对json数据进行提取的更多相关文章
- Linux 下shell 编程学习脚手架
linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...
- jq处理JSON数据, jq Manual (development version)
jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
- shell编程学习笔记(一):编写我的第一段代码
目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...
- shell编程学习笔记之sed编辑器
在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...
- shell编程学习1
1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式. (2)我们可以使用shell和操作系统.uboot等软件系统进 ...
- shell编程学习笔记【原创】
本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...
- (七)shell编程学习
1.shell程序练习:创建一个dir文件夹,在dir文件夹里再创建一个cd.c文件 首先vim hello.sh 2.shell中的变量定义和引用 (1)变量定义和初始化.shell是弱类型语言(语 ...
- shell编程学习笔记(十):Shell中的for循环
shell编程中可以实现for循环遍历 先来写一个最简单的吧,循环输出从1到10,脚本内容为: #! /bin/sh for i in {1..10} do echo $i done 上面的代码从1到 ...
随机推荐
- JAVA 截图+tess4j识别
我们先来看看要识别的图片和效果图 效果图: 图片识别需要用到tess4j这个包,下面是下载地址: https://share.weiyun.com/5Hjv13T 我们拿到包以后解压出来,随便你放到哪 ...
- Python Web 基础向(四) 浅谈数据层
数据层一般会给人带来一些困扰,在于其定位不准确.聚合Model的工作也可以放在逻辑层做,但会导致逻辑层变重,经常出现大段晦涩代码.因此我的建议是保留Model聚合层,尽管会导致工作量的略微增加,但却可 ...
- Java并发 - (无锁)篇6
, 摘录自葛一鸣与郭超的 [Java高并发程序设计]. 本文主要介绍了死锁的概念与一些相关的基础类, 摘录自葛一鸣与郭超的 [Java高并发程序设计]. 无锁是一种乐观的策略, 它假设对资源的访问是没 ...
- Java Annotation/Scope
1.在计算机编程语言Java中,什么是注释(Annotation)? 注释是一种可以添加到Java源代码的语法元数据或描述(注释不影响程序执行) 2.注释(Annotation)有什么作用? ( ...
- 实现 add()(1,2)(3,4)(7,8,9)()
function add(){ var sum=0; function inner(pre,cur){ return pre+cur; } sum=Array.prototype.slice.call ...
- Mysql(或者sqlite), Mongo中update Column + 1
Mysql(或者sqlite), Mongo中update Column + 1 有类似以下需求,在数据库表里有一个字段,记录了一个count,然后又时候需要在count的基础上加上某个数字,比如1. ...
- 《和莎莫的 500 天》中为什么 Summer 最终没有和 Tom 在一起?
好的电影总是需要仔细赏味几次,每次也都会有不同的收获.就像我钟爱的[500 days of summer]. 彪悍的大胡子导演MarcWebb实在是太有趣,把自己的亲身经历搬上大荧幕,因为" ...
- 全网最详细的一篇Flutter 尺寸限制类容器总结
Flutter中尺寸限制类容器组件包括ConstrainedBox.UnconstrainedBox.SizedBox.AspectRatio.FractionallySizedBox.Limited ...
- grid实战之微信钱包 腾讯服务界面
网格布局简介 CSS3网格布局是让开发人员设计一个网格并将内容放在这些网格内.而不是使用浮动制作一个网格,实际上是你将一个元素声明为一个网格容器,并把元素内容置于网格中. 有一些浏览器是不支持网格布局 ...
- Python-Requests库的安装和调用
#使用pip或者pip3安装requests库pip3 install requests #requests库:python #输入python进入命令行模式在cmd命令行中依次运行以下代码,或者直接 ...