cutコマンドでテキストを切り出す方法|-f・-dオプションとCSVログ解析の実践例も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, テキスト処理コマンド > cutコマンドでテキストを切り出す方法|-f・-dオプションとCSVログ解析の実践例も
「ログファイルから必要な列だけ取り出したいのに、どうすればいいか分からない」
CSVや区切り文字付きのテキストから特定のフィールドを抽出したい場面は、サーバー管理で毎日のように発生します。

そこで使うのが cut コマンドです。

この記事では、cutコマンドの基本的な使い方から、-f・-dオプションの実践的な組み合わせ、ログ解析・CSVの列抽出まで幅広く解説します。
RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・ cut -d':' -f1 /etc/passwd でユーザー名一覧を即座に抽出できる
・ -f に範囲指定(-f1-3)や複数列(-f1,3,5)が使える
・ -c オプションで文字位置による切り出しも可能
・ パイプでawk・sort・uniqと組み合わせると列単位の集計が手軽になる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

cutコマンドとは?どんな場面で使うのか

cutコマンドは、テキストファイルや標準入力から指定した列(フィールド)または文字位置を切り出すコマンドです。
awk や sed のように複雑な構文を覚えなくても、単純な列抽出ならcutで十分です。

典型的な利用シーンは次のとおりです。

/etc/passwd からユーザー名だけ抽出:コロン区切りの1列目
アクセスログから特定フィールド抽出:スペース区切りのIPアドレス列
CSV形式のログから列を切り出す:カンマ区切りの任意の列
固定長フォーマットから文字数単位で切り出す:-cオプション利用

cutコマンドは Linux DNS 設定の基本 などと同様に、Linux標準のテキスト処理ツールチェーンの一部です。パイプで他のコマンドと組み合わせることで真価を発揮します。

基本的な使い方

1. -d と -f で区切り文字・フィールド番号を指定する

cutコマンドの最もよく使う形が、-d(delimiter: 区切り文字)と -f(field: 列番号)の組み合わせです。

# 書式 cut -d '区切り文字' -f 列番号 ファイル名 # /etc/passwd からユーザー名(1列目)を取得 cut -d ':' -f 1 /etc/passwd

実行すると次のような出力が得られます。

root bin daemon adm lp sync shutdown halt mail operator ...(省略) tomohiro

-d は1文字の区切り文字を指定します。スペースを区切りにしたい場合は -d ' ' とシングルクォートで囲みます。
-f は1始まりの列番号を指定します。デフォルトの区切り文字はタブです。

2. 複数列・列範囲を指定する

-f には複数の指定方法があります。

# 1列目と3列目だけ(カンマ区切りで複数指定) cut -d ':' -f 1,3 /etc/passwd # 1列目から3列目(ハイフンで範囲指定) cut -d ':' -f 1-3 /etc/passwd # 3列目以降すべて cut -d ':' -f 3- /etc/passwd # 先頭から2列目まで cut -d ':' -f -2 /etc/passwd

/etc/passwd(ユーザー名:パスワード:UID:GID:コメント:ホームディレクトリ:シェル)から1列目と3列目(ユーザー名とUID)を抽出した例です。

# cut -d ':' -f 1,3 /etc/passwd の出力例(実サーバー、一部抜粋) root:0 bin:1 daemon:2 adm:3 tomohiro:1000 nginx:995

3. -c で文字位置を指定する(固定長フォーマット)

ログファイルが固定長フォーマット(日付が1~10文字目など)の場合は -c オプションを使います。

# 1文字目から10文字目を抽出(日付部分) cut -c 1-10 /var/log/some_fixed_log.txt # 1文字目と5文字目だけ抽出 cut -c 1,5 /var/log/some_fixed_log.txt # 11文字目以降をすべて抽出 cut -c 11- /var/log/some_fixed_log.txt

-c は文字数単位のカウントです。マルチバイト文字(日本語)を含む場合はバイト数と文字数がずれるため注意が必要です。

応用・実務Tips

4. パイプを使った列抽出+集計

cutの真骨頂はパイプとの組み合わせです。
たとえばNginxのアクセスログからIPアドレス(1列目)を抽出してアクセス数の多い順に並べる場合は次のようにします。

