我有一个脚本在无限循环中生成这种输出流:
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我想在“速度”之后提取整数,在这个例子中是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]*'但是这个正则表达式是错误的,它没有提出任何东西。我怎么才能解决这个问题?
问候
发布于 2018-10-16 11:33:20
你可以用
grep -Po 'Speed\s*\K\d+'或者,如果需要的话,也可以得到分数部分。
grep -Po 'Speed\s*\K\d+(\.\d+)?'见在线演示
详细信息
Speed -一个文字子字符串\s* - 0+白空间\K -一个匹配重置操作符(丢弃所有与匹配值相配的文本)\d+ - 1+数字(\.\d+)? - .和1+数字的可选序列发布于 2018-10-16 11:42:23
如果输出总是这样(即之间没有额外的行),那么一个简单的cut -d' ' -f6就可以完成这个任务。
发布于 2018-10-16 11:34:02
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列。
https://stackoverflow.com/questions/52834507
复制相似问题