Linux / コマンド / cut - 行から文字とフィールドを抽出

cutは、各入力行で指定したバイト、文字、または区切り文字基準のフィールドを選んで出力します。単純な列抽出には便利ですが、複雑なCSV解析ツールではありません。

フィールドモードの-fは基本的にタブを区切り文字として使用します。コロンやカンマを使用する場合は-dも併せて指定します。-cと-bは、実装や文字エンコーディングを考慮して選んでください。

基本的な文法

cut -d '区切り文字' -f フィールド番号 [ファイル ...]

インストールされている実装とオプションは、配布版によって異なる場合があります。man cutで現在のシステムの説明を確認してください。

使用例

コロン区切りフィールドの抽出

システムアカウントリストから最初のフィールドを抽出します。

cut -d ':' -f 1 /etc/passwd

複数フィールドを選ぶ

カンマで指定したフィールドの順序は、元の入力順に従って出力されます。

cut -d ':' -f 1,7 /etc/passwd

文字範囲の抽出

各行の文字範囲を選ぶ例です。GNUの変更履歴によると、上流のGNU Coreutils 9.11で -c がマルチバイト文字に対応し、それ以前の -b 相当の動作から変わりました。実装・版・ロケール(言語や文字の解釈規則)を確認し、日本語を扱う場合はUTF-8ロケールで実際の結果も確認してください。新しい実装でも結合文字は別に数えられ、見た目の1文字と一致しない場合があります。ファイル全体の先頭だけを見るheadによる出力とは範囲が異なります。

cut -c 1-8 sample.txt

区切り文字でフィールドを抽出した結果

コロンで区切られた2行から、最初のフィールドだけを取り出す例です。-dは区切り文字、-fは選択するフィールド番号です。

printf 'alpha:100\nbeta:200\n' | cut -d: -f1

例の出力:

alpha
beta

空白を1文字の区切りとして指定する cut -d ' ' -f2 では、連続する空白の1つずつが区切りになるため、見た目の列番号とはずれる場合があります。GNU Coreutils 9.11では連続する空白で分ける -w も追加されました。対応版なら cut -w -f2 ファイル が使えますが、ヘルプで確認してください。複雑な空白区切りは awk、引用符内のカンマや改行を含むCSV(カンマ区切り形式)は専用のパーサーが適しています。

主なオプションと形式

オプション・形式 説明
-d 区切り文字 フィールド区切り文字を指定します。
-f リスト 出力するフィールド番号や範囲を選びます。
-c リスト 文字位置を選びます。
-b リスト バイト位置を選びます。
-s フィールド区切りのない行は出力しません。

使用する際の注意点

区切り文字のない行は、選んだ番号のフィールドがなくても既定でそのまま出力されます。不要なら -s を加えます。番号は1から数え、指定を -f3,1 としても出力は元の入力順です。列を指定順に並べ替える機能ではありません。出力は入力と別のファイル名へ保存してください。

よくある質問

空白で区切られた複数の列もcutで抽出できますか?

スペース1文字の -d ' ' では、連続空白を1つの区切りとして扱いません。GNU 9.11で追加された -w に対応していれば利用でき、旧環境や複雑な処理では awk が選択肢になります。

公式ドキュメント

オプションの正確な動作や実装ごとの差異は、cutに関する公式ドキュメントで確認できます。