我在ansible下有json输出,我想使用解析此文件jq
。我要匹配软件包名称GeoIP
和打印版本号。
如何使用jq
此版本号来匹配软件包名称?看起来像这样的输出
"GeoIP","1.5.0"
采样输出
{
"ansible_facts.packages": {
"GConf2": [
{
"arch": "x86_64",
"epoch": null,
"name": "GConf2",
"release": "8.el7",
"source": "rpm",
"version": "3.2.6"
}
],
"GeoIP": [
{
"arch": "x86_64",
"epoch": null,
"name": "GeoIP",
"release": "14.el7",
"source": "rpm",
"version": "1.5.0"
}
],
"ImageMagick": [
{
"arch": "x86_64",
"epoch": null,
"name": "ImageMagick",
"release": "18.el7",
"source": "rpm",
"version": "6.7.8.9"
}
],
}
}
首先,通过删除倒数第三行中的逗号,使源有效json。
完成此操作后,我们可以从头开始,然后再进行工作。可以使用jq的@csv格式生成所需的输出。反过来,这要求输出位于数组中。(请参见手册标题为“设置字符串格式和转义格式”的部分。)因此,我们需要使数据看起来像这样。
jq -r '["GeoIP","1.5.0"] | @csv'
一种方法是将每个项目放在自己的数组中,然后将数组加在一起。(请参阅标题为“添加”的部分。)
jq -r '["GeoIP"] + [.[] | .GeoIP[].version] | @csv'
由于map(x)
定义为[.[] | x]
,您可以这样说。
jq -r '["GeoIP"] + map(.GeoIP[].version) | @csv'
您可以像这样使用变量来指定所需的包名称。
jq -r --arg "package" "GeoIP" '[$package] + map(.[$package][].version) | @csv'
更新资料
我原来的解决方案有不必要的步骤。数组可以这样制作。
jq -r '[ "GeoIP", .[].GeoIP[].version ] | @csv'
或者,使用一个变量
jq -r --arg "package" "GeoIP" '[$package,(.[] | .[$package][].version)]| @csv'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句