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
(为了便于阅读,在多行上格式化)