# スペース区切りでIPアドレス列を抽出→ソート→集計 cut -d ' ' -f 1 /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

実際のサーバーで実行すると次のような出力が得られます。

4821 203.0.113.xx 1302 198.51.100.xx 987 192.0.2.xx 654 203.0.113.yy ...

Linux ポート確認の全コマンド と同様に、ワンライナーでサーバーの状態を素早く把握できます。

5. CSVファイルの特定列を抽出する

CSVファイル(カンマ区切り)から必要な列だけを取り出すには -d ',' を使います。

# data.csv の1列目(ID)と3列目(金額)を抽出 cut -d ',' -f 1,3 data.csv # ヘッダー行を含む場合(tail -n +2 でヘッダーをスキップ) tail -n +2 data.csv | cut -d ',' -f 1,3

ただし、CSVのフィールド内にカンマが含まれる場合(クォートで囲まれたフィールド)には cutは対応できません。そのような複雑なCSVにはawkやPythonを使うほうが確実です。

6. タブ区切りファイルの処理(デフォルト動作)

cutのデフォルト区切り文字はタブです。-d を省略した場合はタブ区切りとして動作します。

# タブ区切りファイルの2列目を抽出(-d省略でタブ区切り) cut -f 2 tab_delimited_file.tsv # またはタブを明示的に指定 cut -d $'\t' -f 2 tab_delimited_file.tsv

7. awkとの使い分け

cutとawkは似た用途ですが、使い分けの基準があります。

cut が向いている場合:区切り文字が1文字・フィールド番号指定のみ・高速処理が必要
awk が向いている場合:連続する区切り文字(スペース複数)・条件付き抽出・演算・変数処理

ps コマンドなどの出力はスペースが複数連続していることが多く、その場合は cut では正しく列番号が対応しません。Linux 基本コマンドの解説 で紹介しているawkの方が適しています。

トラブルシュート・エラー対処

「cut: option requires an argument」エラー

-f や -d の後に引数(列番号・区切り文字)を指定していないと発生します。

# NG例(-f の後に引数なし) cut -f /etc/passwd # OK例 cut -d ':' -f 1 /etc/passwd

「cut: the delimiter must be a single character」エラー

-d に2文字以上を指定すると発生します。cutは1文字の区切り文字しか扱えません。

# NG例(2文字の区切り文字は不可) cut -d '::' -f 1 file.txt # 2文字以上の区切り文字にはawkを使う awk -F '::' '{print $1}' file.txt

列が期待通りに抽出されない(スペース区切り)

ps や ls -l などの出力では、スペースが複数連続することがあります。cutはスペース1個を区切り文字として扱うため、連続スペースを「空のフィールド」として数えます。

# psの出力例(スペースが複数連続) # PID TTY TIME CMD # 1234 pts/0 00:00:00 bash # cut で列がずれる場合はawkを使う ps | awk '{print $1}' # またはtrで連続スペースを1つに正規化してからcutを使う ps | tr -s ' ' | cut -d ' ' -f 2

ls コマンドの基本オプション と組み合わせる場合も、同様にスペースの正規化が必要なことがあります。

本記事のまとめ

cutコマンドのオプションと用途をまとめます。
やりたいこと コマンド
コロン区切りの1列目を抽出 cut -d ':' -f 1 ファイル名
複数列を抽出(1列目と3列目) cut -d ':' -f 1,3 ファイル名
1列目から3列目の範囲を抽出 cut -d ':' -f 1-3 ファイル名
文字位置で切り出す(1~10文字目) cut -c 1-10 ファイル名
カンマ区切りCSVの2列目を抽出 cut -d ',' -f 2 ファイル名
パイプでIPアドレス集計 cut -d ' ' -f 1 access.log | sort | uniq -c | sort -rn
cutコマンドはシンプルですが、パイプと組み合わせることでログ解析やCSV処理が一気に効率化します。
まずは cut -d ':' -f 1 /etc/passwd から試してみてください。「これだけで列が取り出せるのか」と実感できるはずです。

cutコマンドを使いこなせたら、次はサーバー構築の基礎を固めませんか?

テキスト処理コマンドを組み合わせてログを読む力がつけば、サーバー管理の効率は大きく変わります。その力を活かして、体系的にLinuxサーバー構築を学んでみませんか。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。