获取两个字符串之间的子字符串

时间:2019-12-10 15:06:08

标签: string bash

我正在制作一个返回系统信息的脚本。要获取CPU名称,我正在使用cat /proc/cpuinfo,并获得以下输出

cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
stepping        : 1
microcode       : 0xb000037
cpu MHz         : 2299.853
cache size      : 46080 KB
physical id     : 0

如何提取型号名称? (英特尔(R)至强(R)CPU E5-2686 v4 @ 2.30GHz) 也许有一种方法可以在模型名称\ t:和步进之间获取文本?

4 个答案:

答案 0 :(得分:0)

带有grep的简单cut可以做到。如果有多个CPU,可以选择添加uniq

grep "model name" /proc/cpuinfo | cut -d: -f2 | uniq

答案 1 :(得分:0)

您可以使用awk,使用冒号作为字段分隔符,测试包含“模型名称”的第一个字段,然后打印第二个字段:

awk -F: '$1 ~ /model name/ {print $2}' /proc/cpuinfo

答案 2 :(得分:0)

sed可以做到。

sed -n 's/model name[ \t]*: //p' /proc/cpuinfo

您应该注意,您可能会得到多行,而且它们可能并不完全相同。

您还应该知道,它并不总是“型号名称”。我的几个较旧的盒子都有“处理器”。

所以也许:

sed -n 's/\(model name\|Processor\)[ \t]*: //p' /proc/cpuinfo | uniq

答案 3 :(得分:0)

如果您真的想完全用bash来完成它,切开字符串,请考虑一下:

#!/bin/bash

a="$( cat /proc/cpuinfo )"

b="${a//$'\n'/ }"
b="${b//$'\t'/ }"

b="${b#*model name : }"
b="${b%%stepping *}"

echo "$b"

$ {b#* text}从b中删除与“ text”匹配的最短前缀。 $ {b %% text }从b中删除匹配“ text *”的最长前缀。 由于“ *”似乎无法跨行使用,因此我首先将换行符和制表符减少为空格。

(我认为直接使用bash脚本是正确的答案。)