好的,我一直有这个问题。我想要使用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:]]'
基本上抓住第一行中带有句点的行,并确保它首先包含字母。也许已经完成但似乎有效。
答案 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/
如果该解决方案在您的系统中不起作用,请在评论中告诉我
答案 4 :(得分:0)
这难道不是很容易吗?
yum check-update -q | awk '{print $1}'
已编辑。
命令说明:
yum check-update -p-将在3列列表中列出更新,即软件包+新版本+存储库。
awk'{print $ 1}'-将提取第一列(数据包)