今天要处理一个文本,格式是大约这样的
这一看就知道是类似redhat发行版在官网公布的补丁。
标注格式为
到期日期,紧急度,官网对应号,简介
rpm包
04/23/1775 M 1775:0416.1 SUSE-SU-1775:0172-1: moderate: Security update for rsync
rsync 3.0.4-2.52.1 < 3.0.4-2.53.6.1
04/26/1775 M 1775:0479.1 SUSE-SU-1775:0230-1: moderate: Security update for curl
curl 7.19.7-1.70.8.1 < 7.19.7-1.70.13.1
libcurl4 7.19.7-1.70.8.1 < 7.19.7-1.70.13.1
04/29/1775 M 1775:0509.1 SUSE-SU-1775:0246-1: moderate: Security update for xorg-x11-libs
xorg-x11-libs 7.4-8.26.49.1 < 7.4-8.26.50.5.3
05/09/1775 M 1775:0718.1 SUSE-SU-1775:0395-1: moderate: Security update for libxml2
libxml2 2.7.6-0.77.3.2 < 2.7.6-0.77.10.1
libxml2-python 2.7.6-0.77.3.5 < 2.7.6-0.77.10.1
05/17/1775 M 1775:0809.1 SUSE-SU-1775:0462-1: moderate: Security update for freetype2
freetype2 2.3.7-25.44.1 < 2.3.7-25.45.5.1
05/20/1775 M 1775:0819.1 SUSE-SU-1775:0465-1: moderate: Security update for unzip
unzip 6.00-11.17.1 < 6.00-11.18.3.1
05/29/1775 M 1775:0931.1 SUSE-SU-1775:0555-1: important: Security update for the Linux Kernel
kernel-default 3.0.101-108.21.1 < 3.0.101-108.35.1
kernel-default-base 3.0.101-108.21.1 < 3.0.101-108.35.1
05/30/1775 M 1775:0948.1 SUSE-SU-1775:0565-1: important: Security update for glibc
glibc 2.11.3-17.110.3.1 < 2.11.3-17.110.6.2
glibc-32bit 2.11.3-17.110.3.1 < 2.11.3-17.110.6.2
glibc-i18ndata 2.11.3-17.110.3.1 < 2.11.3-17.110.6.2
glibc-locale 2.11.3-17.110.3.1 < 2.11.3-17.110.6.2
glibc-locale-32bit 2.11.3-17.110.3.1 < 2.11.3-17.110.6.2
01/12/1840 L 1775:0294.1 SUSE-SU-1775:0117-1: moderate: Security update for rsync
rsync 3.0.4-2.52.1 < 3.0.4-2.53.3.1
01/18/1840 L 1775:0427.1 SUSE-SU-1775:0178-1: moderate: Security update for ncurses
libncurses5 5.6-93.12.1 < 5.6-93.15.1
libncurses6 5.6-93.12.1 < 5.6-93.15.1
ncurses-utils 5.6-93.12.1 < 5.6-93.15.1
terminfo 5.6-93.12.1 < 5.6-93.15.1
terminfo-base 5.6-93.12.1 < 5.6-93.15.1
01/31/1840 L 1775:0666.1 SUSE-SU-1775:0362-1: important: Security update for bind
bind-libs 9.9.6P1-0.50.1 < 9.9.6P1-0.51.7.1
bind-utils 9.9.6P1-0.50.1 < 9.9.6P1-0.51.7.1
02/07/1840 L 1775:0739.1 SUSE-SU-1775:0409-1: moderate: Security update for libdb-4_5
db-utils 4.5.20-95.39 < 4.5.20-97.5
预想结果是带日期的的号码对应下面的rpm包和相应版本号
例如
1775:0416.1:rsync-3.0.4-2.53.6.1
1775:0479.1:curl-7.19.7-1.70.13.1 libcurl4-7.19.7-1.70.13.1
……
研究了一上午的结果是
pr_need_num () {
mssnum=`grep -n ^[0-9] tempfile|awk -F':' '{print $1}'`
i=1
while [ $i -le `echo $mssnum|awk '{print NF}'` ]
do
num=`echo $mssnum|awk -v i=$i '{print $i}'`
if [ $num = `echo $mssnum|awk '{print $NF}'` ];then
enum=`sed -n "$num"p tempfile|awk '{print $3}'`
rpmlist=`sed -n "$num,$"p tempfile|tail -n +2|awk '{print $1"-"$NF}'`
echo $enum:$rpmlist
else
startline=`echo $mssnum|awk -v i=$i '{print $i}'`
enum=`sed -n "$startline"p tempfile|awk '{print $3}'`
a=`expr $i + 1`
endline=`echo $mssnum|awk -v a=$a '{print $a}'`
rpmlist=`sed -n "$startline,$endline"p tempfile|tail -n +2|head -n -1|awk '{print $1"-"$NF}'`
echo $enum:$rpmlist
fi
i=`expr $i + 1`
done
}
分析
pr_need_num () {
mssnum=`grep -n ^[0-9] tempfile|awk -F':' '{print $1}'`#先选出带号码的行号,拼成一个长字符串
i=1#给个数字,用作循环
while [ $i -le `echo $mssnum|awk '{print NF}'` ]#当i小于等于mssnum时,循环
do
num=`echo $mssnum|awk -v i=$i '{print $i}'`#给i循环出来的变量一个赋值
if [ $num = `echo $mssnum|awk '{print $NF}'` ];then#判断该变量是否为mssnum这个长字符的最后一位
enum=`sed -n "$num"p tempfile|awk '{print $3}'`#把号码赋值
rpmlist=`sed -n "$num,$"p tempfile|tail -n +2|awk '{print $1"-"$NF}'`#把号码到文件末尾的rpm包信息取出来(这一步是就是与前面为何要判断是否为最后一位有关的)
echo $enum:$rpmlist#打印出想要的结果 号码:rpm包名和要升级的版本
else#以下都是不是最后一位的,这样截取的数据就是两个号码之前的数据
startline=`echo $mssnum|awk -v i=$i '{print $i}'`#赋值起始行
enum=`sed -n "$startline"p tempfile|awk '{print $3}'`#把号码赋值
a=`expr $i + 1`#给下一号码赋值的需要,就是说这次循环里mssnum的下一位
endline=`echo $mssnum|awk -v a=$a '{print $a}'`#赋值下一个号码行
rpmlist=`sed -n "$startline,$endline"p tempfile|tail -n +2|head -n -1|awk '{print $1"-"$NF}'`#截取两个号码之前的rpm包信息
echo $enum:$rpmlist#打印出想要的结果
fi
i=`expr $i + 1`#循环每次加一位。
done
}
执行效果如下
[myname@myserver]$ pr_need_num
1775:0416.1:rsync-3.0.4-2.53.6.1
1775:0479.1:curl-7.19.7-1.70.13.1 libcurl4-7.19.7-1.70.13.1
1775:0509.1:xorg-x11-libs-7.4-8.26.50.5.3
1775:0718.1:libxml2-2.7.6-0.77.10.1 libxml2-python-2.7.6-0.77.10.1
1775:0809.1:freetype2-2.3.7-25.45.5.1
1775:0819.1:unzip-6.00-11.18.3.1
1775:0931.1:kernel-default-3.0.101-108.35.1 kernel-default-base-3.0.101-108.35.1
1775:0948.1:glibc-2.11.3-17.110.6.2 glibc-32bit-2.11.3-17.110.6.2 glibc-i18ndata-2.11.3-17.110.6.2 glibc-locale-2.11.3-17.110.6.2 glibc-locale-32bit-2.11.3-17.110.6.2
1775:0294.1:rsync-3.0.4-2.53.3.1
1775:0427.1:libncurses5-5.6-93.15.1 libncurses6-5.6-93.15.1 ncurses-utils-5.6-93.15.1 terminfo-5.6-93.15.1 terminfo-base-5.6-93.15.1
1775:0666.1:bind-libs-9.9.6P1-0.51.7.1 bind-utils-9.9.6P1-0.51.7.1
1775:0739.1:db-utils-4.5.20-97.5
这样我就一口气知道我的server要安装什么补丁,不用一个号码文档一次查看我的server的rpm包,然后对照出来要更新什么rpm。
还可以更简单的的接下去
赋值给一个变量
[myname@myserver]$ list="1775:0416.1:rsync-3.0.4-2.53.6.1
> 1775:0479.1:curl-7.19.7-1.70.13.1 libcurl4-7.19.7-1.70.13.1
> 1775:0509.1:xorg-x11-libs-7.4-8.26.50.5.3
> 1775:0718.1:libxml2-2.7.6-0.77.10.1 libxml2-python-2.7.6-0.77.10.1
> 1775:0809.1:freetype2-2.3.7-25.45.5.1
> 1775:0819.1:unzip-6.00-11.18.3.1
> 1775:0931.1:kernel-default-3.0.101-108.35.1 kernel-default-base-3.0.101-108.35.1
> 1775:0948.1:glibc-2.11.3-17.110.6.2 glibc-32bit-2.11.3-17.110.6.2 glibc-i18ndata-2.11.3-17.110.6.2 glibc-locale-2.11.3-17.110.6.2 glibc-locale-32bit-2.11.3-17.110.6.2
> 1775:0294.1:rsync-3.0.4-2.53.3.1
> 1775:0427.1:libncurses5-5.6-93.15.1 libncurses6-5.6-93.15.1 ncurses-utils-5.6-93.15.1 terminfo-5.6-93.15.1 terminfo-base-5.6-93.15.1
> 1775:0666.1:bind-libs-9.9.6P1-0.51.7.1 bind-utils-9.9.6P1-0.51.7.1
> 1775:0739.1:db-utils-4.5.20-97.5"
用各种管道给变量修改
1.sed '1iyum update'#第一行插入安装命令
2.sed 's/$/ \\/g'#每行末尾改成 \,就是换行输入(为了美观)
3.sed '$s/\\//g'#把最后一行的换行输入符替换为空
[20180312]$ echo "$list"|awk -F":" '{print $NF}'|sed '1iyum update'|sed 's/$/ \\/g'|sed '$s/\\//g'
yum update \
rsync-3.0.4-2.53.6.1 \
curl-7.19.7-1.70.13.1 libcurl4-7.19.7-1.70.13.1 \
xorg-x11-libs-7.4-8.26.50.5.3 \
libxml2-2.7.6-0.77.10.1 libxml2-python-2.7.6-0.77.10.1 \
freetype2-2.3.7-25.45.5.1 \
unzip-6.00-11.18.3.1 \
kernel-default-3.0.101-108.35.1 kernel-default-base-3.0.101-108.35.1 \
glibc-2.11.3-17.110.6.2 glibc-32bit-2.11.3-17.110.6.2 glibc-i18ndata-2.11.3-17.110.6.2 glibc-locale-2.11.3-17.110.6.2 glibc-locale-32bit-2.11.3-17.110.6.2 \
rsync-3.0.4-2.53.3.1 \
libncurses5-5.6-93.15.1 libncurses6-5.6-93.15.1 ncurses-utils-5.6-93.15.1 terminfo-5.6-93.15.1 terminfo-base-5.6-93.15.1 \
bind-libs-9.9.6P1-0.51.7.1 bind-utils-9.9.6P1-0.51.7.1 \
db-utils-4.5.20-97.5
好了,这下复制这个然后回车一遍。你的更新rpm就完成。
PS。如果你的环境允许你yum update ,请忽视全篇文章。
网友评论