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 高级用法介绍相关推荐

  1. 远程工具之一---rsync用法介绍

    本文转载自:http://blog.csdn.net/niushuai666/article/details/16880061 rsync是一个远程同步工具,只对数据不一致的部分进行传递.作为一位运维 ...

  2. mysql pt_mysql之pt工具之pt-fifo-split用法介绍

    在工作中用到也比较多,在load data大文件时,如果文件太大会导致主从延时等问题,必须得将文件拆分成许多小文件,使用这个工具就不需要人工进行切割文件. 此工具只能工作在类unix操作系统.具体的可 ...

  3. 常用的json处理工具类

    json工具的使用说明 在日常的开发中,经常会对json字符串进行处理,最常见的操作为序列化和反序列化,而当后端的开发使用的是spring boot框架时,在前后端进行交互时,是会自动的序列化和反序列 ...

  4. Ajax是什么?Ajax高级用法之Axios技术

    Ajax AJAX 异步请求局部刷新 Ajax 参数详解 js.json.jsonp区别 json和jsonp的区别 同源策略 json和js对象的区别 Ajax高级用法(axios) 为什么要用Ax ...

  5. Linux Shell操作json工具jq

    Linux Shell操作json工具jq 背景 使用方式 背景 随着后台项目的开发,json协议的可视性好,组装与解封装的工具在各个平台都比较完备,所以能通过shell快速组装与解封装json能大大 ...

  6. c json 数组转dirction_值得掌握的命令行JSON工具jq

    我们都知道现在JSON是最常用的配置和数据交换格式之一,尤其是大量的系统API接口现在基本上都是以JSON格式显示结果.JSON(JavaScript Object Notation) 是一种轻量级的 ...

  7. linux shell json解析命令 jq 简介

    jq简介 jq可以对json数据进行分片.过滤.映射和转换,和sed.awk.grep等命令一样,都可以让你轻松地把玩文本.它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的 ...

  8. jq linux下载文件,linux下的json命令行工具–jq

    jq是一个很轻量却很强大的命令行下的json解析器.jq是json中的"sed"命令,它可以用来slice.filter.map.transform json数据.jq是用C编写的 ...

  9. Linux格式化显示json工具jq

    Linux格式化显示json工具jq 安装 格式化显示json 读取json文件 获取所有的key 获取制定key的value值 本地安装jq失败 解决办法,离线下载`jq`依赖包`oniguruma ...

最新文章

  1. chrome 扩展开发注意事项
  2. jforum oracle报错,JForum安装在Oracle数据库上
  3. SpringBoot整合easyexcel实现导入导出
  4. idea没有RunDashboard解决办法
  5. HashMap两种遍历数据的方式
  6. tensorflow越跑越慢_tensorflow如何解决越运行越慢的问题
  7. 学习笔记 VB.NET 特殊字符
  8. linux如何制作服务,linux把jar做成服务
  9. java并发面试题整理
  10. leetcode刷题日记-1044. 最长重复子串
  11. html swf修改参数,HTML网页中如何向swf传递参数
  12. Linux 之六 Shell、终端(Terminal)、控制台(Console)、CLI 命令行界面、GUI 图形用户界面(X、X11、Xfree86、Xorg、GNOME、KDE)
  13. 计算机组装要哪些硬件,DIY组装电脑要买哪些硬件
  14. 王者服务器修改,王者荣耀
  15. 科研教育「双目视觉技术」首选!维视MV-VS220双目立体视觉系统开发平台
  16. 微信公众号之错误返回码
  17. 8.23 正点原子领航者V1开发板学习之EEPROM
  18. 《悲伤逆流成河》影评
  19. 模拟器Active Sync同步使用pc网络
  20. Go语言如何捕获fatal致命错误并输出到日志

热门文章

  1. 基于javaweb的蓝天幼儿园管理系统(java+springboot+thymeleaf+html+mysql)
  2. STM32F105RCT6使用CubeMX初始化工程——2:初始化CAN通信
  3. html5简单幻灯片图片转换,用纯CSS实现简单的相册幻灯片
  4. POWER BI里如何累计求和(一)
  5. 数组去重——将数组中重复的元素去掉
  6. 数位DP入门笔记(1)HUD-2089
  7. Windows 7-11/Server 三蛋多合一精简优化Windows系统
  8. API 接口大全之 1688
  9. img图片在webpack中使用
  10. 小程序支付报错:向微信请求统一下单失败:商户号该产品权限未开通,请前往商户平台>产品中心检查后重试