pie*_*tti 5 grep awk cut uniq command-substitution
我使用cut
命令注意到这两个不同的字段行为:
bash:~$ var=`cat /proc/cpuinfo | grep 'model name' | uniq | cut -d ' ' -f 3,4,5,6,7,8 `
echo $var
Run Code Online (Sandbox Code Playgroud)
产出
Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
Run Code Online (Sandbox Code Playgroud)
和:
bash:~$ echo `cat /proc/cpuinfo | grep 'model name' | uniq` | cut -d ' ' -f 3,4,5,6,7,8
Run Code Online (Sandbox Code Playgroud)
产出
: Intel(R) Core(TM) i7-3632QM CPU @
Run Code Online (Sandbox Code Playgroud)
字段编号相同但输出不同。为什么?
这是因为未加引号的 `` 反引号命令替换删除了model name
和:
字符之间的额外空格。请参阅不带 的输出grep
以自己查看差异
echo `cat /proc/cpuinfo | grep 'model name' | uniq`
model name : Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
Run Code Online (Sandbox Code Playgroud)
与
cat /proc/cpuinfo | grep 'model name' | uniq
model name : Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
# ^^ - 2 spaces rather than one
Run Code Online (Sandbox Code Playgroud)
因此,在这两种情况下,cut
从数字3
开始都会看到不同的字段。如果您避免使用反引号并使用$(..)
适当的带引号替换,则可以解决此问题
echo "$(cat /proc/cpuinfo | grep 'model name' | uniq)" | cut -d ' ' -f 3,4,5,6,7,8
Run Code Online (Sandbox Code Playgroud)
但这就是说,可以避免顺序使用cat
/ grep
etc 并且awk
可以使用单个来代替它
awk -F: '$1 ~ "model name" { print $2 }' /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)
或者更准确地说,如果上述结果中的单个前导空格令人担忧,请使用 sub
awk -F: '$1 ~ "model name" { sub(/^[[:space:]]/ ,"" , $2); print $2 }' /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)
或者,如果您有启用 PCRE 正则表达式的GNU
变体grep
,您可以将其用作
grep -oP 'model name(\s+):(\s+)\K(.+)' /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)