我如何构建一个仅从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
第一个(也是唯一的)捕获组。