cutは、テキストの各行から特定の「列」を切り出すコマンドです。CSVの2列目だけ取り出す、/etc/passwdからユーザー名だけ抜き出す、といった「表形式データの列抽出」を手軽に行えます。awkでも同じことができますが、単純な列抽出ならcutのほうが短く書けて分かりやすいため、使い分けられると便利です。
ただし、cutには知らないとハマる2つの制約があります。1つは区切り文字が「1文字」しか指定できず、連続したスペースをまとめてくれないこと。もう1つはフィールドの順序を入れ替えられないことです。この記事では、実機のLinux(WSLのDebian)でこれらの罠を実際に再現しながら、cutの使い方とawkとの使い分けを整理します。
cut -d区切り文字 -fフィールド番号で、指定した列を抽出します。-cで文字位置(例:-c1-3で1〜3文字目)を切り出せます。- 区切り文字は「1文字」だけ。連続スペースはまとめないので、スペース区切りでは崩れます。
- スペース区切りや複雑な整形はawkのほうが得意です。
- フィールドの順序は入れ替えられません(
-f3,1でも1,3順で出ます)。 - 出力の区切りを変えるには
--output-delimiterを使います。
より高度な列処理・集計はawk、文字列の検索はgrep、結果の並べ替えはsort・uniqもあわせて参考になります。
cutの基本:区切り文字とフィールド(-d / -f)
もっとも一般的な使い方が、-dで区切り文字、-fでフィールド(列)番号を指定する方法です。CSV(カンマ区切り)やコロン区切りのデータから、欲しい列だけを取り出せます。
cat data.csv # taro,30,tokyo # hanako,25,osaka # -d, で区切りをカンマに、-f1 で1列目を抽出 cut -d, -f1 data.csv # taro # hanako # 複数列はカンマで指定(1列目と3列目) cut -d, -f1,3 data.csv # taro,tokyo # hanako,osaka # 範囲指定もできる(2〜4列目) echo "1:2:3:4:5" | cut -d: -f2-4 # 2:3:4
実機でも、cut -d, -f1でCSVの1列目(名前)だけを抽出でき、cut -d, -f1,3で1列目と3列目、cut -d: -f2-4で2〜4列目の範囲を取り出せることを確認しました。-dで「何を区切りとみなすか」、-fで「何列目を取るか」を指定するだけのシンプルな構造です。/etc/passwd(コロン区切り)からユーザー名を取り出すcut -d: -f1 /etc/passwdは定番の使い方です。
文字位置で切り出す(-c)
区切り文字ではなく、「各行の何文字目から何文字目まで」という文字位置で切り出すには-cを使います。固定長のデータやログの整形に便利です。
# 1〜3文字目を切り出す echo "ABCDEFGH" | cut -c1-3 # ABC # 5文字目以降をすべて echo "ABCDEFGH" | cut -c5- # EFGH # 日付から年だけ取り出す(1〜4文字目) echo "2026-07-11" | cut -c1-4 # 2026
実機でも、cut -c1-3で先頭3文字(ABC)、cut -c5-で5文字目以降(EFGH)を切り出せることを確認しました。-cは「桁がそろっている固定長データ」で真価を発揮します。ただし日本語(マルチバイト文字)では、環境によって「文字」と「バイト」の扱いが変わることがあるため、日本語を含むデータでの文字位置指定には注意が必要です。
【最重要】連続スペースで崩れる罠
cutで最も注意すべき制約がこれです。-dで指定できる区切り文字は「1文字」だけで、しかも連続した区切り文字をまとめてくれません。そのため、スペースが複数連なっているデータをcut -d' 'で処理すると、意図しない結果になります。
# 名前と数値が「複数のスペース」で区切られたデータ
cat spaces.txt
# taro 30 ← 間に3つのスペース
# cut で2列目(数値)を取ろうとすると…
cut -d' ' -f1 spaces.txt
# taro ← 1列目はOK
cut -d' ' -f2 spaces.txt
# ← 空になる!(2つ目の区切りは「2個目のスペース」なので中身が空)
# awk なら連続スペースをまとめて扱うので正しく取れる
awk '{print $2}' spaces.txt
# 30 ← 正しく取れる
実機で、taroと30が3つのスペースで区切られたデータを用意して確認しました。cut -d' ' -f1で1列目のtaroは取れましたが、cut -d' ' -f2は空になりました。これは、cutが「1個目のスペース」と「2個目のスペース」の間を2番目のフィールドとみなすためで、そこには何もないので空になるのです。一方、awkでawk '{print $2}'とすると、連続する空白を1つの区切りとしてまとめて扱うため、正しく30が取れました。「スペース区切り(特に桁揃えのために連続スペースが入るデータ)はcutではなくawk」というのが鉄則です。cutが得意なのは、カンマやコロンのように「区切りが必ず1文字ずつ」のきれいなデータです。psやls -lの出力のように空白幅がまちまちな表は、awkで処理してください。
【罠】順序は入れ替えられない
もう一つの制約です。cut -f3,1のように「3列目、1列目の順で」と指定しても、cutは常に元の順序(1列目、3列目)で出力します。列の順序を入れ替えたいときはcutでは実現できません。
# 3列目・1列目の順で出したいつもりで指定しても…
echo "a,b,c" | cut -d, -f3,1
# a,c ← 指定順(3,1)は無視され、常に元の順(1,3)で出る
# 順序を入れ替えたいなら awk を使う
echo "a,b,c" | awk -F, '{print $3","$1}'
# c,a ← awk なら自由な順序で出せる
実機でも、cut -d, -f3,1は指定した順序(3,1)を無視して、元の並び(1,3)でa,cと出力しました。「列の順序を入れ替えて出力したい」場合は、cutでは不可能で、awk -F, '{print $3","$1}'のようにawkを使う必要があります。cutは「決まった列を、元の順序のまま、素早く抜く」ことに特化したコマンドだと理解しておくと、awkとの使い分けが明確になります。
出力の区切りを変える(--output-delimiter)
抽出した列を、元とは違う区切り文字でつなげて出力したいときは--output-delimiterを使います。
# カンマ区切りを、パイプ区切りにして出力 echo "a,b,c" | cut -d, -f1,3 --output-delimiter=' | ' # a | c # タブ区切りに変換する例 cut -d, -f1,2 data.csv --output-delimiter=$'\t'
実機でも、--output-delimiter=' | 'を指定すると、抽出した1列目と3列目が | でつながって出力されることを確認しました。入力の区切り(-d)と出力の区切りを別にできるため、CSVをタブ区切り(TSV)に変換するといった簡単な整形にも使えます。ただし、こうした変換や整形が複雑になってくると、やはりawkのほうが柔軟です。
主な書き方一覧
cutの要点をまとめます。
| 書き方 | 働き |
|---|---|
cut -d, -f1 |
カンマ区切りの1列目を抽出 |
cut -d, -f1,3 |
複数列(1列目と3列目) |
cut -d: -f2-4 |
範囲(2〜4列目) |
cut -c1-3 |
文字位置(1〜3文字目) |
--output-delimiter |
出力の区切りを変更 |
| 連続スペース / 順序入替 | cutは不可 → awkを使う |
よくある失敗
スペース区切りのデータで列がずれる・空になる
cutは連続スペースをまとめません。スペース区切りはawkを使います。
列の順序を入れ替えて出力しようとする
cutは元の順序でしか出せません。順序変更はawkが必要です。
-dに2文字以上を指定する
区切り文字は1文字だけです。複数文字の区切りはawkやsedで処理します。
-fと-cを混同する
-fはフィールド(区切りで分けた列)、-cは文字位置です。
日本語データで-cの文字位置がずれる
マルチバイト文字では文字とバイトの扱いに注意が必要です。awkやその他の方法を検討します。
よくある質問
cut -d区切り文字 -fフィールド番号を使います。たとえばカンマ区切りの1列目ならcut -d, -f1、コロン区切りの2〜4列目ならcut -d: -f2-4です。実機でも、CSVやコロン区切りのデータから指定した列を正しく抽出できることを確認しています。awk '{print $2}')を使ってください。cutが手軽です。一方、スペース区切り(連続空白あり)、列の順序を入れ替えたい、条件で絞り込みたい、計算したい、といった複雑な処理はawkが向いています。cut -f3,1のように指定しても、常に元の順序(1列目、3列目)で出力されます。実機でも、-f3,1がa,c(元の順)で出ることを確認しています。順序を入れ替えたい場合はawk -F, '{print $3,$1}'のようにawkを使ってください。cut -cを使います。cut -c1-3で1〜3文字目、cut -c5-で5文字目以降を切り出せます。固定長のデータやログの整形に便利です。ただし日本語などのマルチバイト文字では、環境によって文字とバイトの扱いが変わることがあるため注意してください。まとめ
cut -d区切り -fフィールドで列を抽出、-cで文字位置を切り出します。- 区切り文字は1文字だけ・連続スペースはまとめないため、スペース区切りはawkを使います。
- 列の順序は入れ替えられません。順序変更もawkの役割です。
- 出力の区切りは
--output-delimiterで変更できます。 cutは「きれいな区切りデータから決まった列を素早く抜く」のが得意です。
cutは、シンプルな列抽出を最短で書ける便利なコマンドです。「きれいな区切りはcut、複雑ならawk」という使い分けを覚えておけば、テキストデータの加工がぐっと楽になります。抽出した結果はsort・uniqで集計したり、grepで絞り込んだりと、パイプでつないで活用しましょう。
- grep(文字列検索)
- find(ファイル検索)
- sed(置換・行編集)
- awk(列抽出・集計)
- cut(列の切り出し)
- chmod(パーミッション)
- tar(圧縮・解凍)
- リダイレクトとパイプ
- ps・kill(プロセス管理)
- 環境変数とPATH
- ln(シンボリックリンク)
- cp・mv・rm(コピー/移動/削除)
- touch・mkdir(ファイル/フォルダ作成)
- history(コマンド履歴)
- curl(HTTP通信・API)
- jq(JSON処理)
- vim(基本操作・終了方法)
- cron・crontab(定期実行)
- sort・uniq・wc(並べ替え/集計)
- xargs(一括処理)
- chown・chgrp(所有者/グループ変更)
- diff(ファイル比較)
- du・df(ディスク使用量)
- head・tail(先頭/末尾・ログ監視)
- cat・less(ファイル表示)
- alias(コマンドの別名)
- nohup(SSH切断対策)
- tmux(セッション管理)
- よく使うコマンドまとめ
- cd(ディレクトリ移動)
