こちらからSWELLを購入できます 詳しくはこちら

【Linux】cutコマンド完全ガイド 区切り文字で列を抽出する

  • URLをコピーしました!

今回はLinuxコマンドであるcutコマンドについて解説します

cutコマンドは、テキストの各行から指定した列(フィールド)や文字の位置だけを切り出すコマンドです
CSVから特定の列だけを取り出したり、ログからIPアドレスだけを抜き出したりと、テキスト処理の基本になるコマンドなので、ぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます

スポンサーリンク
目次

cutコマンドとは??

cutコマンドは、ファイルや標準入力から読み込んだ各行の一部を切り出して表示するコマンドです
名前は英語の「cut(切り取る)」そのままで、行を縦方向に切り取るイメージです
切り出し方は「区切り文字で区切られたフィールド(列)単位」「バイト単位」「文字単位」の3種類があり、実務では区切り文字とフィールドを指定する使い方が一番よく使われます
元のファイルは変更されず、切り出した結果が画面(標準出力)に表示されるだけなので、安心して試せます
この記事の実行結果は、GNU coreutils 9.4のcut(Ubuntu 24.04)を一般ユーザー(user)で実行して確認しています

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

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

オプション意味
-d (–delimiter)フィールドの区切り文字を指定するオプション
-f (–fields)取り出すフィールド(列)の番号を指定するオプション
-c (–characters)行の先頭から数えた文字の位置で切り出すオプション
-b (–bytes)行の先頭から数えたバイトの位置で切り出すオプション
-s (–only-delimited)区切り文字を含まない行を出力しないオプション
–complement指定したフィールド(またはバイト・文字)以外を出力するオプション(GNU版だけのオプション)
–output-delimiter出力するときの区切り文字を指定するオプション(GNU版だけのオプション)
-z (–zero-terminated)行の区切りを改行ではなくNUL文字(\0)として扱うオプション(GNU版だけのオプション)

ここからは、テスト用のディレクトリcut-testの中に練習用ファイルを作って説明します
次のコマンドで同じファイルを作れるので、一緒に試してみてください

事前準備(テスト用ディレクトリの作成)
mkdir△cut-test
cd△cut-test
printf△”id,name,dept,age,city\n1,sato,sales,28,Tokyo\n2,suzuki,dev,35,Osaka\n3,takahashi,dev,24,Nagoya\n4,tanaka,infra,41,Tokyo\n5,ito,sales,30,Fukuoka\n”△>△users.csv
printf△”2026-11-01△10:00:01△INFO△192.168.0.10△GET△/index.html△200\n2026-11-01△10:00:03△INFO△192.168.0.11△GET△/login△200\n2026-11-01△10:00:05△ERROR△192.168.0.25△POST△/login△500\n2026-11-01△10:00:08△INFO△192.168.0.10△GET△/mypage△200\n2026-11-01△10:00:12△WARN△192.168.0.31△GET△/admin△403\n2026-11-01△10:00:15△ERROR△192.168.0.10△GET△/api/items△500\n”△>△access.log
printf△”root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nsato:x:1001:1001:Sato△Taro:/home/sato:/bin/bash\nsuzuki:x:1002:1002:Suzuki△Hanako:/home/suzuki:/bin/zsh\nnginx:x:998:998:nginx△user:/var/lib/nginx:/usr/sbin/nologin\n”△>△passwd.txt
printf△”name\tscore\tgrade\nsato\t82\tB\nsuzuki\t95\tA\ntakahashi\t67\tC\n”△>△scores.tsv
printf△”#△app△settings\nhost=localhost\nport=8080\nuser=admin\ntimeout\n”△>△app.conf
printf△”A001Tokyo△△△20261101\nB002Osaka△△△20261102\nC003Nagoya△△20261103\n”△>△fixed.txt
printf△”こんにちは世界\n”△>△ja.txt
touch△-d△”2026-11-01△10:00″△users.csv△access.log△passwd.txt△scores.tsv△app.conf△fixed.txt△ja.txt
# 作成したディレクトリの構成を確認する
ls△-l
実行結果:
total 28
-rw-rw-r– 1 user user 331 Nov 1 10:00 access.log
-rw-rw-r– 1 user user 59 Nov 1 10:00 app.conf
-rw-rw-r– 1 user user 63 Nov 1 10:00 fixed.txt
-rw-rw-r– 1 user user 22 Nov 1 10:00 ja.txt
-rw-rw-r– 1 user user 243 Nov 1 10:00 passwd.txt
-rw-rw-r– 1 user user 54 Nov 1 10:00 scores.tsv
-rw-rw-r– 1 user user 139 Nov 1 10:00 users.csv

