はじめに

こんにちは!今回はcutコマンドについて解説します。

cutは、テキストの各行から特定の列やフィールドを切り出すコマンドです。CSVファイルやログファイルから必要な部分だけ抽出したい時に便利です。

cutコマンドとは

cutは、テキストの各行を区切り文字で分割して、指定した列(フィールド)を取り出すコマンドです。

例えば、カンマ区切りのCSVから2列目だけ取り出したり、タブ区切りのデータから1列目と3列目だけ抽出したりできます。シンプルですが、データ処理で超よく使います。

基本構文

1
cut [オプション] [ファイル...]

主なオプション

オプション 説明
-f リスト フィールド(列)を指定
-d 区切り文字 区切り文字を指定(デフォルトはタブ)
-c リスト 文字位置で指定
-b リスト バイト位置で指定
--complement 指定した列以外を出力
-s 区切り文字を含まない行をスキップ
--output-delimiter=文字 出力の区切り文字を指定

使用例

例1: タブ区切りファイルから特定の列を抽出

1
2
3
4
5
6
# data.txt の内容
# name age city
# Taro 25 Tokyo
# Hanako 30 Osaka

cut -f 1 data.txt

実行結果:

1
2
3
name
Taro
Hanako

1列目(名前)だけ抽出されます。

例2: 複数の列を抽出

1
cut -f 1,3 data.txt

実行結果:

1
2
3
name city
Taro Tokyo
Hanako Osaka

1列目と3列目を抽出。

例3: 範囲指定

1
cut -f 1-3 data.txt

実行結果:

1
2
3
name age city
Taro 25 Tokyo
Hanako 30 Osaka

1列目から3列目まで。

例4: カンマ区切り(CSV)ファイルの処理

1
2
3
4
5
6
# users.csv の内容
# name,age,city,country
# Taro,25,Tokyo,Japan
# Hanako,30,Osaka,Japan

cut -d ',' -f 1,3 users.csv

実行結果:

1
2
3
name,city
Taro,Tokyo
Hanako,Osaka

-d ','でカンマ区切りを指定。

例5: 文字位置で切り出し

1
2
3
4
5
# file.txt の内容
# 12345ABCDE
# 67890FGHIJ

cut -c 1-5 file.txt

実行結果:

1
2
12345
67890

1文字目から5文字目まで切り出し。

1
cut -c 6-10 file.txt

実行結果:

1
2
ABCDE
FGHIJ

6文字目から10文字目まで。

例6: 特定の文字位置のみ

1
cut -c 1,3,5 file.txt

実行結果:

1
2
135
690

1、3、5文字目だけ抽出。

例7: コロン区切りファイル(/etc/passwdなど)

1
cut -d ':' -f 1,6,7 /etc/passwd | head -3

実行結果:

1
2
3
root:/root:/bin/bash
daemon:/usr/sbin:/usr/sbin/nologin
bin:/bin:/usr/sbin/nologin

ユーザー名、ホームディレクトリ、シェルを抽出。

例8: 出力の区切り文字を変更

1
cut -d ':' -f 1,6,7 /etc/passwd --output-delimiter=',' | head -3

実行結果:

1
2
3
root,/root,/bin/bash
daemon,/usr/sbin,/usr/sbin/nologin
bin,/bin,/usr/sbin/nologin

出力をカンマ区切りに変更。

例9: 指定した列以外を出力

1
cut -d ',' -f 2 --complement users.csv

実行結果:

1
2
3
name,city,country
Taro,Tokyo,Japan
Hanako,Osaka,Japan

2列目(age)以外を出力。

例10: 区切り文字を含まない行をスキップ

1
2
3
4
5
6
# mixed.txt の内容
# a,b,c
# xyz
# d,e,f

cut -d ',' -f 1 -s mixed.txt

実行結果:

1
2
a
d

-sオプションで、カンマを含まない行(xyz)がスキップされます。

実践的な使い方

CSVファイルから特定の列を抽出

1
cut -d ',' -f 2,4,6 data.csv > selected_columns.csv

2、4、6列目だけ新しいファイルに保存。

ログファイルからタイムスタンプとメッセージを抽出

1
2
3
4
5
# app.log の内容
# 2024-01-01 10:00:00 INFO Message 1
# 2024-01-01 10:00:01 ERROR Message 2

cut -d ' ' -f 1-2,4- app.log

実行結果:

1
2
2024-01-01 10:00:00 Message 1
2024-01-01 10:00:01 Message 2

/etc/passwdからユーザー名とシェルのリスト

1
cut -d ':' -f 1,7 /etc/passwd | grep -v nologin

ログイン可能なユーザーのリストを作成。

アクセスログからIPアドレスを集計

1
cut -d ' ' -f 1 access.log | sort | uniq -c | sort -rn | head -10

最もアクセスの多いIPアドレストップ10。

CSVの特定列を削除

1
2
# 3列目を削除したい
cut -d ',' -f 1-2,4- data.csv

メールアドレスからドメインを抽出

1
echo "[email protected]" | cut -d '@' -f 2

実行結果:

1
example.com

環境変数PATHを整形

1
echo $PATH | tr ':' '\n'

PATHを1行ずつ表示。

Tips・注意点

  • タブとスペースの違い: デフォルトはタブ区切り

    1
    2
    
    cut -f 1 file.txt     # タブ区切り
    cut -d ' ' -f 1 file.txt  # スペース区切り
    
  • 複数スペースの扱い: 連続するスペースは1つの区切りとは見なされない

    1
    2
    
    # "a  b  c"(スペースが2つ)の場合、予期しない結果になる
    # awkの方が適している場合も
    
  • フィールド番号は1から始まる: 0ではない

    1
    
    cut -f 1  # 最初のフィールド
    
  • 範囲指定の記法:

    1
    2
    3
    4
    
    cut -f 1-3    # 1から3まで
    cut -f 1-     # 1から最後まで
    cut -f -3     # 最初から3まで
    cut -f 1,3,5  # 1、3、5のみ
    
  • 区切り文字は1文字のみ: 複数文字の区切り文字は直接指定できない

    1
    2
    
    cut -d ',' -f 1    # OK
    cut -d '::' -f 1   # エラー(sedやawkを使う)
    

cutとawkの使い分け

cutはシンプルですが、より複雑な処理にはawkが向いています。

1
2
3
4
5
6
# cutが得意
cut -d ',' -f 1,3 file.csv

# awkが得意(複数スペース対応、計算、条件など)
awk '{print $1, $3}' file.txt
awk -F',' '{if ($2 > 30) print $1}' file.csv

基本的には:

  • シンプルな列抽出 → cut
  • 条件分岐や計算が必要 → awk

まとめ

今回はcutコマンドについて解説しました。

ポイント:

  • cutでテキストから特定の列を切り出せる
  • -fでフィールド(列)、-cで文字位置を指定
  • -dで区切り文字を指定(デフォルトはタブ)
  • CSVやログファイルの処理に便利
  • 範囲指定や複数指定が可能
  • シンプルな処理には最適、複雑な処理はawkを使う

cutはシンプルで高速なので、基本的なデータ抽出には最適です。CSVやTSVファイルから必要な列だけ取り出す時に、ぜひ使ってみてください。

次回もLinuxコマンドの学習を続けていきましょう!