shell研究(段落截取)

今天要处理一个文本,格式是大约这样的
这一看就知道是类似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 ,请忽视全篇文章。

你可能感兴趣的:(shell研究(段落截取))