# ファイルの中身を確認する
cat△users.csv
実行結果:
id,name,dept,age,city
1,sato,sales,28,Tokyo
2,suzuki,dev,35,Osaka
3,takahashi,dev,24,Nagoya
4,tanaka,infra,41,Tokyo
5,ito,sales,30,Fukuoka
cat△access.log
実行結果:
2026-11-01 10:00:01 INFO 192.168.0.10 GET /index.html 200
2026-11-01 10:00:03 INFO 192.168.0.11 GET /login 200
2026-11-01 10:00:05 ERROR 192.168.0.25 POST /login 500
2026-11-01 10:00:08 INFO 192.168.0.10 GET /mypage 200
2026-11-01 10:00:12 WARN 192.168.0.31 GET /admin 403
2026-11-01 10:00:15 ERROR 192.168.0.10 GET /api/items 500
cat△passwd.txt
実行結果:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
sato:x:1001:1001:Sato Taro:/home/sato:/bin/bash
suzuki:x:1002:1002:Suzuki Hanako:/home/suzuki:/bin/zsh
nginx:x:998:998:nginx user:/var/lib/nginx:/usr/sbin/nologin
cat△scores.tsv
実行結果:
name score grade
sato 82 B
suzuki 95 A
takahashi 67 C
# scores.tsvの区切りはタブです
cat△app.conf
実行結果:
# app settings
host=localhost
port=8080
user=admin
timeout
cat△fixed.txt
実行結果:
A001Tokyo 20261101
B002Osaka 20261102
C003Nagoya 20261103
cat△ja.txt
実行結果:
こんにちは世界

以降のコマンドは、すべてcut-testの中で実行します
この環境のロケールはC.UTF-8です(日本語の扱いはロケールによって変わることがあります)

-d (–delimiter)

フィールドの区切り文字を指定するオプションです
指定しない場合の区切り文字はタブで、指定できるのは1文字だけです(カンマ「,」やコロン「:」、スペース「’△’」など)

コマンド実行例
# カンマ区切りのCSVから2列目を取り出す
cut△-d,△-f2△users.csv
実行結果:
name
sato
suzuki
takahashi
tanaka
ito

# コロン区切りのファイルから1列目(ユーザー名)を取り出す
cut△-d:△-f1△passwd.txt
実行結果:
root
daemon
sato
suzuki
nginx

# 長い形式のオプションで書いても同じ結果になる
cut△–delimiter=:△–fields=1△passwd.txt
実行結果:
root
daemon
sato
suzuki
nginx

-f (–fields)

取り出すフィールド(列)の番号を指定するオプションです
番号は1から数え、カンマで複数指定したり、ハイフンで範囲指定したりできます(範囲の書き方は後ほど詳しく説明します)

コマンド実行例
# 2列目と4列目を取り出す
cut△-d,△-f2,4△users.csv
実行結果:
name,age
sato,28
suzuki,35
takahashi,24
tanaka,41
ito,30

# 2列目から4列目までを取り出す
cut△-d,△-f2-4△users.csv
実行結果:
name,dept,age
sato,sales,28
suzuki,dev,35
takahashi,dev,24
tanaka,infra,41
ito,sales,30

# -dを省略するとタブ区切りとして扱われる
cut△-f1,2△scores.tsv
実行結果:
name score
sato 82
suzuki 95
takahashi 67
# 出力の区切りも入力と同じタブになります

-c (–characters)

