如何获得yum更新列表

时间:2014-05-16 15:06:41

标签: bash yum

好的,我一直有这个问题。我想要使​​用yum从Linux系统(RHEL或Fedora)通过bash脚本列出文件中列出的可用更新,但我总是要处理创建的Header信息,如下所示:

    Loaded plugins: XXXX-repo  XXXX-updates
                  : WWWWWW-repo  something-updates  QQQQQ-updates
     Updated packages
     package1.i686         1:234                  RHEL 6.5 updates
     package2.i686         1:234                  RHEL 6.5 updates
     package3.i686         1-234                  RHEL 6.5 updates
     package4.noarch       1.234                  RHEL 6.5 updates

我想要的只是一个package1,package2等的列表,这看起来很简单,但它不是因为我不能只是更新"更新"或":"。我错误地看着这个吗?为什么我不想捕获脚本中发现的更新?我应该更新并检查已更新的内容吗?想法?

PS>我不能使用--noplugins选项。

编辑:到目前为止,我已经提出了这个问题,

     sudo yum check-update | grep "\." | awk '(NR >=1) {print $1;}' | grep '^[[:alpha:]]'

基本上抓住第一行中带有句点的行,并确保它首先包含字母。也许已经完成但似乎有效。

5 个答案:

答案 0 :(得分:4)

仅打印以下(但不包括)"更新的包"

之后的行
yum check-update | awk 'p; /Updated packages/ {p=1}'

注意,在我的Fedora系统上,一个空白行分隔了"标题"从可更新包列表中,我将使用awk 'p;/^$/{p=1}'

答案 1 :(得分:3)

如果使用此命令将上面的输出传输到awk:

| awk '(NR >=4) {print $1;}'

您将获得以下输出

package1.i686
package2.i686
package3.i686
package4.noarch

(NR> = 4)告诉awk忽略前三行。 {print $ 1;}告诉awk打印每行的第一个单词。

您可以阅读here,了解有关在每行上的某些字符后切出的更多信息。 然后,你可以使用sed,如果删除后的所有内容。很重要

| awk '(NR >=4) {print $1;}' | sed s/\.[^\.]*$// 

提供以下输出

package1
package2
package3
package4

然后用逗号将其传递到replace the linebreaks的另一个sed命令。

| awk '(NR >=4) {print $1;}' | sed s/\.[^\.]*$// | sed ':a;N;$!ba;s/\n/,/g'

产生以下输出

package1,package2,package3,package4

答案 2 :(得分:1)

试试这个:

yum check-update | awk '{if($5 ~ /updates/){print $1}}' | tr '\n' ','

如果输入包含第五列的“更新”,则打印第一列并创建一个csv列表。

答案 3 :(得分:1)

更灵活的解决方案

下面的解决方案没有在Header中假设特定数量的行(例如,在CentOS中我获得了更多的header行)。
也不假设您只对存储库updates感兴趣。

yum check-update | awk '/\S+\s+[0-9]\S+\s+\S+/ {print $1 }' > updates

示例

对于以下yum check-update输出

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                    |  31 kB  00:00:00  
 * base: asi-fs-m.net
Excluding mirror: mirror.de.leaseweb.net
Excluding mirror: mirror.fra10.de.leaseweb.net
base                                    | 3.6 kB  00:00:00  
cwp                                     | 2.9 kB  00:00:00  
extras                                  | 3.4 kB  00:00:00  
mariadb                                 | 2.9 kB  00:00:00  
remi-safe                               | 3.0 kB  00:00:00  
updates                                 | 3.4 kB  00:00:00  
remi-safe/primary_db                    | 1.4 MB  00:00:00  

openvpn.x86_64          2.4.7-1.el7              epel  
polkit.x86_64           0.112-18.el7_6.1         updates  
pure-ftpd.x86_64        1.0.47-2.el7             epel  
remi-release.noarch     7.6-2.el7.remi           remi-safe

你可以得到

openvpn.x86_64
polkit.x86_64
pure-ftpd.x86_64
remi-release.noarch

说明

此解决方案假定相关行具有模式
<package name><spaces><version number><spaces><repo name>

如果要输出特定的存储库,请使用模式
/\S+\s+[0-9]\S+\s+repo_name/

PS:

如果该解决方案在您的系统中不起作用,请在评论中告诉我

答案 4 :(得分:0)

这难道不是很容易吗?

yum check-update -q | awk '{print $1}'

已编辑。

命令说明:

yum check-update -p-将在3列列表中列出更新,即软件包+新版本+存储库。

awk'{print $ 1}'-将提取第一列(数据包)