正则表达式模式从字符串中获取数字

时间:2016-08-11 12:11:41

标签: regex shell

我有一个字符串如下:

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脚本添加它们。基本上我想得到映射器和缩减器数量的总和。基于'空格字符'拆分字符串似乎对我有用,任何正则表达式模式都可以完成。

由于

1 个答案:

答案 0 :(得分:1)

你可以使用Perl one-liner:

perl -ne '$s+=$1 foreach /number of .*?: (\d+)/g; print $s'

演示:https://ideone.com/8ghKE5

awk版本:

awk '{while(match($0,"number of [^:]+: ([[:digit:]]+)",a)){s+=a[1];$0=substr($0,RSTART+RLENGTH)}}END{print s}'

演示:https://ideone.com/Hbccm9

说明:

  • 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中收集的总和。