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数据进行提取的更多相关文章

  1. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  2. jq处理JSON数据, jq Manual (development version)

    jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...

  3. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  4. shell编程学习笔记(一):编写我的第一段代码

    目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...

  5. shell编程学习笔记之sed编辑器

    在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...

  6. shell编程学习1

    1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式.    (2)我们可以使用shell和操作系统.uboot等软件系统进 ...

  7. shell编程学习笔记【原创】

    本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...

  8. (七)shell编程学习

    1.shell程序练习:创建一个dir文件夹,在dir文件夹里再创建一个cd.c文件 首先vim hello.sh 2.shell中的变量定义和引用 (1)变量定义和初始化.shell是弱类型语言(语 ...

  9. shell编程学习笔记(十):Shell中的for循环

    shell编程中可以实现for循环遍历 先来写一个最简单的吧,循环输出从1到10,脚本内容为: #! /bin/sh for i in {1..10} do echo $i done 上面的代码从1到 ...

随机推荐

  1. AI在自动化测试领域的应用

    阿里QA导读:最近一两年随着深入学习技术浪潮的诞生,智能化测试迎来了新的发展,而AI也会引领下一代测试的新航向.Testin云测CTO陈冠诚先生的分享让我们看到AI在移动自动化测试领域里面的创新机会点 ...

  2. Pip安装TensorFlow报错:MemoryError

    问题描述 使用pip安装TensorFlow时,一直报错,情况如下: 解决办法 使用如下命令可正常安装: pip3 install --no-cache-dir tenstoflow --no-cac ...

  3. 【转】Android Monkey 命令行可用的全部选项

    常规 事件 约束限制 调试 原文参见:http://www.douban.com/note/257030384/ 常规 –help 列出简单的用法. -v 命令行的每一个 -v 将增加反馈信息的级别. ...

  4. celery beat之pidfile already exists问题

    背景 在进行celery定时任务测试时,发现到点任务并未执行,检查了log发现在启动celery beat的时候有这样一个报错,所以celery beat并未启动成功. 1234 (hzinfo) E ...

  5. 内核ioctl函数的cmd宏参数

    在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...

  6. 【转载】Oracle Spatial中SDO_Geometry详细说明

    转载只供个人学习参考,查看请前往原出处:http://www.cnblogs.com/upDOoGIS/archive/2009/05/20/1469871.html 相关微博:oracle 创建SD ...

  7. IP 多播

    IP 多播 一.IP 多播的基本概念 1.1.简介 不使用多播时需要发送 90 次单播: 使用多播时只需要发送 1 次多播: 1.2.IP 多播的一些特点 多播使用组地址:D 类IP地址支持多播.多播 ...

  8. 一篇文章带您读懂List集合(源码分析)

    今天要分享的Java集合是List,主要是针对它的常见实现类ArrayList进行讲解 内容目录 什么是List核心方法源码剖析1.文档注释2.构造方法3.add()3.remove()如何提升Arr ...

  9. java8新特性——stream笔记

    stream对象 Stream IntStream LongStream DoubleStream 创建 常用的三种方式: 使用list对象: list.stream() − 为集合创建串行流. li ...

  10. 移动端轮播图实现方法(dGun.js)

    本文章介绍在移动端无缝隙轮播图实现的原理,这个轮子比较简单,但可以方便刚刚入门的同学参考.最终效果是在移动端无缝隙无限滑动,可以自定义轮播的速度.支持手势左右滑动.最后会放上源码. HTML部分 &l ...