t型布局网站怎么做,痘痘怎么去除有效果,做网站找哪家好要钱吗,商务网站建设步骤在shell脚本中#xff0c;当我们需要对JSON数据#xff08;例如ceph、kubernetes等一些命令的输出#xff0c;或是调用API获得的响应#xff09;进行处理和提取时#xff0c;如果使用传统的文本三剑客sed、awk和grep#xff0c;命令将会非常臃肿不可读。虽然这三个命令在…在shell脚本中当我们需要对JSON数据例如ceph、kubernetes等一些命令的输出或是调用API获得的响应进行处理和提取时如果使用传统的文本三剑客sed、awk和grep命令将会非常臃肿不可读。虽然这三个命令在处理松散结构的数据时很有用但当面对JSON这类数据时却显得不够优雅。
jq就是这样一个命令行工具专门用于处理JSON数据特别适用于shell脚本。
jq命令的使用
首先我们需要安装jq命令yum install jq -y
创建如下的示例文件一张学生成绩表
# cat test.json
[{ name: zhangsan, gender: male, score: 80 },{ name: lisi, gender: male, score: 90 },{ name: wangerma, gender: female, score: 100 }
]jq命令的标准语法为jq [options] jq filter [file...]最简单的过滤器为.它将输入原封不动地转换为输出会做格式化、高亮例如
# jq . test.json
[{name: zhangsan,gender: male,score: 80},{name: lisi,gender: male,score: 90},{name: wangerma,gender: female,score: 100}
]这个命令可以用于检测输入是否为合格的json例如将test.json修改为
# cat test.json
[{ name: zhangsan, gender: male, score: 80 },{ name: lisi, gender: male, score: 90 },{ name: wangerma, gender: female, score: 100 }则命令会报错
# jq . test.json
parse error: Unfinished JSON term at EOF at line 6, column 0所以我们可以写如下shell作判断
#!/bin/bash
if jq . test.json /dev/null 21
thenecho valid json
else echo invalid json
fi检索键值
如果我们将需要获取所有学生的姓名列表如下
[zhangsan,lisi,wangerma
]该怎么做为此我们需要先使用数组迭代器.[]来获取列表中每一项值
# jq .[] test.json
{name: zhangsan,gender: male,score: 80
}
{name: lisi,gender: male,score: 90
}
{name: wangerma,gender: female,score: 100
}然后获取每一项输出的name键值这里使用我们熟悉的管道符|
# jq .[] | .name test.json
zhangsan
lisi
wangerma如果想要去掉输出中的双引号可以使用-r参数输出原始字符串
# jq -r .[] | .name test.json
zhangsan
lisi
wangerma接下来我们可以在过滤器的最外层加上[]来讲结果转换为列表
# jq [.[] | .name] test.json
[zhangsan,lisi,wangerma
]以上过滤器的表达式看起来似乎有些臃肿了好在jq提供了map函数因此我们可以将上述表达式替换为
# jq map(.name) test.json
[zhangsan,lisi,wangerma
]使用add函数对键值进行求和
仿照上述语法我们可以可以获得所有学生的成绩列表
# jq map(.score) test.json
[80,90,100
]同样。使用管道符|接add函数即可轻松获取所有学生的成绩总和
# jq map(.score) | add test.json
270使用select获取部分键值
如果我们想要对所有男生的成绩进行求和就需要使用select(condition)函数了所有condition为true的输入会被保留false则会被丢弃如我们获取所有性别为男的数据gender male
# jq map(select(.gender male)) test.json
[{name: zhangsan,gender: male,score: 80},{name: lisi,gender: male,score: 90}
]进一步获取所有男生的分数
# jq map(select(.gender male).score) test.json
[80,90
]最后求和
# jq map(select(.gender male).score) | add test.json
170将输入转换为新的格式输出
如果我们想将上述步骤中的输出合并为一个新的json数据并输出则可以使用如下方式进行格式化输出
# jq { students: map(.name), totalscore: map(.score) | add, totalmalescore: map(select(.gender male).score) | add } test.json
{students: [zhangsan,lisi,wangerma],totalscore: 270,totalmalescore: 170
}总结
在shell脚本中处理json数据jq命令是个很好的选择。
本教程将对这个命令的用法只进行了简单入门介绍如需了解详细语法可以参看官方文档https://jqlang.github.io/jq/manual/