【问题标题】:How to get just a list of yum updates如何仅获取 yum 更新列表
【发布时间】:2014-05-16 15:06:40
【问题描述】:

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

    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 等的列表,这看起来很简单,但这并不是因为我不能只在“updates”或“:”上使用 grep。我看错了吗?为什么我不想捕获在脚本中发现的更新?我应该只更新并检查已更新的内容吗?想法?

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

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

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

基本上抓取带有句点的行,即第一行,并确保它首先包含字母。也许做得过头了,但它似乎奏效了。

【问题讨论】:

  • 标题行总是 3 行吗?
  • 不,它可以是任何东西......因此问题

标签: bash yum


【解决方案1】:

仅打印(但不包括)“更新包”之后的行

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

注意,在我的 Fedora 系统上,一个空白行将“标题”与可更新包列表分开,所以我会使用 awk 'p;/^$/{p=1}'

【讨论】:

  • 你的很接近,我不知道该奖励谁......哈哈谢谢。基本上我们可以通过不是字母的行来缩小范围: yum check-update | grep -v 插件 | awk '(NR >=1) {打印 $1;}' | grep '^[[:alpha:]]'
  • @MikeQ,awk 几乎可以做任何 grep 可以做的事情,你可以简化:yum check-update | awk '!/plugins/ && /^[[:alpha;]]/ {print $1}'
【解决方案2】:

如果您使用此命令将上面的输出通过管道传输到 awk:

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

你会得到以下输出

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

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

您可以阅读here,了解有关在每行的某些字符之后删除内容的更多信息。 如果在 .很重要

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

给出以下输出

package1
package2
package3
package4

然后用逗号将其通过管道传递到另一个 sed 命令到 replace the linebreaks

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

产生以下输出

package1,package2,package3,package4

【讨论】:

  • 这非常接近我的需要。我认为我们想做这样的事情来更加防弹:yum check-update | grep -v 插件 | awk '(NR >=1) {打印 $1;}' | grep '^[[:alpha:]]'
  • 您不确定顶部标题行是否会是 1、2 或者甚至是 l 长度的 0。我想给予部分功劳,这可能吗?
【解决方案3】:

更灵活的解决方案

下面的解决方案不假定标题中有特定数量的行(例如,在 CentOS 中,我得到了更多的标题行)。
也不认为您只对存储库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】:

    试试这个:

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

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

    【讨论】:

    • 这不是一种过于安全的方法......不过还不错,谢谢分享......
    • @MikeQ,“过于安全的方式”是什么意思?它可能不是跨发行版的便携版,但它始终可以在您的发行版上运行。 :)
    【解决方案5】:

    这不是更简单吗:

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

    已编辑。

    命令说明:

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

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

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 2020-08-04
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2021-10-18
    • 2021-10-10
    相关资源
    最近更新 更多