如何从 yum 生成可用更新列表并导出为 CSV,包括每个包的当前版本和更新版本?

How to generate a list of available updates from yum and export to CSV, including current and updated version of each package?

我正在 运行Centos 7 机器上安装以下脚本。这个想法是列出当前可用于更新的包,以及当前版本和新版本。完成此操作后,我会将结果发送到 .csv 文件以导入到 excel.

这是我正在使用的 bash 脚本:

#! /usr/bin/bash

echo \"timestamp\",\"package name\",\"current version\",\"update version\"
yum -q check-update| while read i
do
    i=$(echo $i) #this strips off yum's irritating use of whitespace
    if [ "${i}x" != "x" ]
    then
        TIMESTAMP=$( date +%D" "%r )
        UVERSION=${i#*\ }
        UVERSION=${UVERSION%\ *}
        PNAME=${i%%\ *}
        PNAME=${PNAME%.*}
        echo \"$TIMESTAMP\",$(rpm -q "${PNAME}" --qf '"%{NAME}","%{VERSION}","')${UVERSION}\"
    fi
done

结果如下:

"timestamp","package name","current version","update version"
"06/20/18 02:19:37 PM","cloudbackup-updater","1.5.3","1.5.16-1"
"06/20/18 02:19:37 PM","dhclient","4.1.1","12:4.1.1-53.P1.el6.centos.4"
"06/20/18 02:19:37 PM","dhcp-common","4.1.1","12:4.1.1-53.P1.el6.centos.4"
"06/20/18 02:19:37 PM","kernel","2.6.32",""kernel","2.6.32",""kernel","2.6.32",""kernel","2.6.32",""kernel","2.6.32","2.6.32-696.30.1.el6"
"06/20/18 02:19:37 PM","kernel-firmware","2.6.32","2.6.32-696.30.1.el6"
"06/20/18 02:19:37 PM","kernel-headers","2.6.32","2.6.32-696.30.1.el6"

注意第 5 行是重复信息。我认为这是因为脚本在执行 RPM 查询时正在查询包 "kernel" 而不是全名 "kernel.x86_64"。

如果我运行

yum check-update

可以更新以下软件包:

cloudbackup-updater.noarch
dhclient.x86_64
dhcp-common.x86_64
kernel.x86_64
kernel-firmware.noarch
kernel-headers.x86_64

我的脚本有什么问题,导致它只匹配每个包名称的第一部分而不是全名?

问题是 PNAME 作业

PNAME=${PNAME%.*}

这是我用来从文件名中删除扩展名的东西。您正在删除句点右侧的所有内容(包括)。据我所知,真的不需要这条线。引用变量赋值也是一个好主意。所以像这样:

TIMESTAMP="$( date +%D" "%r )"
UVERSION="${i#*\ }"
UVERSION="${UVERSION%\ *}"
PNAME="${i%%\ *}"
#PNAME="${PNAME%.*}"

$PNAME 对这些作业的输出:

cloudbackup-updater.noarch
dhclient.x86_64
dhcp-common.x86_64
kernel.x86_64
kernel-firmware.noarch
kernel-headers.x86_64

编辑 我认为您的 while 循环错误地解析了 yum 的输出。尝试将该行更改为:

yum -q check-update | tr -s " " | while read PNAME UVERSION extra

这应该可以解决 yum 的 space 问题,因此您可以删除 i=$(echo $i)。此外,这会将各个值直接读入变量。然后,由于 $i 不再存在,您可以将 if [ "${i}x" != "x" ] 更改为 if [ "${PNAME}x" != "x" ](这实际上是一种非常聪明的检查空白的方法)。所以最终的脚本应该是这样的:

echo \"timestamp\",\"package name\",\"current version\",\"update version\"
yum -q check-update | tr -s " " | while read PNAME UVERSION extra
do
    if [ "${PNAME}x" != "x" ]; then
        TIMESTAMP=$( date +%D" "%r )
        echo \"$TIMESTAMP\",$(rpm -q "${PNAME}" --qf '"%{NAME}","%{VERSION}","')${UVERSION}\"
    fi
done