使用jq的Ansible输出提取包版本

sfgroups

我在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章