剪切命令字段

剪切命令字段

我使用命令注意到这两个不同的字段行为cut

bash:~$ var=`cat /proc/cpuinfo | grep 'model name' | uniq | cut -d ' ' -f 3,4,5,6,7,8 `  
echo $var

输出

Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz  

和:

bash:~$ echo `cat /proc/cpuinfo | grep 'model name' | uniq` | cut -d ' ' -f 3,4,5,6,7,8

输出

: Intel(R) Core(TM) i7-3632QM CPU @  

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

答案1

model name这是因为不带引号的 `` 反引号命令替换删除了和字符之间的额外空格:。请参阅不带 的输出,亲自grep查看差异

echo `cat /proc/cpuinfo | grep 'model name' | uniq`
model name : Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz

cat /proc/cpuinfo | grep 'model name' | uniq
model name  : Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
#         ^^ - 2 spaces rather than one

因此,在这两种情况下,cut从数字开始都会看到不同的字段。如果您避免使用反引号并使用正确的引号替换,则3可以修复此问题$(..)

echo "$(cat /proc/cpuinfo | grep 'model name' | uniq)" | cut -d ' ' -f 3,4,5,6,7,8

但话虽如此,可以避免顺序使用cat/ etc,并且可以使用单个 /etc 来代替它grepawk

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

或者更准确地说,如果上述结果中的单个前导空格令人担忧,请使用将其删除sub

awk -F: '$1 ~ "model name" { sub(/^[[:space:]]/ ,"" , $2); print $2 }' /proc/cpuinfo

或者,如果您有启用 PCRE 正则表达式GNU的变体grep,您可以将其用作

grep -oP 'model name(\s+):(\s+)\K(.+)' /proc/cpuinfo

相关内容