行の先頭から数えた文字の位置で切り出すオプションです
桁数が決まっている固定長のデータから、決まった位置を取り出すときに使います

コマンド実行例
# 1~4文字目(コード部分)を取り出す
cut△-c1-4△fixed.txt
実行結果:
A001
B002
C003

# 13文字目から行末まで(日付部分)を取り出す
cut△-c13-△fixed.txt
実行結果:
20261101
20261102
20261103

ただし、この環境(GNU coreutils 9.4)の-cは、実際には次の-bと同じくバイト単位で動きます
英数字だけなら1文字=1バイトなので問題ありませんが、日本語を含む行では注意が必要です(後のトラブルシューティングで説明します)

-b (–bytes)

行の先頭から数えたバイトの位置で切り出すオプションです
UTF-8の日本語は1文字が3バイトなので、日本語を切り出すときは3の倍数で指定しないと文字が壊れます

コマンド実行例
# 英数字だけなら-cと同じ結果になる
cut△-b1-4△fixed.txt
実行結果:
A001
B002
C003

# 日本語は1文字3バイトなので、1~6バイト目で2文字になる
cut△-b1-6△ja.txt
実行結果:
こん

-s (–only-delimited)

区切り文字を含まない行を出力しないオプションです
cutは区切り文字が1つもない行を、そのまま丸ごと出力するという動きをするので、コメント行などが混ざったファイルではこのオプションが役立ちます

コマンド実行例
# -sなしだと「=」がない行もそのまま出力される
cut△-d=△-f2△app.conf
実行結果:
# app settings
localhost
8080
admin
timeout
# 1行目のコメントと最後のtimeoutは「=」がないので丸ごと表示されています

# -sを付けると「=」を含む行だけが対象になる
cut△-s△-d=△-f2△app.conf
実行結果:
localhost
8080
admin

–complement

指定したフィールド(またはバイト・文字)以外を出力するオプションです(GNU版だけのオプションです)
「この列だけ除きたい」というときに、残したい列を全部書かずに済みます

コマンド実行例
# 4列目(age)以外を出力する
cut△-d,△-f4△–complement△users.csv
実行結果:
id,name,dept,city
1,sato,sales,Tokyo
2,suzuki,dev,Osaka
3,takahashi,dev,Nagoya
4,tanaka,infra,Tokyo
5,ito,sales,Fukuoka

# 先頭4文字(コード部分)以外を出力する
cut△-c1-4△–complement△fixed.txt
実行結果:
Tokyo 20261101
Osaka 20261102
Nagoya 20261103

–output-delimiter

出力するときの区切り文字を指定するオプションです(GNU版だけのオプションです)
何も指定しないと入力と同じ区切り文字で出力されますが、このオプションで好きな文字列に変えられます(-dと違って複数文字でもOKです)

コマンド実行例
# 名前と都市を「△/△」でつないで出力する
cut△-d,△-f2,5△–output-delimiter=’△/△’△users.csv
実行結果:
name / city
sato / Tokyo
suzuki / Osaka
takahashi / Nagoya
tanaka / Tokyo
ito / Fukuoka

# コロン区切りをスペース区切りに変えて出力する
cut△-d:△-f1,7△–output-delimiter=’△’△passwd.txt
実行結果:
root /bin/bash
daemon /usr/sbin/nologin
sato /bin/bash
suzuki /bin/zsh
nginx /usr/sbin/nologin

-z (–zero-terminated)

行の区切りを改行ではなくNUL文字(\0)として扱うオプションです(GNU版だけのオプションです)
find△-print0のように、NUL文字で区切られたデータを処理するときに使います

コマンド実行例
# NUL区切りのデータから1列目を取り出し、見やすいようにtrで改行に変換する
printf△”sato,dev\0suzuki,sales\0″△|△cut△-z△-d,△-f1△|△tr△’\0’△’\n’
実行結果:
sato
suzuki

基本的な使い方

cutコマンドの基本的な構文は「cut△オプション△ファイル名」です
オプションには-f(フィールド)、-c(文字)、-b(バイト)のどれか1つを必ず指定します
ファイル名を省略すると標準入力から読み込むので、パイプ(|)で他のコマンドの結果を渡して使うこともできます

