剪切命令字段

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)

字段编号相同但输出不同。为什么?

Ini*_*ian 9

这是因为未加引号的 `` 反引号命令替换删除了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/ grepetc 并且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)