shell里的json超级工具 jq 高级用法介绍
Linux shell 环境下有个和google Gson 一样好用的JSON 数据处理工具jq.
最近发现用jq 来分析提取数据,简直太好用了,特别是用于处理shell环境下面的复杂数据结构时,显的很方便。
实际问题1: 如何获取mesos 网页上的mesos-agent host 名称。
如下图:
查询了mesos api, 发现可以/master/slaves 获取所有数据。
curl -s http://10.2.1.72:5050/master/slaves | jq | less
curl -s http://10.2.1.72:5050/master/slaves | jq ‘.slaves’ | jq [.[].hostname]
happy:tmp happy$ curl -s http://10.2.1.72:5050/master/slaves | jq ‘.slaves’ | jq [.[].hostname]
[
“mesos-agent1.cityworks.cn”,
“mesos-agent2.cityworks.cn”,
“mesos-agent3.cityworks.cn”
]
如果不用jq 这个专业的JSON处理工具,用传统的grep ,tr 命令也可以实现,但是效果差很多,稳定性差, 在复杂的条件下,不能确保每次结果都是正确的。
特别是目标没有明显的规律时,就很难操作.
下面是jq在不同平台的安装和用法举例
安装
在OS X上安装jq:
brew install jq
或者在Ubuntu上:
apt-get install jq
Centos上:yum install -y jq
Alpine Linux: apk add jq
下面内容来自国外网页翻译:
用法
jq是围绕过滤器构建的。 最简单的过滤器是。,它回应了它的输入,但很漂亮:
$ echo ‘{“hello”:{ “greetings”:“to you”}}’ | jq .
{
“hello”: {
“greetings”: “to you”
}
}
例如,当您点击JSON API时,它非常适合从curl打印输出。
正如编写良好的手册所指出的,最简单有用的过滤器是.field,它从每个记录中提取字段:
$ echo ‘{“hello”:{ “greetings”:“to you”}}’ | jq .hello
{
“greetings”: “to you”
}
我们也可以为嵌套哈希做.field1.field2:
$ echo ‘{“hello”:{ “greetings”:“to you”}}’ | jq .hello.greetings
“to you”
让我们在一些真正的输入上使用jq。 这是一个名为1.json的Slack日志:
[
{
“type”: “message”,
“user”: “U024HFHU5”,
“text”: “hey there”,
“ts”: “1385407681.000003”
},
{
“type”: “message”,
“user”: “U024HGJ4E”,
“text”: “right back at you”,
“ts”: “1385407706.000006”
}
]
要从1.json中拉出每个Slack消息中的文本,我们需要首先使用。.[]进入“数组”。 然后我们可以使用|将数组中的每个对象传递给下一个过滤器,并使用.text从每个对象中获取文本字段:
$ jq “.[] | .text” 1.json
“hey there”
“right back at you”
Note that we now have plain-text representations of each value, so we could go back to sed:
$ jq “.[] | .text” 1.json | sed ‘s/h/H/g’
“Hey tHere”
“rigHt back at you”
转换输入
到目前为止,我们一直在拔出字段并显示它们。 现在让我们在显示它之前转换JSON。 让我们展示用户和文字:
$ jq “.[] | { the_user: .user, the_text: .text }” 1.json
{
“the_user”: “U024HFHU5”,
“the_text”: “hey there”
}
{
“the_user”: “U024HGJ4E”,
“the_text”: “right back at you”
}
.[]进入数组,给我们一个对象数组。 然后我们使用|将这些对象传递给下一个过滤器,并使用{}过滤器使用每个对象的字段构造一个新对象。 我们还将用户重命名为the_user,将文本重命名为the_text。
要在数组中包装内容,请在表达式周围加上括号:
$ jq “[.[] | { the_user: .user, the_text: .text }]” 1.json
[
{
“the_user”: “U024HFHU5”,
“the_text”: “hey there”
},
{
“the_user”: “U024HGJ4E”,
“the_text”: “right back at you”
}
]
请注意,我们将整个表达式包装在[]中,而不仅仅是{}部分。 如果我们将{}部分包装在方括号中,那么会将每个对象放在一个单独的数组中,这通常是我们不想要的:
$ jq “.[] | [{ the_user: .user, the_text: .text }]” 1.json
[
{
“the_user”: “U024HFHU5”,
“the_text”: “hey there”
}
]
[
{
“the_user”: “U024HGJ4E”,
“the_text”: “right back at you”
}
]
处理多个文件
假设我们有另一个JSON文件,2.json:
[
{
“type”: “message”,
“user”: “U028H5EBL”,
“text”: “<@U02A8N1DS>: Can I get some help with a domain registration?”,
“ts”: “1418301403.001783”
},
{
“type”: “message”,
“user”: “U02A8N1DS”,
“text”: “Sure thing.”,
“ts”: “1418301427.001784”
}
]
我们希望打印出来自1.json和2.json的所有消息,包装在一个数组中,就像我们之前一样。 让我们对两个文件运行相同的过滤器:
$ jq “.[] | [{ the_user: .user, the_text: .text }]” 1.json 2.json
[
{
“the_user”: “U024HFHU5”,
“the_text”: “hey there”
}
]
[
{
“the_user”: “U024HGJ4E”,
“the_text”: “right back at you”
}
]
[
{
“the_user”: “U028H5EBL”,
“the_text”: “<@U02A8N1DS>: Can I get some help with a domain registration?”
}
]
[
{
“the_user”: “U02A8N1DS”,
“the_text”: “Sure thing.”
}
]
嘿,这不好:每个文件的输出都包含在自己的数组中! 我们希望整个输出周围有一个数组,而不是每个文件一个数组。 幸运的是,jq有一个选项:jq --slurp将在1.json和2.json中汇总消息数组并将它们作为一个巨大数组处理。
让我们看看–slurp在我们对其输出做任何事情之前会产生什么:
$ jq --slurp . 1.json 2.json
[
[
{
“type”: “message”,
“user”: “U024HFHU5”,
“text”: “hey there”,
“ts”: “1385407681.000003”
},
{
“type”: “message”,
“user”: “U024HGJ4E”,
“text”: “right back at you”,
“ts”: “1385407706.000006”
}
],
[
{
“type”: “message”,
“user”: “U028H5EBL”,
“text”: “<@U02A8N1DS>: Can I get some help with a domain registration?”,
“ts”: “1418301403.001783”
},
{
“type”: “message”,
“user”: “U02A8N1DS”,
“text”: “Sure thing.”,
“ts”: “1418301427.001784”
}
]
]
正如我们所看到的,它将所有输入包装在一个大数组中,因此我们将在过滤时添加额外的.[]以获取内部对象:
$ jq --slurp “[.[] | .[] | { text: .text }]” 1.json 2.json
[
{
“text”: “hey there”
},
{
“text”: “right back at you”
},
{
“text”: “<@U02A8N1DS>: Can I get some help with a domain registration?”
},
{
“text”: “Sure thing.”
}
]
shell里的json超级工具 jq 高级用法介绍相关推荐
- 远程工具之一---rsync用法介绍
本文转载自:http://blog.csdn.net/niushuai666/article/details/16880061 rsync是一个远程同步工具,只对数据不一致的部分进行传递.作为一位运维 ...
- mysql pt_mysql之pt工具之pt-fifo-split用法介绍
在工作中用到也比较多,在load data大文件时,如果文件太大会导致主从延时等问题,必须得将文件拆分成许多小文件,使用这个工具就不需要人工进行切割文件. 此工具只能工作在类unix操作系统.具体的可 ...
- 常用的json处理工具类
json工具的使用说明 在日常的开发中,经常会对json字符串进行处理,最常见的操作为序列化和反序列化,而当后端的开发使用的是spring boot框架时,在前后端进行交互时,是会自动的序列化和反序列 ...
- Ajax是什么?Ajax高级用法之Axios技术
Ajax AJAX 异步请求局部刷新 Ajax 参数详解 js.json.jsonp区别 json和jsonp的区别 同源策略 json和js对象的区别 Ajax高级用法(axios) 为什么要用Ax ...
- Linux Shell操作json工具jq
Linux Shell操作json工具jq 背景 使用方式 背景 随着后台项目的开发,json协议的可视性好,组装与解封装的工具在各个平台都比较完备,所以能通过shell快速组装与解封装json能大大 ...
- c json 数组转dirction_值得掌握的命令行JSON工具jq
我们都知道现在JSON是最常用的配置和数据交换格式之一,尤其是大量的系统API接口现在基本上都是以JSON格式显示结果.JSON(JavaScript Object Notation) 是一种轻量级的 ...
- linux shell json解析命令 jq 简介
jq简介 jq可以对json数据进行分片.过滤.映射和转换,和sed.awk.grep等命令一样,都可以让你轻松地把玩文本.它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的 ...
- jq linux下载文件,linux下的json命令行工具–jq
jq是一个很轻量却很强大的命令行下的json解析器.jq是json中的"sed"命令,它可以用来slice.filter.map.transform json数据.jq是用C编写的 ...
- Linux格式化显示json工具jq
Linux格式化显示json工具jq 安装 格式化显示json 读取json文件 获取所有的key 获取制定key的value值 本地安装jq失败 解决办法,离线下载`jq`依赖包`oniguruma ...
最新文章
- chrome 扩展开发注意事项
- jforum oracle报错,JForum安装在Oracle数据库上
- SpringBoot整合easyexcel实现导入导出
- idea没有RunDashboard解决办法
- HashMap两种遍历数据的方式
- tensorflow越跑越慢_tensorflow如何解决越运行越慢的问题
- 学习笔记 VB.NET 特殊字符
- linux如何制作服务,linux把jar做成服务
- java并发面试题整理
- leetcode刷题日记-1044. 最长重复子串
- html swf修改参数,HTML网页中如何向swf传递参数
- Linux 之六 Shell、终端(Terminal)、控制台(Console)、CLI 命令行界面、GUI 图形用户界面(X、X11、Xfree86、Xorg、GNOME、KDE)
- 计算机组装要哪些硬件,DIY组装电脑要买哪些硬件
- 王者服务器修改,王者荣耀
- 科研教育「双目视觉技术」首选!维视MV-VS220双目立体视觉系统开发平台
- 微信公众号之错误返回码
- 8.23 正点原子领航者V1开发板学习之EEPROM
- 《悲伤逆流成河》影评
- 模拟器Active Sync同步使用pc网络
- Go语言如何捕获fatal致命错误并输出到日志
热门文章
- 基于javaweb的蓝天幼儿园管理系统(java+springboot+thymeleaf+html+mysql)
- STM32F105RCT6使用CubeMX初始化工程——2:初始化CAN通信
- html5简单幻灯片图片转换,用纯CSS实现简单的相册幻灯片
- POWER BI里如何累计求和(一)
- 数组去重——将数组中重复的元素去掉
- 数位DP入门笔记(1)HUD-2089
- Windows 7-11/Server 三蛋多合一精简优化Windows系统
- API 接口大全之 1688
- img图片在webpack中使用
- 小程序支付报错:向微信请求统一下单失败:商户号该产品权限未开通,请前往商户平台>产品中心检查后重试