コマンド実行例
# CSVの1列目と2列目を取り出す
cut△-d,△-f1,2△users.csv
実行結果:
id,name
1,sato
2,suzuki
3,takahashi
4,tanaka
5,ito

# パイプで渡した結果から取り出す
cat△users.csv△|△cut△-d,△-f5
実行結果:
city
Tokyo
Osaka
Nagoya
Tokyo
Fukuoka

# echoの文字列から取り出す
echo△”2026-11-03″△|△cut△-d-△-f1
実行結果:
2026

範囲(LIST)の指定方法

-f・-c・-bに渡す番号は、まとめて「LIST(リスト)」と呼ばれ、次のような書き方ができます
N:N番目だけ
N-M:N番目からM番目まで
N-:N番目から最後まで
-M:最初からM番目まで
これらはカンマでつないで組み合わせることもできます

範囲指定の例
# 1列目と7列目(ユーザー名とログインシェル)
cut△-d:△-f1,7△passwd.txt
実行結果:
root:/bin/bash
daemon:/usr/sbin/nologin
sato:/bin/bash
suzuki:/bin/zsh
nginx:/usr/sbin/nologin

# 6列目から最後まで
cut△-d:△-f6-△passwd.txt
実行結果:
/root:/bin/bash
/usr/sbin:/usr/sbin/nologin
/home/sato:/bin/bash
/home/suzuki:/bin/zsh
/var/lib/nginx:/usr/sbin/nologin

# 最初から3列目まで
cut△-d:△-f-3△passwd.txt
実行結果:
root:x:0
daemon:x:1
sato:x:1001
suzuki:x:1002
nginx:x:998

# 組み合わせ:1列目と3~4列目
cut△-d:△-f1,3-4△passwd.txt
実行結果:
root:0:0
daemon:1:1
sato:1001:1001
suzuki:1002:1002
nginx:998:998

指定した順番に並べ替えはできない

cutは、LISTに書いた順番に関係なく、元の行の順番どおりに出力します
-f3,1と書いても「3列目→1列目」の順にはならないので注意しましょう

出力の順番の例
# 3,1の順に指定しても、1列目→3列目の順で出力される
cut△-d,△-f3,1△users.csv
実行結果:
id,dept
1,sales
2,dev
3,dev
4,infra
5,sales

# 同じ列を2回指定しても1回だけ出力される
cut△-d,△-f2,2△users.csv
実行結果:
name
sato
suzuki
takahashi
tanaka
ito

列の順番を入れ替えたいときは、後で紹介するawkを使いましょう

cutコマンドの実用的な活用例

実際の現場でよく使われるcutコマンドの活用例をご紹介します
cutは単体よりも、grep・sort・uniqなどとパイプで組み合わせて使う場面が多いです

ログ解析での活用

スペース区切りのログから、ログレベルやIPアドレスの列だけを取り出して集計できます

ログ解析例
# ログレベル(3列目)ごとの件数を数える
cut△-d’△’△-f3△access.log△|△sort△|△uniq△-c
実行結果:
2 ERROR
3 INFO
1 WARN

# ERRORの行だけ、IPアドレスとパスを取り出す
grep△ERROR△access.log△|△cut△-d’△’△-f4,6
実行結果:
192.168.0.25 /login
192.168.0.10 /api/items

# アクセス元のIPアドレスを重複なしで一覧にする
cut△-d’△’△-f4△access.log△|△sort△-u
実行結果:
192.168.0.10
192.168.0.11
192.168.0.25
192.168.0.31

CSV処理での活用

CSVの1行目は見出し(ヘッダー)なことが多いので、tail△-n△+2で2行目以降だけにしてからcutに渡すと便利です

CSV処理例
# ヘッダーを除いて名前だけを取り出す
tail△-n△+2△users.csv△|△cut△-d,△-f2
実行結果:
sato
suzuki
takahashi
tanaka
ito

# 部署(3列目)ごとの人数を数える
tail△-n△+2△users.csv△|△cut△-d,△-f3△|△sort△|△uniq△-c
実行結果:
2 dev
1 infra
2 sales

