在版本名称和版本号之间过滤

Filter between version names and version numbers

当我 运行 脚本 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

有了GNU awk,我可以想象

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

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

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

即添加NR > 3条件

或者使用 sed:

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

即:

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/ # then substitute as before.

这取决于没有以数字结尾的软件包,同时还用句点与版本号分隔。也就是说,

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

将无法正常工作(它会给出 somepackag 2.3.4.5-10)。不过,这种格式似乎不太可能被允许。

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

由于 T 选项,仅适用于 GNU sed(或者在 posix 版本上需要一个 t jump;b clean^J:jump^J,其中 ^J 是一个真正的新行)