cut campos de comando

4

Eu notei esses dois comportamentos de campos diferentes usando o comando cut :

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

saídas

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

e:

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

saídas

: Intel(R) Core(TM) i7-3632QM CPU @  
Os números dos campos

são os mesmos, mas diferentes saídas. Por quê?

    
por pietro letti 01.11.2018 / 10:05

1 resposta

8

É porque a substituição do comando 'backquote' sem aspas removeu um espaço extra entre os caracteres model name e : . Consulte as saídas sem o grep para ver a diferença para você mesmo

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

e com

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

Como resultado, o cut vê campos diferentes do número 3 em diante nos dois casos. Isso pode ser corrigido se você evitar o uso de backticks e usar $(..) com uma substituição citada apropriada

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

Mas, dito isto, usando cat / grep etc sequencialmente pode ser evitado e um único awk pode ser usado no lugar dele

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

Ou, ainda mais, se um único espaço principal no resultado acima for preocupante, remova-o usando sub

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

Ou se você tiver GNU variante de grep que tem o regex PCRE ativado, que você pode usar como

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