# 都市がTokyoの人の名前だけを取り出す
grep△’,Tokyo$’△users.csv△|△cut△-d,△-f2
実行結果:
sato
tanaka

ユーザー情報(/etc/passwd形式)の確認

/etc/passwdはコロン区切りで「ユーザー名:パスワード:UID:GID:コメント:ホームディレクトリ:ログインシェル」が並んだファイルです
サーバーのユーザー一覧を確認するときにcutがよく使われます(ここでは同じ形式の練習用ファイルpasswd.txtを使います)

ユーザー情報の確認例
# 本物の/etc/passwdからユーザー名の一覧を表示する
cut△-d:△-f1△/etc/passwd
(結果は環境によって違うので省略しています)

# ログインシェルが/bin/bashのユーザーだけを取り出す
grep△’/bin/bash$’△passwd.txt△|△cut△-d:△-f1
実行結果:
root
sato

# ログインシェルごとの人数を数える
cut△-d:△-f7△passwd.txt△|△sort△|△uniq△-c
実行結果:
2 /bin/bash
1 /bin/zsh
2 /usr/sbin/nologin

文字列の一部を取り出す

ファイルだけでなく、変数やコマンドの結果の文字列から一部を取り出すのにも使えます
最後の列を取り出したいときは、revで文字列を左右反転してからcutで1列目を取り、もう一度revで戻すというテクニックがあります

文字列処理の例
# 日付の文字列から月だけを取り出す
date_str=”2026-11-03″
echo△”$date_str”△|△cut△-d-△-f2
実行結果:
11

# ファイル名から最初の「.」より後ろ(拡張子部分)を取り出す
echo△”backup.tar.gz”△|△cut△-d.△-f2-
実行結果:
tar.gz

# パスの最後の部分(ファイル名)を取り出す
echo△”/var/log/nginx/access.log”△|△rev△|△cut△-d/△-f1△|△rev
実行結果:
access.log

cutとawkの使い分け

列を取り出すコマンドとしては、cutの他にawkもよく使われます
cutは区切り文字1つで機械的に区切るので、スペースが連続していると空のフィールドができてしまいます
psやdfの出力のように、スペースの数がそろっていないデータはawkのほうが向いています

cutとawkの比較
# 事前準備:スペースの数がそろっていないファイルを作る
printf△”web01△△△running\ndb01△stopped\n”△>△status.txt
cat△status.txt
実行結果:
web01 running
db01 stopped

# cutで2列目を取ると、web01の行は空になる
cut△-d’△’△-f2△status.txt
実行結果:

stopped
# web01の後ろはスペースが3つなので、2列目は空の文字列になります

# tr -sで連続したスペースを1つにまとめてからcutに渡す
tr△-s△’△’△<△status.txt△|△cut△-d’△’△-f2
実行結果:
running
stopped

# awkならスペースの数に関係なく2列目を取り出せる
awk△'{print△$2}’△status.txt
実行結果:
running
stopped

# 列の順番を入れ替えるのもawkならできる
awk△-F,△'{print△$3″,”$2}’△users.csv
実行結果:
dept,name
sales,sato
dev,suzuki
dev,takahashi
infra,tanaka
sales,ito

# 練習用のファイルを削除する
rm△status.txt

区切り文字がはっきりしたデータ(CSV・TSV・/etc/passwdなど)から列を取り出すだけならcut、スペースの数がそろっていないデータや、列の入れ替え・計算・条件分岐が必要な処理ならawk、と使い分けるのがおすすめです

トラブルシューティング

cutコマンドを使うときによくあるつまずきと、その解決方法です

「the delimiter must be a single character」と表示される

-dに2文字以上を指定すると出るエラーです
「,△」(カンマとスペース)のような区切りは指定できないので、カンマだけで区切ってから余分なスペースを取り除きましょう

区切り文字のエラー
LC_ALL=C△cut△-d’,△’△-f1△users.csv
実行結果:
cut: the delimiter must be a single character
Try ‘cut –help’ for more information.
# LC_ALL=Cは英語のメッセージにするために付けています

