連載
» 2016年10月31日 05時00分 UPDATE

Linux基本コマンドTips(60):【 cut 】コマンド――行から固定長またはフィールド単位で切り出す

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「cut」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、テキストの行から固定長またはフィールド単位で指定した部分だけを切り出す「cut」コマンドです。

cutコマンドとは?

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

 読み込みファイルを指定しなかった場合は、標準入力から受け取った内容を処理します。


cutコマンドの書式

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

※[ ]は省略可能な引数を示しています




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

 cutコマンドの主なオプションは次の通りです。

●出力指定オプション(いずれか1つを必ず指定)
短いオプション 長いオプション 意味
-b 出力リスト --bytes=出力リスト 切り出す位置のリストをバイト数で指定する
-c 出力リスト --characters=出力リスト 切り出す位置のリストを文字数で指定する
-f 出力リスト --fields=出力リスト 切り出す位置のリストをタブ区切りのフィールドで指定する(区切り文字は「-d」オプションで変更可能)

●リストの指定方法
指定 意味
N N番目のバイト、文字またはフィールド(行頭を1とする)
N-M N番目からM番目まで
N- N番目から行末まで
-M 頭からM番目まで

●その他の主なオプション
短いオプション 長いオプション 意味
-d 文字 --delimiter=文字 フィールドの区切り文字として、タブの代わりに使用する文字を指定する(1文字のみ)
--output-delimiter=文字列 出力の区切り文字として使用する文字列を指定する(1文字以上が使用可能。デフォルトでは入力の区切り文字を使用)
-s --only-delimited 区切り文字を含まない行を出力しない
--complement 出力指定した箇所以外を出力する


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

 cutコマンドは、ファイルまたは標準入力から受け取った内容に対し、それぞれの行から指定した部分だけを出力します。「何文字目から何文字目」あるいは「先頭から何文字目」「何文字目以降」といった指定が可能です。

 例えば、「file.txt」を読み込んで各行の先頭10文字だけ出力したい場合は、バイト単位での指定は「cut -b 1-10 file.txt」、文字数での指定は「cut -c 1-10 file.txt」となります。

 なお、シフトJISやEUC-JPでは「あいうえお」の5文字は10バイト(1文字2バイト)ですが、UTF-8では日本語部分は1文字が3バイトなので「あいうえお」は15バイトになります。CentOS 7の「端末(ターミナル)」のデフォルト文字コードはUTF-8ですので、注意してください。

 切り出す位置は数値で指定します。「,」で区切ることで、複数指定することができます。

 例えば、「1バイト目から10バイト目、および47バイト目以降」だけを出力する場合は、「-b 1-10,47-」と指定します。文字数ならば「-c 1-10,47-」となります。

 以下の実行例では、「ls -l」コマンドの結果からファイルの種類とパーミッションを示す冒頭の10バイトと、47バイト目以降のファイル名部分を出力しています。

コマンド実行例

ls -l * | cut -b 1-10,47-

(冒頭の10バイトと47バイト目以降の部分を出力する)(画面1


画面1 画面1 「ls -l *」の出力結果から、1〜10バイト目と47バイト目以降だけが出力されている)

 なお、出力する位置を入れ替えることはできません。「cut -b 1-10,47-」と「cut -b 47-,1-10」は、どちらも1〜10バイト目と47バイト目以降、という順番で出力されます。



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

 CSV(comma-separated values)ファイルなど、固定長ではなく「,(カンマ)」やタブで区切られているテキストに対し、何番目のフィールドかを指定したい場合は「-f」オプションを使用します。

 “何番目”の指定は「-b」や「-c」オプションと同じで、例えば、1番目から5番目ならば「-f 1-5」とします。

 出力範囲を複数指定したい場合は、「,(カンマ)」で区切ります。「-f」オプションでも出力する順番を入れ替えることはできません。「-f 1,5」でも「-f 5,1」でも結果は同じで、最初に1番目のフィールド、続いて5番目のフィールドが出力されます。

 デフォルトの区切り文字は「タブ(Tab)」です。区切り文字を変えたい場合は「-d」または「--delim=」で指定します。使用できるのは「,」など、1文字に限られます。空白の場合は「--delim=" "」のように指定します。

 以下の実行例では、「/etc/passwd」ファイルの1番目のフィールドと7番目のフィールドを出力しています。「/etc/passwd」ファイルは「:」でフィールドが区切られ、1番目はユーザー名、7番目のフィールドはログインシェルとなっています。

コマンド実行例

cut -f 1,7 --delim=":" /etc/passwd

(1番目と7番目のフィールドだけを出力する)(画面2


画面2 画面2 「/etc/passwd」の1番目と7番目のフィールドだけを出力した(件数が多いので「head」コマンドで冒頭のみ表示している)


出力の区切り文字を変更する

 出力の区切り文字は「--output-delimiter=」オプションで変更できます。出力側の区切り文字は、何文字でも構いません。

コマンド実行例

cut -f 1,7 --delim=":" --output-delimiter=" --- " /etc/passwd

(区切り文字を「:」から「 --- 」に変更する)(画面3


画面3 画面3 出力の区切り文字を「 --- 」(スペースも含む)に変更した


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。