美文网首页
shell研究(段落截取)

shell研究(段落截取)

作者: 六十三63 | 来源:发表于2018-03-12 23:11 被阅读0次

    今天要处理一个文本,格式是大约这样的
    这一看就知道是类似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研究(段落截取)

          本文链接:https://www.haomeiwen.com/subject/mjoofftx.html