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

标签 linux bash centos7 rpm

我在 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 的空间问题,因此您可以删除 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

关于linux - 如何从 yum 生成可用更新列表并导出为 CSV,包括每个包的当前版本和更新版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50955927/

相关文章:

linux - linux 下 make 上的 tab 补全错误

linux - 如何在 vi 编辑器中输入特殊字符

java - Yajsw Stop INFO Log message while start stop daemon 在linux下

linux - root 用户的 Chef 客户端权限被拒绝

linux - 使用shell脚本将行插入到linux中的新文件中

linux - 如何测试文件中的某些字符

linux - 以用户 apache 身份运行 bash 脚本时找不到命令

linux - Linux下如何设置文件的权限?

linux - kubectl 版本返回错误

linux - 如何隐藏脚本的输出,同时解析内容以显示反馈?