我有一个脚本可以无限循环地产生这种输出流:
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]*'
但是该正则表达式是错误的,它没有任何结果。我怎样才能解决这个问题?
致谢
答案 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