brianegge Asked: 2010-02-11 15:20:14 +0800 CST2010-02-11 15:20:14 +0800 CST 2010-02-11 15:20:14 +0800 CST 如何在 Solaris 上提取正则表达式的匹配部分 772 GNU 的 grep 有选项--only-matching,它只打印正则表达式的匹配区域。我在一个没有安装任何 GNU 工具的 Solaris 5.10 机器上,我正在尝试实现同样的目标。例子: grep -Eo "[0-9]+ ms" *.log 是否有可以做同样事情的 sed 或 awk 表达式? solaris regex grep 3 个回答 Voted Best Answer Dennis Williamson 2010-02-11T15:32:59+08:002010-02-11T15:32:59+08:00 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 中,我不得不使用扩展正则表达式,因为我无法让基本的增强正则表达式工作(如果你更改为GNU sed,这也可以工作,但基本的增强版本也可以在那里工作):-E-r sed -En 's/(^|.*[^0-9])([0-9]+ ms).*/\2/p' *.log 即使您要搜索的序列出现在没有前导字符的行首,后两个示例仍然有效。 Haggertus 2010-02-11T16:13:21+08:002010-02-11T16:13:21+08:00 尝试使用 /usr/sfw/bin/ggrep /usr/sfw/bin/ggrep -V grep (GNU grep) 2.5 版权所有 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。 > brianegge 2010-02-11T16:20:27+08:002010-02-11T16:20:27+08:00 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 (为便于阅读,多行格式化)
sed
支持此类交替的版本的可能改进:在 OS X 中,我不得不使用扩展正则表达式,因为我无法让基本的增强正则表达式工作(如果你更改为GNU
sed
,这也可以工作,但基本的增强版本也可以在那里工作):-E
-r
即使您要搜索的序列出现在没有前导字符的行首,后两个示例仍然有效。
尝试使用 /usr/sfw/bin/ggrep
版权所有 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。
>
Solaris 5.10 包括具有现代正则表达式引擎的 bash 3.00。follow 命令有效,尽管它比 grep 或 sed 解决方案更冗长。
(为便于阅读,多行格式化)