Bash 脚本 - 如何连接以下字符串?

nob*_*ody 8 command-line bash scripts sed

这是在 Linux (Ubuntu/Fedora) 中bash进行cpuid发现的脚本部分:

/usr/bin/cpuid > id.txt    
CPUID=id.txt    
echo `grep "extended model" $CPUID` | sed 's/0x//' | awk ' { print $4 } ' > cpu.txt    
a=`cat cpu.txt`    
echo `grep "extended family" $CPUID`| sed 's/0x//' | awk ' { print $4 } ' > cpu.txt    
a+=`cat cpu.txt`
Run Code Online (Sandbox Code Playgroud)

因此,对于我的笔记本电脑,脚本的这一部分(此处显示)给出了 60。

现在如何只使用局部变量来做到这一点,而不cpu.txt涉及中间文件 ( )?

hee*_*ayl 10

一气呵成:

printf '%s%s\n' "$(grep -Pom1 'extended model.*\(\K\d+' <(cpuid))" \
                "$(grep -Pom1 'extended family.*\(\K\d+' <(cpuid))"
Run Code Online (Sandbox Code Playgroud)

以上利用了进程替换 ( <()) 和命令替换 ( $())。

  • 两个命令替换被替换为内部命令的 STDOUT

  • cpuid命令放在进程替换中,STDOUT 将作为文件描述符返回,grep将对其进行必要的匹配,我们使用grepPCRE ( -P) 仅获取 ( -o) 所需的部分,并-m1在第一次匹配后停止以避免重复

  • printf 用于以所需格式获取输出

例子:

$ printf '%s%s\n' "$(grep -Pom1 'extended model.*\(\K\d+' <(cpuid))" "$(grep -Pom1 'extended family.*\(\K\d+' <(cpuid))"
30
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 9

您可以通过使用避免了中间文件,你能避免使用都sedawk做您的匹配和替换在awk

/usr/bin/cpuid | 
  awk '/extended model/ {mod = substr($4,3)} /extended family/ {fam = substr($4,3)} 
  END {printf "%d%d\n", mod, fam}'
Run Code Online (Sandbox Code Playgroud)