UNIX/Linuxの部屋 cutコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド cut テキストを切り出す(パイプ) このエントリーをはてなブックマークに追加

最終更新


cut コマンドは、各行から「n 文字目から m 文字目」「n 番目から m 番目からのカラム」というようなルールで文字列を切り出す。空白 (スペース)・タブ・カンマなど、区切り文字を指定することもできる。cut コマンドは古くから存在するため (SystemIII で登場)、あらゆる UNIX/Linux 系 OS で使用可能である。



バイト数で指定
-b[num1]-[num2] num1 バイト目からnum2 バイト目までを切り出す。先頭は 0 ではなく 1 から始まる。
% cut -b30 < file.txt
⇒ file.txt の30バイト目を切り出す
% cut -b20-30 < file.txt
⇒ file.txt の20バイト目から30バイト目までを切り出す
% cut -b-30 < file.txt
⇒ file.txt の行頭から30バイト目までを切り出す
% cut -b20- < file.txt
⇒ file.txt の20バイト目以降を切り出す

文字数で指定
-c[num1]-[num2] num1 文字目からnum2 文字目までを切り出す。先頭は 0 ではなく 1 から始まる。
バイト単位で切り出す -b オプションと同様の動作をするが、正しくロケールを認識する Solaris などでは日本語としての文字数を指定できるが、Linux 系 OS では -c を指定しても -b と同じ扱い (バイト単位) になるようだ。
% cat file-euc.txt
あいうえお
% env LC_ALL=ja_JP.eucJP cut -c3-4 < file-euc.txt
うえ
⇒ 日本語として解釈し、3〜4文字目を切り出す
% cut -b3-4 < file-euc.txt

⇒ バイト単位だと 3〜4バイト目として扱われる
フィールド数で指定
-f フィールド番号 指定したフィールドを出力する。先頭は 0 ではなく 1 から始まる。
% cat file.txt
abc(TAB)def(TAB)ghi(TAB)(TAB)jkl
% cut -f 1 < file.txt
abc
⇒ 1番目のフィールドを表示
% cut -f 2,3 < file.txt
abc def
⇒ 2番目と 3番目のフィールドを表示
% cut -f 2- < file.txt
def ghi jkl
⇒ 2番目以降のフィールドを表示
デフォルトのフィールド区切りは TAB であるが、-d オプションを使うことでカンマや空白・スペース等に変更できる。
% command | cut -d',' -f 2,3
abc def
⇒ カンマを区切りとして、2番目と 3番目のフィールドを表示
% command | cut -d' ' -f 2,3
⇒ 空白・スペース区切りとして、2番目と 3番目のフィールドを表示
abc def

区切り文字 (デリミタ) を指定
cut コマンドの標準の区切り文字 (セパレータ) はタブ (TAB) であるが、-d オプションを使うと区切り文字を空白 (スペース) やカンマなどに変更することができる。-d オプションを使う場合は -f オプションを同時に指定しないと意味がないことに注意。
% cat file.txt
abc,def,ghi,,jkl
% cut -d , -f 2,3 < file.txt
def,ghi
⇒ カンマ区切りとみなして 2番目と 3番目のフィールドを表示
% command | cut -d" " -f 5-8
⇒ スペース区切りとみなして 5〜8番目のフィールドを表示

-d オプションでは複数の文字を指定することはできないため、「カンマと空白のいずれかを区切り文字とする」ということはできない。また、連続した区切り文字を 1つの区切り文字として扱うこともできない。

例えば ls コマンドのように
-rw-rw-r--  1 68user 68user      733  1月 13 15:35 2017 file1
-rw-rw-r--  1 68user 68user      318  1月 13 15:27 2017 file2
drwxrwxr-x  2 68user 68user     4096  3月 28 17:11 2017 dir
といった連続空白がある場合は、事前に tr や sed などで、カンマや連続空白を 1つの空白にまとめるなどの工夫が必要である。
% ls -l | tr -s ' ' | cut -d ' ' -f 5,9
⇒ 連続空白を 1つの空白にまとめた上で、5番目と9番目のフィールド (ファイルサイズとファイル名) を表示
% command | sed 's/[ \t][ \t]*/ /g' | cut -d ' ' -f 5,9
⇒ タブとスペース混在の場合は sed を使うとよい。

-w オプションによる区切り文字指定【2017-11-06 追加】
FreeBSD では 9.2-RELEASE より -w オプションが追加された。-w オプションを使うと区切り文字は「タブまたはスペース」となり、なおかつ連続するタブ・スペースは 1つのスペースとして扱われるため、上記の例は
% ls -l | cut -w -f 5,9
とすっきり書ける。

関連コマンド
さらに凝ったことをしたい場合は awk コマンドを使うとよい。
>> Linuxオンラインマニュアル(man) Linux cut(1)
>> Solaris10オンラインマニュアル(man) Solaris10 cut(1)
>> FreeBSDオンラインマニュアル(man) FreeBSD cut(1)