linux中json处理工具jq的安装和使用

来源:互联网 发布:超级优化讲的什么 编辑:程序博客网 时间:2024/05/21 08:03

linux中json处理工具jq的安装和使用
最近在使用shell写自动化脚本的时候涉及到对json文件的配置和读取,为了方便处理,于是封装了一个方法,通过使用jq工具来对json数据进行处理。

一、jq的简介

jq是一款命令行下处理JSON数据的工具。它可以接受标准输入,命令管道或者文件中的JSON数据,通过一系列的过滤器和表达式的转换后生成我们需要的数据结构并格式化输出,这样就方便我们在一大堆数据中方便的获取到我们想要的数据,轻量便捷。

二、jq的安装

jq可以通过系统自带的软件包管理器直接安装,也可以手动从源代码编译安装。jq的源代码可以直接从git仓库获得,git仓库地址是:https://github.com/stedolan/jq.git。具体的安装命令如下:
在mac中可以直接通过brew install jq就可以了,不过需要先安装了homebrew。
在linux和osx系统中:

git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure –disable-maint ainer-mode
make
sudo make install

不过我在windows系统下尝试过是无法这样安装的。

三、jq的使用

jq支持使用-h或者–help查看jq的详细使用方法。需要注意的是jq的输入内容必须严格遵守JSON格式的标准,即所有的属性必须是以双引号包括的字符串;对象的最后一个属性的末尾或者数组的最后一个元素的末尾不能有逗号,否则jq会抛出无法解析JSON的错误。
jq通过命令行来控制对输入输出的处理。介绍几个常用的命令行选项。
+ -r选项。该选项是输出raw格式内容或JSON格式内容,即符合JSON标准格式。如我们要查询一个JSON字符串{“name”:”bob”}中name的值,使用-r选项的时候返回的只有值,不会加上双引号。
+ -s选项。jq可以同时处理空格分割的多个JSON字符串输入。使用-s选项,jq会将所有的JSON输入放入一个数组中并在这个数组上使用filter。
+ –arg选项。jq通过该选项提供了和宿主脚本语言交互的能力。比如将一个值绑定到一个变量上,在后面的filter中可以直接通过变量引用到这个值。

四、基础表达式

‘.’符号:表示默认输出。对作为表达式输入的整个JSON对象的引用。
JSON对象操作。jq提供了两种基本表达式用来访问JSON对象的属性:‘.< attributename >’和’.< attributename >?’。正常情况下,这两个表达式的行为相同,都是访问对象的属性,如果JSON对象不包含指定的属性则返回null。区别就是当输入的不是JSON对象或者数组时,第一个表达式会抛出异常。而第二个表达式则无任何输出。
数组操作。jq提供了三种基础表达式来操作数组“
+ 迭代操作:(‘.[]’)。该表达式的输入可以是数组或者JSON对象。输出的是基于数组元素或者JSON对象属性值的iterator。
+ 访问特定元素的操作(‘.[index]’或’.[attributename]’)。用来访问数组元素或者JSON对象的属性值。输出的是单个值。
+ 数组切片操作(‘.[startindex:endindex]’)

表达式操作(’,’和’|’).表达式操作是用来关联多个基础表达式。逗号表示对同一个输入应用多个表达式。管道符表示将前一个表达式的输出用作后一个表达式的输入。当前一个表达式产生的结果是迭代器时,会将迭代器的每一个值用作后一个表达式的输入从而形成新的表达式。

五、常用功能

假设我们有如下demo.json数据

    {    "name": "school",    "students": [    {    "name": "xiaoming",    "age": "18",    },    {    "name": "helen",    "age": "19",    }    ],    "address": {    "country": "China",    "city": "beijing"    }    }

+ 格式化

假设我们要对请求某个接口返回的json数据进行格式化,则只需写curl “https://www.baidu.com” -s | jq ‘.’

  • 获取特定字段

根据json数据中的key获取value,直接添加jq ‘.key’即可。例如:
echo ‘{“name”:”bob”,”age”:”20”}’ | jq ‘.name’
school
注意:当我们解析不存在的key时,会返回null
echo ‘{“name”:”bob”,”age”:”20”}’ | jq ‘.sex’
null

  • 同时可以进行嵌套解析

    cat demo.json | jq ‘.address.city’
    “beijing”

  • 对数组操作

    • 获取数组中的某一项
      cat demo.json | jq ‘.students[1].name’
      helen
  • 内建函数

    jq还有一些内建函数,如key,has
    key是用来获取json中的key元素的,如:
    cat demo.json | jq ‘keys’
    [
    “name”,
    “students”,
    “address”
    ]
    has是用来判断是否存在某个key
    cat demo.json | jq ‘has(“name”)’
    true
    cat demo.json | jq ‘has(“sex”)’
    false

  • map函数

    输入:[1,2,3,4]
    jq表达式:jq -r ‘map(.+1)’
    输出:[2,3,4,5]

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 如何反驳存在即合理 反驳的近义词 怎么反驳寒门再难贵子 反驳的意思是什么 反驳的反义词 反驳是什么意思 反驳什么意思 反驳别人的经典句子 夏虫不可语冰怎么反驳 别人说你丑怎么反驳 别人说你铁憨憨怎么反驳 别人骂我怎么优雅反驳 存在即合理怎么反驳 反骨 头生反骨必成大器 反骨图片 反骨真正位置图片 佛系反骨快穿 反骨是什么 脑后有反骨 头生反骨必是龙命 脑后反骨 反骨人命好吗 天生后脑勺反骨图片 后脑勺反骨图片 忠义侯天生反骨 天生反骨 反骨什么意思 魏延反骨 反骨之人 反骨人多为成功人士 佛系反骨快穿格格党 男的后脑勺反骨的命相 瘦骨精油会反弹吗 什么是反骨 头有反骨是龙命 有反骨的人智商高吗 反耳骨 脑后有反骨的命相 鼻骨内推会反弹吗 反骨是什么意思