从Bash中恒定输出中提取数字

时间:2018-10-16 11:31:26

标签: regex bash perl awk grep

我有一个脚本可以无限循环地产生这种输出流:

m  17:24:34|ethminer  Speed 377.61 Mh/s    gpu/0 29.01  gpu/1 29.91  gpu/2 30.21  gpu/3 28.71  gpu/4 28.11  gpu/5 27.96  gpu/6 28.71  gpu/7 29.01  gpu/8 28.48  gpu/9 28.86  gpu/10 29.91  gpu/11 29.08  gpu/12 29.68  [A1484+5:R0+0:F0] Time: 04:19

我想提取“ Speed”之后的整数,在这种情况下为377。到目前为止,我假设该字符串名为string:

$string |  grep -oP '(?<=Speed).*'

我知道了

377.61 Mh/s    gpu/0 29.01  gpu/1 29.91  gpu/2 30.21  gpu/3 28.71  gpu/4 28.11  gpu/5 27.96  gpu/6 28.71  gpu/7 29.01  gpu/8 28.48  gpu/9 28.86  gpu/10 29.91

我想通过执行以下操作来摆脱结尾的字符串:

$string |  grep -oP '(?<=Speed).*'  | grep -o -E '[1-9][0-9][0-9]*'

但是该正则表达式是错误的,它没有任何结果。我怎样才能解决这个问题?

致谢

5 个答案:

答案 0 :(得分:3)

您可以使用

grep -Po 'Speed\s*\K\d+'

或者,如果有必要,还可以得到小数部分

grep -Po 'Speed\s*\K\d+(\.\d+)?'

请参见online demo

详细信息

  • Speed-文字子字符串
  • \s*-超过0个空格
  • \K-匹配重置运算符(将所有匹配的文本丢弃到匹配值之外)
  • \d+-1个以上数字
  • (\.\d+)?-.和1+个数字的可选序列

答案 1 :(得分:2)

如果这样的输出总是 (即它们之间没有多余的行),那么简单的cut -d' ' -f6就可以了。

答案 2 :(得分:1)

awk 'match($0,"Speed [0-9]+.?[0-9]*"){print substr($0,RSTART+6,RLENGTH-6)}'
sed '/Speed/s/.*Speed \([^ ]*\).*/\1/'

,如果每行的格式总是相同,则可以执行以下操作:

awk '{print $6}' file

这意味着,每行在第5列中始终具有单词速度,并且您要打印第6列。

答案 3 :(得分:1)

能否请您尝试以下。考虑到您的Input_file与所示示例相同。

awk '{sub(/.*Speed /,"");sub(/ .*/,"")} 1' Input_file

如果要将输出保存到Input_file本身,请尝试执行以下操作。

awk '{sub(/.*Speed /,"");sub(/ .*/,"")} 1' Input_file > temp_file && mv temp_file Input_file

说明:也在此处添加说明。

awk '                  ##awk script starts from here.
{
  sub(/.*Speed /,"")   ##Using sub for substitution operation which will substitute from starting of line to till Speed string with NULL fir current line.
  sub(/ .*/,"")        ##Using sub for substitution of everything starting from space to till end in current line with NULL.
}
1                      ##Mentioning 1 will print edited/non-edited lines in Input_file.
' Input_file           ##Mentioning Input_file name here.

答案 4 :(得分:1)

sed也可以。

$: echo $string | sed -En '/ Speed /{ s/.* Speed ([0-9]+).*/\1/; p; }'
377