我正在制作一个 conky 配置,我想将 CPU 型号显示为统计数据之一。为此,我需要一个命令,仅将 CPU 名称输出为字符串,例如“Intel Core i7 7700K”。我认为 和 的/proc/cpuinfo
输出lscpu
都有我需要的(我更喜欢它,lscpu
因为它会稍微更高效),但型号名称与制造商名称相距 4 个空格。所以我需要截断字符串model name:
并删除多余的空格。我还想知道如何删除@ (clockspeed)
。
答案1
$ lscpu | sed -nr '/Model name/ s/.*:\s*(.*) @ .*/\1/p'
Intel(R) Atom(TM) CPU Z3735F
笔记
-n
在我们要求之前不要打印任何内容-r
使用 ERE/Model name/
找到Model name
s/old/new/
old
用。。。来代替new
.*:\s*
冒号、冒号之前的任何内容以及任意数量的水平空格(.*) @
保存任意数量的字符' @'
\1
参考已保存的模式p
仅打印我们编辑的行
要删除双空格,您可以执行额外的s
命令:
$ lscpu | sed -nr '/Model name/ s/ / /g; s/.*:\s*(.*) @ .*/\1/p'
Intel(R) Atom(TM) CPU Z3735F
如果任何地方有两个以上的空格,则此方法不起作用,因此要不断删除多个空格,请使用循环sed
:
$ lscpu | sed -nr ':a;s/ / /;ta; /Model name/ s/.*: (.*) @ .*/\1/p'
Intel(R) Atom(TM) CPU Z3735F
这:a;s/ / /;ta
会继续处理流,直到任何地方都没有双空格。请注意,它不会接受地址,因此我们必须仔细检查整个流,然后再选择行。当我们仅解析 的输出时,这不会花费太多时间lscpu
,但在大型文件或多个文件上,它可能会变得非常慢。我们可以使用循环将原始命令的输出传送到另一个命令,sed
以避免处理整个流:
$ lscpu | sed -nr '/Model name/ s/.*:\s*(.*) @ .*/\1/p' | sed ':a;s/ / /;ta'
Intel(R) Atom(TM) CPU Z3735F
答案2
lscpu | grep 'Model name' | cut -f 2 -d ":" | awk '{$1=$1}1'
lscpu
获取 CPU 信息grep 'Model name'
提取包含 CPU 名称的行。cut -f 2 -d ":"
删除 之前的部分行。因此它将从输出中:
删除部分“ ”。Model name:
awk '{$1=$1}1'
删除行首的空格。
示例输出
$ lscpu | grep 'Model name' | cut -f 2 -d ":" | awk '{$1=$1}1'
Intel(R) Pentium(R) CPU N3520 @ 2.16GHz
答案3
使用它来获得你想要的东西:
lscpu | grep "Model name:" | sed -r 's/Model name:\s{1,}//g'
结果:
Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
或者:
lscpu | grep "Model name" | sed -r 's/Model name:\s{1,}(.*) @ .*z\s*/\1/g'
结果:
Intel(R) Core(TM) i5-4210U CPU