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

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

GNU 的 grep 有一个选项--only-matching,它只打印正则表达式的匹配区域。我在 Solaris 5.10 机器上,没有安装任何 GNU 工具,我试图实现同样的事情。示例:

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

是否有 sed 或 awk 表达式可以做同样的事情?

答案1

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

sed对于支持此类交替的版本,可能进行改进:

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

在 OS X 中,我不得不使用扩展正则表达式,因为我无法让基本的增强正则表达式工作(sed如果您更改-E-r,这也可以在 GNU 中工作,但基本增强版本在那里也可以工作):

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

即使您搜索的序列出现在行首且没有前导字符,后两个示例仍然有效。

答案2

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

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

版权所有 1988、1992-1999、2000、2001 Free Software Foundation, Inc. 这是免费软件;请参阅来源以了解复制条件。不提供任何担保;甚至不提供适销性或特定用途适用性的担保。

>

答案3

Solaris 5.10 包含 bash 3.00,它具有现代正则表达式引擎。follow 命令可以工作,尽管它比 grep 或 sed 解决方案要冗长得多。

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

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

相关内容