好的,我一直有这个问题。我想通过使用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:]]'
基本上抓住第一行中带有句点的行,并确保它首先包含字母。也许过度完成但似乎有效。
仅打印以下(但不包括)“更新的包”的行
yum check-update | awk 'p; /Updated packages/ {p=1}'
注意,在我的Fedora系统上,一个空行将“标题”与可更新包列表分开,所以我会使用awk 'p;/^$/{p=1}'
如果使用此命令将上面的输出传递给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
试试这个:
yum check-update | awk '{if($5 ~ /updates/){print $1}}' | tr '\n' ','
如果输入包含第五列的“更新”,则打印第一列并创建csv列表。
下面的解决方案不假设标题中的特定行数(例如,在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/
如果此解决方案在您的系统中不起作用,请在评论中告诉我