(16)【cut】シェルスクリプトコマンド活用紹介

cutコマンド

  • 文字数を指定して切り出す
  • フィールドを指定して切り出す
  • 出力の区切り文字を変更する

cutコマンド概要

 「cut」は、ファイルを読み込んで、それぞれの行から指定した部分だけを切り出すコマンドです。例えば、「3文字目から10文字目」や、タブなどで区切られたファイルから「1番目のフィールドと3番目のフィールド」のように選んで取り出すことができます。

cutコマンドの書式

cut オプション [ファイル]

cutコマンドの主なオプション

オプション 意味
-c 切り出す位置のリストを文字数で指定する
-f 1,3または1-3 切り出す位置のリストをタブ区切りのフィールドで指定する(区切り文字は「-d」オプションで変更可能)
-d ‘文字’ フィールドの区切り文字として、タブの代わりに使用する文字を指定する(1文字のみ)

cutコマンド詳細説明

文字数を指定して切り出す

cutコマンドで頭から4文字を切り出す

$ STR="Hello World"
$ echo $string | cut -c 1-4 
Hell

bashの文字列変数で頭から4文字を切す

$ STR="Hello World"
$ echo ${STR:0:4}
Hell

sedコマンドで先頭から4文字切り出す

$ STR="Hello World"
$ echo "${STR}" | sed 's/^\(.\{4\}\).*$/\1/'
Hell

フィールドを指定して切り出す

フィールドの区切り文字は、デフォルトで ,(カンマ)とTAB(タブ)です。
特に指定しなければ、cutコマンドが考えて区切り文字として認識してくれます。
ただカンマとTABが混在している場合は不安ですね。
次の項で、区切り文字(デリミタ)を指定する方法を説明します。

区切り文字のデフォルトがカンマとタブだから
/etc/passwdのようにデリミタを指定しないときちんと区切られない。

$ sudo cat /etc/passwd | cut -f 1,7 | tail
_findmydevice:*:254:254:Find My Device Daemon:/var/db/findmydevice:/usr/bin/false
_datadetectors:*:257:257:DataDetectors:/var/db/datadetectors:/usr/bin/false
_captiveagent:*:258:258:captiveagent:/var/empty:/usr/bin/false
_ctkd:*:259:259:ctkd Account:/var/empty:/usr/bin/false
_applepay:*:260:260:applepay Account:/var/db/applepay:/usr/bin/false
_hidd:*:261:261:HID Service User:/var/db/hidd:/usr/bin/false
_cmiodalassistants:*:262:262:CoreMedia IO Assistants User:/var/db/cmiodalassistants:/usr/bin/false
_analyticsd:*:263:263:Analytics Daemon:/var/db/analyticsd:/usr/bin/false
_fpsd:*:265:265:FPS Daemon:/var/db/fpsd:/usr/bin/false
_timed:*:266:266:Time Sync Daemon:/var/db/timed:/usr/bin/false

デリミタを指定した場合はきちんと1番目、7番目のフィールドが切り取られました
まずはcutコマンドで実現します。

$ sudo cat /etc/passwd | cut -f 1,7 -d ':' | tail
_findmydevice:/usr/bin/false
_datadetectors:/usr/bin/false
_captiveagent:/usr/bin/false
_ctkd:/usr/bin/false
_applepay:/usr/bin/false
_hidd:/usr/bin/false
_cmiodalassistants:/usr/bin/false
_analyticsd:/usr/bin/false
_fpsd:/usr/bin/false
_timed:/usr/bin/false
$

同じことをawkコマンドでやってみます。デリミタの区切り指定は -F です。

$ sudo cat /etc/passwd | awk -F ':' '{ print $1":"$7;}' | tail
_findmydevice:/usr/bin/false
_datadetectors:/usr/bin/false
_captiveagent:/usr/bin/false
_ctkd:/usr/bin/false
_applepay:/usr/bin/false
_hidd:/usr/bin/false
_cmiodalassistants:/usr/bin/false
_analyticsd:/usr/bin/false
_fpsd:/usr/bin/false
_timed:/usr/bin/false
$
ヒント
文字を切り出す方法にもいくつかありますし、フィールドの切り出しにもいろいろな方法があります。用途に合わせて使い分けてください。最初のうちは、一つの方法を覚えておけばよいです。

書籍の紹介

(17)【expand】シェルスクリプトコマンド活用紹介

(17)【expand】シェルスクリプトコマンド活用紹介

(15)【du】シェルスクリプトコマンド活用紹介

(15)【du】シェルスクリプトコマンド活用紹介