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に関する公式ドキュメントで確認できます。




