kubernetes集群管理之通过jq来截取属性
首先要声明,这里的jq并不是批前端框架里的jquery,而是一个处理json的命令行工具.
jq工具相比yq,它更加成熟,功能也更加强大,主要表现在以下几个方面
支持递归查找(我点对我们平时查看文件很方便)
支持条件过滤
支持控制语句
支持数组范围索引
这个工具在macos和windows都提供在线包安装服务,linux并没有官方包服务,需要下载后放到usr/bin目录下
centos下也可以通过以下方式安装
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum repolist
基本语法
基本语法格式如下
jq [options] <jq filter> [file...]
需要把文件放在最后面,但是也无所谓,很多时候我们并不处理本地的json,而是通过标准输入来处理其它来源类型的json
我本地存有一个叫作test.json的json文件,我们可以通过jq . test.json查看文件里的所有内容
{
"json": [
"rigid",
"better for data interchange"
],
"yaml": [
"slim and flexible",
"better for configuration"
],
"object": {
"key": "value",
"array": [
{
"name": null
},
{
"name": true
},
{
"name": 24
}
]
},
"paragraph": "Blank lines denote\nparagraph breaks\n",
"content": "Or we\ncan auto\nconvert line breaks\nto save space"
}
jq输出的json文件默认都是格式化过的,方便我们查看
我们仿照上一节,来获取json数组里的所有值.
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq .json test.json
[
"rigid",
"better for data interchange"
]
通过以下命令获取array数组
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq .object.array test.json
[
{
"name": null
},
{
"name": true
},
{
"name": 24
}
]
通过与上节jq类似的命令获取array里面的值
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq .object.array[].name test.json
null
true
24
数组也可以在中括号里面指定索引(跟绝大多数编程语言一样,从0开始)也与前面的yq类似,不同的是这里可以使用[start:end]的方式来索引范围
上面的例子我们这次不取全部,只取第0个和第一个
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq .object.array[0:2] test.json
[
{
"name": null
},
{
"name": true
}
]
除了索引范围以后,还可以索引不连续的对象,语法为[index1,index2,...]形式
例如,以下操作获取第零个和第二个对象
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq .object.array[0,2] test.json
{
"name": null
}
{
"name": 24
}
以上操作并索引并不一定按照从小到大的顺序,比如以下也是可以的
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq .object.array[1,0,2] test.json
{
"name": true
}
{
"name": null
}
{
"name": 24
}
可空对象
有时候我们不确定一个对象是否存在,这时候我们可以在对象后面跟个问号?来表明不确定这个对象是否存在
比如jq .yml? test.json表明你不确定yml这个属性在要查询的对象中是否存在,如果这个对象是不存在的,则返回的值为null
实际上你会发现,上面不写问号返回的值也是null,并不会报错.在这里体现的不明显,但是对数组类型的如果一个对象不存在写为数组形式就会报错
比如jq .yml[] test.json就会出现jq: error (at test.json:25): Cannot iterate over null (null)错误
而使用jq .yml[]? test.json即便yml对象不存在也不会报错
使用逗号,来取多个对象
假如我们想要同时取json和yaml这两个对象,可以使用,把两个命令分开,把它们的结果合在一块
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq .json,.yaml test.json
[
"rigid",
"better for data interchange"
]
[
"slim and flexible",
"better for configuration"
]
使用括号
上面的使用都逗号的命令里我们已经使用两条命令了,实际工作中可能有更加复杂的命令组合,这时候可以使用()来组织.在jq里使用()和在其它编程语言里使用相同.
使用管道符|
在jq里管道符概念和linux上概念基本相同.可以把上一个命令的结果作为下一个命令的输出.前面的.object.array也可以写作管道模式.object|.array先用.object取object的所有对象,然后结果作为下级管道的输入值,.array从管道结果里取array数组
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq '.object|.array' test.json
[
{
"name": null
},
{
"name": true
},
{
"name": 24
}
]
递归查找子对象
在kubernetes 的jsonpath里,可以使用..来查找子对象,非常方便,惟一不好的是如果子对象包含数组类型则显示为Map[xxx]类型,并且展示的结果不再是json格式,可读性不是特别好.比较遗憾的是,在jq里并不支持..这种语法,而是更为复杂一些,需要使用管道符.
命令的格式如下
..|.对象名?
首先这里使用了..表示从根对象开始取,然后使用管道符,后面之所以使用可空对象(对象后面带问号)是因为它会在每一层都查找,不使用可空对象的话找不到就会报错.
假如我们并不知道array对象的上一层是什么,但是知道这个对象存在.可以使用下面命令来获取.
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq '..|.array?' test.json
null
[
{
"name": null
},
{
"name": true
},
{
"name": 24
}
]
null
null
null
这里之所以会出现好多的null,因为jq会进入每一层对象里面查找,找不到就返回null.为了展示美观,我们也可以做一些简的处理
tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ jq '..|.array?' test.json|sed 's/null//g'
[
{
"name":
},
{
"name": true
},
{
"name": 24
}
]
以上命令使用sed把null替换为空,这里不够优雅的地方在于把第一个name的值null也替换为空了.
这里的命令外层加了引号,之所以要加引号是因为这个管道是jq管道,如果不加引号就会被shell识别为shell命令管道,从而导致错误.
过滤对象
我们使用示例来说明,使用以下命令获取kubernetes集群中的一个pod的conditions信息
[centos@k8s-master ~]$ kubectl get pod consul-0 -ojson|jq '.status.conditions[]'
[
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:19:28Z",
"status": "True",
"type": "Initialized"
},
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:25:06Z",
"status": "True",
"type": "Ready"
},
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:25:06Z",
"status": "True",
"type": "ContainersReady"
},
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:19:28Z",
"status": "True",
"type": "PodScheduled"
}
]
现在我想要过滤type为Ready的对象,可以使用以下命令
[centos@k8s-master ~]$ kubectl get pod consul-0 -ojson|jq '.status.conditions[]|select(.type=="Ready")'
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:25:06Z",
"status": "True",
"type": "Ready"
}
以上命令把status里的conditions数组对象做为输入传递给管道下一级,然后使用select函数里面传入条件.
以上是完全匹配type属性值为Ready,如果想要模糊匹配,则可以通过管道使用contains函数
[centos@k8s-master ~]$ kubectl get pod consul-0 -ojson|jq '.status.conditions[]|select(.type|contains("Ready"))'
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:25:06Z",
"status": "True",
"type": "Ready"
}
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:25:06Z",
"status": "True",
"type": "ContainersReady"
}
这样,两个type值包含Ready的全部被选择出来了.
正则匹配
上面的过滤条件中,由于Ready是大写的,因此不论是相等比较还是包含比较,都必须使用大写,如果是小写则无法匹配到.但是很多时候我们可能对大小写是不清楚的,我们希望匹配的时候区分大小写,这在jq里也是可以做到的,我们使用match函数,match函数为正则匹配函数.接收一个数组形式的参数,数组的第一项为要匹配的内容,第二项为开关(比如g代表全局开关,i则代表不区分大小写)
我们把上面的示例改造如下
[centos@k8s-master ~]$ kubectl get pod consul-0 -ojson|jq '.status.conditions[]|select(.type|match(["ready","i"]))'
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:25:06Z",
"status": "True",
"type": "Ready"
}
{
"lastProbeTime": null,
"lastTransitionTime": "2019-05-14T07:25:06Z",
"status": "True",
"type": "ContainersReady"
}
这样使用正则表达式我们就可以不区分大小写匹配了.
以上只列出了工作中可能常用的功能,详细功能可以查看官方文档
kubernetes集群管理之通过jq来截取属性的更多相关文章
- 美团点评Kubernetes集群管理实践
背景 作为国内领先的生活服务平台,美团点评很多业务都具有非常显著.规律的”高峰“和”低谷“特征.尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长.这对集群中心的资源弹性和可用性有非常高的要 ...
- 基于Python+Django的Kubernetes集群管理平台
➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...
- 快速部署Kubernetes集群管理
这篇文章介绍了如何快速部署一套Kubernetes集群,下面就快速开始吧! 准备工作 //关闭防火墙 systemctl stop firewalld.service systemctl disabl ...
- kubernetes集群管理常用命令一
系列目录 我们把集群管理命令分为两个部分,第一部分介绍一些简单的,但是可能是非常常用的命令以及一些平时可能没有碰到的技巧.第二部分将综合前面介绍的工具通过示例来讲解一些更为复杂的命令. 列出集群中所有 ...
- 052.Kubernetes集群管理-故障排错指南
一 故障指南 1.1 常见问题排障 为了跟踪和发现在Kubernetes集群中运行的容器应用出现的问题,常用如下查错方法: 查看Kubernetes对象的当前运行时信息,特别是与对象关联的Event事 ...
- 049.Kubernetes集群管理-集群监控Metrics
一 集群监控 1.1 Metrics Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的 ...
- Kubernetes集群管理工具kubectl命令技巧大全
一. kubectl概述 Kubectl是用于控制Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署. kubectl命令的语法如下 ...
- kubernetes集群管理命令(三)
系列目录 前面两节我们由浅入深介绍了不少kubernetes管理比较常用的命令.本节我们通过案例讲解一些需要更为复杂的操作才能完成的命令. 选择一个deployment下的所有pod 前面讲到过,ku ...
- kubernetes集群管理命令(二)
系列目录 上一节我们介绍了一些基本的命令,这一节我们介绍一些更为复杂的命令. pod排序 使用kubectl get pod获取pod资源默认是以名称排序的,有些时候我们可能希望按其它顺序排序.比如说 ...
随机推荐
- 【bzoj1925】[Sdoi2010]地精部落 组合数学+dp
题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到 ...
- 二进制<4>
位运算简介及实用技巧(四):实战篇 下面分享的是我自己写的三个代码,里面有些题目也是我自己出的.这些代码都是在我的Pascal时代写的,恕不提供C语言了.代码写得并不好,我只是想告诉大家位运算在实战中 ...
- HDU-3315 My Brute
先对于每种可能的PK情况进行判断胜负,然后求最小改动最大匹配. #include <cstdlib> #include <cstdio> #include <cstrin ...
- [luoguP2763] 试题库问题(最大流)
传送门 每个类别和它所有的试题连一条权值为1的边. 增加一个超级源点s,s和每个类别连一条权值为选当前类别数量的边. 增加一个超级汇点t,每个试题和t连一条权值为1的边. 求最大流即可. ——代码 # ...
- inux下rz、sz的简单安装
工具/原料 在xshell或者SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于RHEL5, rz/sz默认没有安装所以需要手工安装. sz: ...
- 【CF711D】Directed Roads(环,强连通分量)
题意: 给一张N个点N条有向边的图,边可以逆向.问任意逆向若干条边使得这张图无环的方案数(mod 1e9+7). n<=200000 思路:三个样例给的好 找规律方便很多 易得有N点的环有(2^ ...
- linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/17093297 最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动. 看的过 ...
- 23深入理解C指针之---数组的基础
数组是c语言内置的数据结构,数组有一维数组.二维数组和多维数组.使用数组传递数组时,必须传入数组的大小. 一.数组的特征:阐明数组的特点 1.数组要素: 1).数组类型:数组中存储的数据的类型: 2) ...
- Yii中的数据库事务的使用方法小结
在项目中遇到批量删除的地方一般会使用到事务,下面列举一个用法实例与大家分享. 查看代码 打印 01 <?php 02 $array=array( 03 0=>array('us ...
- Redis监控工具—Redis-stat、RedisLive
Redis监控工具—Redis-stat.RedisLive https://blog.csdn.net/u010022051/article/details/51104681