连接列的脚本

连接列的脚本

我有两个文件:

其输出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++ installedupdate

答案2

检查“join”命令,它可能可以实现您想要的功能。

相关内容