カットコマンドフィールド

カットコマンドフィールド

次のコマンドを使用して、2つの異なるフィールドの動作を確認しました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

ただし、/ etcのシーケンシャルな使用はcat避け、代わりに単一の/ etcを使用できます。grepawk

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

あるいは、より正確には、上記の結果で単一の先行スペースが問題になる場合は、次のように削除します。sub

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

または、regexGNUのPCREサポートバリアントがある場合は、grep次のように使用できます。

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

おすすめ記事