# カンマとスペースで区切られたデータは、カンマで区切ってからtrでスペースを消す
echo△”sato,△dev,△Tokyo”△|△cut△-d,△-f2△|△tr△-d△’△’
実行結果:
dev

「you must specify a list of bytes, characters, or fields」と表示される

-f・-c・-bのどれも指定していないときのエラーです
-dだけを付けて-fを忘れたときにもこのエラーになります

LIST指定がないときのエラー
LC_ALL=C△cut△-d,△users.csv
実行結果:
cut: you must specify a list of bytes, characters, or fields
Try ‘cut –help’ for more information.

# -fを付ければ正しく動く
cut△-d,△-f1△users.csv
実行結果:
id
1
2
3
4
5

日本語が文字化けする・途中で切れる

この環境(Ubuntu 24.04のGNU coreutils 9.4)では、-cは-bと同じくバイト単位で動きます
UTF-8の日本語は1文字3バイトなので、-c1-2のように指定すると1文字目の途中で切れてしまいます
日本語を文字数で切り出したいときは、grep△-oなど文字単位で扱えるコマンドを使いましょう(ディストリビューションによっては独自の修正で-cが文字単位で動くものもあります)

日本語を切り出す例
# 1~3バイト目=日本語の1文字目になる
cut△-c1-3△ja.txt
実行結果:
こ

# 1~2バイト目だと文字の途中で切れる(odでバイトの中身を表示)
cut△-c1-2△ja.txt△|△od△-An△-tx1
実行結果:
e3 81 0a
# 「こ」(e3 81 93)の途中の2バイトと改行(0a)だけになり、画面では文字化けします

# grep -oで先頭の2文字を取り出す
grep△-oE△’^.{2}’△ja.txt
実行結果:
こん

ダブルクォートの中のカンマで列がずれる

cutはダブルクォートを特別扱いしないので、”Tokyo,△Japan”のように値の中にカンマがあるCSVは正しく区切れません
こうしたCSVを扱うときは、CSVに対応したツール(Pythonのcsvモジュールなど)を使いましょう

クォート付きCSVの例
# 事前準備:値の中にカンマを含むCSVを作る
printf△’1,”Tokyo,△Japan”,100\n’△>△quoted.csv
cat△quoted.csv
実行結果:
1,”Tokyo, Japan”,100

# 2列目を取り出すと、値の途中で切れてしまう
cut△-d,△-f2△quoted.csv
実行結果:
“Tokyo

# 練習用のファイルを削除する
rm△quoted.csv

Windowsで作ったファイルの行末に余計な文字が付く

Windowsで作ったテキストファイルは、行末が改行(LF)ではなくCRLF(\r\n)になっていることがあります
そのままcutで最後の列を取り出すと、見えない\rが値の後ろに残り、比較や変数への代入でうまくいかない原因になります

CRLFのファイルの例
# 事前準備:行末がCRLFのファイルを作る
printf△”host=localhost\r\nport=8080\r\n”△>△win.conf

# cat -Aで見ると、値の後ろに\r(^M)が残っている
cut△-d=△-f2△win.conf△|△cat△-A
実行結果:
localhost^M$
8080^M$

# tr -d ‘\r’で\rを消してからcutに渡す
tr△-d△’\r’△<△win.conf△|△cut△-d=△-f2△|△cat△-A
実行結果:
localhost$
8080$

# 練習用のファイルを削除する
rm△win.conf

まとめ

いかがでしたでしょうか
今回はcutコマンドについてまとめてみました
cutは、-dで区切り文字、-fで列を指定するだけで、CSVやログから必要な列をすばやく取り出せるコマンドです
-sでコメント行を除いたり、–complementで特定の列だけを除いたりと、オプションを覚えるとさらに便利になります
「区切り文字は1文字だけ」「列の順番は入れ替えられない」「-cは環境によってバイト単位」の3つを押さえておけば安心です
grep・sort・uniqと組み合わせて、ぜひマスターしてください!

スポンサーリンク

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!