我有一个字符串如下:
30750 [uber-SubtaskRunner] INFO org.apache.hadoop.hive.ql.exec.Task - Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 1
现在我想从中提取数字并使用shell脚本添加它们。基本上我想得到映射器和缩减器数量的总和。基于'空格字符'拆分字符串似乎对我有用,任何正则表达式模式都可以完成。
由于
答案 0 :(得分:1)
你可以使用Perl one-liner:
perl -ne '$s+=$1 foreach /number of .*?: (\d+)/g; print $s'
awk版本:
awk '{while(match($0,"number of [^:]+: ([[:digit:]]+)",a)){s+=a[1];$0=substr($0,RSTART+RLENGTH)}}END{print s}'
说明:
while()
循环将所有数字汇总到s
中使用正则表达式提取的变量match()
中。
match()
函数尝试在当前输入字符串(number of [^:]+: ([[:digit:]]+)
)中查找模式$0
并存储捕获组(在我们的例子中,括号中的子模式 - ([[:digit:]]+)
)在数组a
。number of [^:]+: ([[:digit:]]+)
匹配子字符串"number of <something not containing ':'>: <sequence of digits>"
,并将<sequence of digits>
(实际上是我们正在寻找的数字)捕获到捕获组1中。s+=a[1]
将s
match()
$0=substr($0,RSTART+RLENGTH)
从输入字符串$0
中删除所有(包括)子字符串匹配match()
中的模式的内容,以便此match()
在下一个字符串中进一步查找迭代。END{...}
)只打印s
中收集的总和。