如何在Solaris上提取正则expression式的匹配部分

GNU的grep--only-matching选项, --only-matching打印正则expression式的匹配区域。 我在没有安装任何GNU工具的Solaris 5.10机器上,我试图达到同样的目的。 例:

 grep -Eo "[0-9]+ ms" *.log 

有一个sed或awkexpression式可以做同样的事情吗?

 sed -n 's/.*[^0-9]\([0-9]\+ ms\).*/\1/p' *.log 

支持这种types转换的sed版本的一个可能的改进:

 sed -n 's/\(^\|.*[^0-9]\)\([0-9]\+ ms\).*/\2/p' *.log 

在OS X中,我不得不使用扩展的正则expression式,因为我无法获得基本的增强型正则expression式(如果将-E改为-r ,也可以在GNU sed ,但是基本的增强版本在那里工作,太):

 sed -En 's/(^|.*[^0-9])([0-9]+ ms).*/\2/p' *.log 

即使您search的序列出现在行的开头,没有前导字符,后面的这两个示例也能正常工作。

尝试使用/ usr / sfw / bin / ggrep

/ usr / sfw / bin / ggrep -V grep(GNU grep)2.5

Copyright 1988,1992-1999,2000,2001 Free Software Foundation,Inc.这是免费软件; 请参阅复制条件的来源。 没有保修; 甚至不适用于适销性或针对特定用途的适用性。

>

Solaris 5.10包含bash 3.00,它有一个现代的正则expression式引擎。 遵循命令的工作,虽然它比grep或sed解决scheme更详细。

 cat *.log | while read line; do if [[ $line =~ "([0-9]+) ms" ]]; then echo "${BASH_REMATCH[1]}"; fi; done 

(为了便于阅读,在多行上格式化)