运维就要无所不能,无所不会
大家好,我是Stanley「史丹利」,今天聊一些简单的技术实践: linux jq命令的一次有趣实践。文章目录如下:
一、背景
二、jq 命令用法
2.1 "."
2.2、[index]
2.3、管道线|
2.4、[]
2.5、其它有用功能
三、CentOS 7安装jq
linux jq命令的一次有趣实践
一、背景
我们的CMDB平台没有导出功能,但我想把某业务模块的ip列表拿出来。小100个ip地址,一个个去写太累了。
所以我打开debug
,对response
做json
转换,如果是json
或者yaml
格式,想过滤对应的列表就容易多了。比较幸运,前后台数据传输是标准的JSON
格式。
使用了强大的jq
命令二次处理数据。
# cat iplist.json | jq '[.][0] | {ip: .object.host_detail[].ip,env: .object.host_detail[].env}'
...
{
"ip": "1.1.1.1",
"env": "PROD"
}
{
"ip": "1.1.1.1",
"env": "PROD"
}
...
二、jq 命令用法
案例
# cat test.json
[{"name":"运维部落工具","url":"http://tool.osforce.cn.com","address":{"city":"厦门","country":"中国"},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"运维部落之家","url":"http://tool.zzhome.com","address":{"city":"大连","country":"中国"},"arrayBrowser":[{"name":"360","url":"http://www.so.com"},{"name":"bing","url":"http://www.bing.com"}]}]
2.1 "."
简单的jq程序是表达式".",它不改变输入,但可以将其优美地输出,便于阅读和理解。
2.2、[index]
输出列表中的个元素,可以使用[index]:
# cat test.json | jq '.[0]'
{
"name": "运维部落工具",
"url": "http://tool.osforce.cn.com",
"address": {
"city": "厦门",
"country": "中国"
},
"arrayBrowser": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
]
}
2.3、管道线|
jq支持管道线|
,它如同linux命令中的管道线——把前面命令的输出当作是后面命令的输入。如下命令把.[0]
作为{...}
的输入,进而访问嵌套的属性,如.name
和.address.city
。
观察如下几个命令,通过改变|
前后的输入和输出来达到不同的效果:
# cat test.json | jq '.[0] | {name:.name,city:.address.city}'
{
"name": "运维部落工具",
"city": "厦门"
}
# cat test.json | jq ".[] | {name:.arrayBrowser[1].name,city:.address.city}"
{
"name": "Baidu",
"city": "厦门"
}
{
"name": "bing",
"city": "大连"
}
2.4、[]
如果希望把jq的输出当作一个数组,可以在前后加上[]
:
cat test.json | jq "[.[] | {name:.arrayBrowser[1].name,city:.address.city}]"
[
{
"name": "Baidu",
"city": "厦门"
},
{
"name": "bing",
"city": "大连"
}
]
文首命令解释如下
# cat iplist.json | jq '[.][0] | {ip: .object.host_detail[].ip,env: .object.host_detail[].env}'
# [.] 将管道的输出转换为数组
# [.][] 取数组的个元素
# [.][] | {xxx} 将个元素的数据通过管道交给 {} 二次处理
# {ip: .object.host_detail[].ip,env: .object.host_detail[].env} 取.object.host_detail[].ip并设置key为ip,取env: .object.host_detail[].env并设置key为env
2.5、其它有用功能
分割切片功能
# 规则 jq ´.[-2]´
# 原字符串 [1,2,3]
# 结果 => 2
# 规则 jq ´.[:3]´
# 原字符串 ["a","b","c","d","e"]
# 结果 => ["a", "b", "c"]
# 规则 jq ´.[-2:]´
# 原字符串 ["a","b","c","d","e"]
# 结果 => ["d", "e"]
取指定字符串
jq ´.foo, .bar´
{"foo": 42, "bar": "something else", "baz": true}
=> 42, "something else"
jq ´.user, .projects[]´
{"user":"stedolan", "projects": ["jq", "wikiflow"]}
=> "stedolan", "jq", "wikiflow"
jq ´.[4,2]´
["a","b","c","d","e"]
=> "e", "c"
简单的运算
jq ´[ .[] | . * 2]´
[1, 2, 3]
=> [2, 4, 6]
haskey
jq ´map(has("foo"))´
[{"foo": 42}, {}]
=> [true, false]
jq ´map(has(2))´
[[,1], ["a","b","c"]]
=> [false, true]
选择比较
jq ´map(select(. >= 2))´
[1,5,3,,7]
=> [5,3,7]
匹配 key = value 选择
jq ´.[] | select(.id == "second")´
[{"id": "first", "val": 1}, {"id": "second", "val": 2}]
=> {"id": "second", "val": 2}
给key名增加关键字
jq ´with_entries(.key |= "KEY_" + .)´
{"a": 1, "b": 2}
=> {"KEY_a": 1, "KEY_b": 2}
扁平化数组
jq ´flatten´
[1, [2], [[3]]]
=> [1, 2, 3]
jq ´flatten(1)´
[1, [2], [[3]]]
=> [1, 2, [3]]
jq ´flatten´
[[]]
=> []
其它一些骚操作
jq ´10 / . * 3´
5
=> 6
其它诸如排序(sort)、取整(float)、开根(sqrt)、去重(unique)、inside、startswith、spilt、join等太多功能了,光用法就能写一本书出来了。。。大家自行摸索吧。
三、CentOS 7安装jq
系统环境
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
安装
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum repolist
yum install jq
原文链接:https://mp.weixin.qq.com/s/gesShq03zwHyAx0OxPu_yw