我想从下面的行中提取timeTaken值:
<some other log data> Exception, Curl1-Time: 0.258315s. Curl2-Time: 3.9092588424683s Exiting.
grep -Po "Exception, Curl1-Time: \K(\d+.\d*)s. Curl2-Time: (\d+.\d+)" app.log | awk '{print $1 + $3}'
这输出: 4.167565
您已经使用PCRE。 为什么不使用Perl本身?
perl -lne 'print $1 + $2 if /Exception, Curl1-Time: ([\d.]+)s\. Curl2-Time: ([\d.]+)/ ' < input
如果你有GNU的grep
,那么你可以执行:
var="<some other log data> Exception, Curl1-Time: 0.258315s. Curl2-Time: 3.9092588424683s Exiting." grep -Eo '[[:digit:]]+\.[[:digit:]]+s?' <<< "$var"
或者你可以使用awk
并保持POSIX :
var="<some other log data> Exception, Curl1-Time: 0.258315s. Curl2-Time: 3.9092588424683s Exiting." awk '{ while (match($0, /[[:digit:]]+\.[[:digit:]]+s?/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' <<< "$var"
正如你所看到的,这两个命令都使用正则表达式[[:digit:]]+\.[[:digit:]]+s?
匹配一个或多个数字,一个点,一个或多个数字和一个可选 “s”的模式 。
GNU的grep
使用-o选项来提取匹配的正则表达式模式。
awk
版本使用其match
和substr
函数来匹配和提取相关数据。 在正则表达式匹配后, RSTART
和RLENGTH
被设置,我们可以使用它们来计算substr
的开始和结束位置。
RLENGTH
是match
函数匹配的子字符串的长度。
RSTART
是由match
函数匹配的子字符串的起始索引。
请参见字符串操作的内置函数部分
sed 's/.*Curl1-Time: \([0-9]\.[0-9]*\)s.*\([0-9]\.[0-9]*\)s.*$/\1 \2/p' filename | awk '{print ($1+$2);}'