我有两个文件:
其输出yum list installed
现在是 yum_installed,yum list updates
现在是 yum_updates
我需要的是以某种方式将这两个文件合并起来,但仅基于需要更新的软件包。假设我的“yum_installed”文件理论上包含 6 个软件包:
openssh-clients.i386 4.3p2-82.el5 installed
openssh-server.i386 4.3p2-82.el5 installed
openssl.i686 0.9.8e-22.el5_8.4 installed
oprofile.i386 0.9.4-20.el5 installed
orca.i386 1.0.0-5.el5 installed
pam.i386 0.99.6.2-12.el5 installed
我的 yum_updates 假设只包含这些包,但如果你注意到,只有 openssl 需要更新,所以这是 1 个包。
ntp.i386 4.2.2p1-17.el5.centos updates
openldap.i386 2.3.43-28.el5_10 updates
openssl.i686 0.9.8e-27.el5_10.4 updates
pcre.i386 6.6-9.el5 base
perl.i386 4:5.8.8-41.el5 base
pidgin.i386 2.6.6-32.el5 updates
我要做的基本上就是拥有这个例子中的软件包,即 openssl 以及它旁边的当前版本和更新版本。我的 yum_installed 文件很长,并且包含不需要更新的软件包。我不关心这些。
最终输出应该是这样的(用空格分隔的行就可以了,但这里我使用管道来分隔输出。)
openssl.i686 | 0.9.8e-22.el5_8.4 | 0.9.8e-22.el5_8.4
答案1
这是一种方法:
$ awk 'FNR==NR {a[$1]=$2; next} $1 in a && a[$1]!=$2 {print $1, a[$1], $2}' OFS="\t" inst upd
openssl.i686 0.9.8e-22.el5_8.4 0.9.8e-27.el5_10.4
它循环遍历installed
文件并将该对存储(package, version)
在a[]
数组中。然后它循环遍历updated
列表并检查:
- 如果包裹被存储并且
installed
该版本与存储的版本不匹配- 打印
package
++installed
。update
答案2
检查“join”命令,它可能可以实现您想要的功能。