首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Bash常量输出中提取数字

从Bash常量输出中提取数字
EN

Stack Overflow用户
提问于 2018-10-16 11:31:26
回答 5查看 154关注 0票数 1

我有一个脚本在无限循环中生成这种输出流:

代码语言:javascript
复制
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:

代码语言:javascript
复制
$string |  grep -oP '(?<=Speed).*'

我得到了

代码语言:javascript
复制
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

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

代码语言:javascript
复制
$string |  grep -oP '(?<=Speed).*'  | grep -o -E '[1-9][0-9][0-9]*'

但是这个正则表达式是错误的,它没有提出任何东西。我怎么才能解决这个问题?

问候

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-10-16 11:33:20

你可以用

代码语言:javascript
复制
grep -Po 'Speed\s*\K\d+'

或者,如果需要的话,也可以得到分数部分。

代码语言:javascript
复制
grep -Po 'Speed\s*\K\d+(\.\d+)?'

在线演示

详细信息

  • Speed -一个文字子字符串
  • \s* - 0+白空间
  • \K -一个匹配重置操作符(丢弃所有与匹配值相配的文本)
  • \d+ - 1+数字
  • (\.\d+)? - .和1+数字的可选序列
票数 3
EN

Stack Overflow用户

发布于 2018-10-16 11:42:23

如果输出总是这样(即之间没有额外的行),那么一个简单的cut -d' ' -f6就可以完成这个任务。

票数 2
EN

Stack Overflow用户

发布于 2018-10-16 11:34:02

代码语言:javascript
复制
awk 'match($0,"Speed [0-9]+.?[0-9]*"){print substr($0,RSTART+6,RLENGTH-6)}'
sed '/Speed/s/.*Speed \([^ ]*\).*/\1/'

如果每行的格式化方式总是相同的,您可以这样做:

代码语言:javascript
复制
awk '{print $6}' file

这意味着,每一行在第5列中总是有一个单词“速度”,而您想要打印第6列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52834507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档