如何从命令的输出中提取数字?

如何从命令的输出中提取数字?

我如何构建一个仅从2.60以下字符串打印的命令(另一个命令的输出,lscpu):

model name      : Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz

答案1

@<whitespaces>假设您要打印以 开头的行之间和GHz行尾处的数字model name,则为:

sed -nE 's/^model name.*@[[:space:]]*([.[:digit:]]+)GHz$/\1/p' /proc/cpuinfo

或者使用 GNU grep

grep -Po '^model name.*@\s*\K[.\d]+(?=GHz$)' /proc/cpuinfo

对于lscpu,另请参见:

lscpu -J | jq -r '
  .lscpu[] |
  select(.field == "Model name:").data |
  match("@\\s*([\\d.]+)GHz$").captures[0].string |
  tonumber'

或者:

lscpu -J | jq -r '.lscpu[]|select(.field == "CPU max MHz:").data|tonumber'

用于以 MHz 为单位的最大频率,而不是型号名称中的基本频率。

答案2

使用sed(GNUsed作为I不区分大小写匹配的标志)。

$ lscpu | sed -En 's/^model name.* ([0-9.]+).*/\1/Ip'
2.60

答案3

你可以尝试这样的事情awk

awk '{print int($NF*100)/100.0}' /proc/cpuinfo

该行可以重写,但我不确定不同的awk实现将如何处理它:

awk '{print $NF*1.0}' /proc/cpuinfo

这将打印2.6.如果你想让它为零,你可以使用:

awk '{printf "%4.2f",int($NF*100)/100.0}' /proc/cpuinfo

如果你想使用lscpu可以这样:

lscpu|awk '/odel name/ {print int($NF*100)/100.0}'

答案4

LANG=C lscpu | sed -rn "s/.*Model name.* @ (.*)GHz/\1/p"

LANG=C如果您的语言设置未设置为英语,则需要此选项。

sed 的 -n 默认情况下会抑制输出。 -r 用于简化捕获组的键入(不带反斜杠)。

如果满足条件 A,“s/A/B/p”命令将 A 替换为 B,并且 p 执行打印(因为我们默认抑制输出,这是必要的)。

A 是正则表达式,也是\1第一个(也是唯一的)捕获组。

相关内容