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)
您可以通过使用避免了中间文件管,你能避免使用都sed和awk做您的匹配和替换在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)