过滤版本名称和版本号

时间:2015-03-05 09:02:40

标签: linux bash awk sed grep

当我运行脚本kit_version.sh时,我得到以下输出

 #  ./kit_version.bash

  --- USAW Kits ---
  RPM Kits                               Installed Time
  ------------------------------------   ---------------------------------
 APP-IR-LRPS-1.1.0.0-01            Thu 15 Nov 2012 11:10:20 AM IST
 APP-V-LRPS-4.3.7.0-01             Mon 15 Oct 2012 04:27:54 PM IST
 batter-ic-4.3.0.0-04              Mon 24 Feb 2014 02:10:21 PM IST
 CSHRS-Monitoring-5.0.0.0-03       Mon 24 Feb 2014 03:32:43 PM IST
 CS-RH-watchdog-conf-5.0.0.0-03    Mon 24 Feb 2014 03:32:42 PM IST
 CSe-OSP-Bin-5.0.0.0-01            Mon 24 Feb 2014 03:28:00 PM IST
 sca_core_2.5.7.0-7                Sun 29 Mar 2015 02:36:46 PM IDT
 sca_data:80.7.0-7                 Sun 29 Mar 2015 02:37:04 PM IDT
 .
 .
 .

如何过滤输出,所以我只在第一个字段中输入包名和第二个字段 只有版本号如下:

 ./kit_version.bash | ......



APP-IR-LRPS             1.1.0.0-01            
APP-V-LRPS              4.3.7.0-01            
batter-ic               4.3.0.0-04               
CSHRS-Monitoring        5.0.0.0-03      
CS-RH-watchdog-conf         5.0.0.0-03   
CSe-OSP-Bin             5.0.0.0-01     
sca_core                2.5.7.0-7
sca_data                80.7.0-7
  • 备注 - 版本号与版本号之间的分隔符可以是不同的字符

2 个答案:

答案 0 :(得分:1)

使用GNU awk,我可以想象

 ./kit_version.bash | gawk '{ print gensub(/.([0-9.]+-[0-9.]+)$/, "\t\\1", 1, $1) }'

这将替换匹配第一个字段末尾的版本号的字符串之前的字符和制表符,并打印该替换的结果。要切断前三行,请使用

awk 'NR > 3 { print gensub(/.([0-9.]+-[0-9.]+)$/, "\t\\1", 1, $1) }'

即添加NR > 3条件。

或者选择sed:

./kit_version.bash | sed '1d;2d;3d;s/[[:space:]].*//;s/.\([0-9.]\+-[0-9.]\+\)$/\t\1/'

那是:

1d                              # first three lines: delete
2d
3d
s/[[:space:]].*//               # remove everything after the first space,
                                # i.e., everything except the first field
s/.\([0-9.]\+-[0-9.]\+\)$/\t\1/ # then substitute as before.

这取决于没有以数字结尾的包,同时也是按期限从版本号分隔。也就是说,

#            vvvvvvvv-- if this is supposed to be the version
somepackage2.3.4.5-10

将无法正常工作(它将提供somepackag 2.3.4.5-10)。但是,似乎不太可能允许这种格式。

答案 1 :(得分:1)

./kit_version.bash \
| sed 's/^[[:space:]]*\([^[:space:]]*\).*/\1/;T clean;s/[-._]\([0-9][0-9._-]*\)$/\t\1/;t;:clean;s/.*//'
  • 重新格式化该行(删除标题空间和试用信息)
  • 如果没有modif,请去清理行
  • 重新格式化以将版本与名称
  • 分开

仅使用T选项导致的GNU sed(或者在t jump;b clean^J:jump^J是真正新行的posix版本上需要^J