LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネル環境でログファイルやCSVCSV [シーエスブイ]Comma-Separated Values。カンマ区切りのデータ形式ファイルを確認している際、「特定の列(フィールド)だけを抜き出したい」「行ごとの文字数を揃えて切り出したい」と感じたことはないでしょうか。手作業で不要な部分を削除していくのは非効率であり、ミスのもとになります。
この記事では、Linuxのコマンドラインにおいてテキスト処理で頻繁に利用される cut コマンドの使い方を解説します。区切り文字の指定方法から文字数による抽出、シェルスクリプトでの実用的な活用例まで、インフラエンジニアやプログラマーが日々の業務で役立てられる知識を網羅しています。
この記事を読むことで、ファイルや標準入力から必要なデータだけを正確かつ高速に切り出し、テキスト処理の作業効率を向上させることができるようになります。
確認した環境
本記事で解説するコマンドや手順は、以下の環境を前提に動作を確認しています。
- OSOS [オーエス]Operating System。基本ソフトウェア: UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04 LTS / AlmaLinux 9.4
- コアユーティリティ: GNU coreutils(
cutコマンドが標準搭載されているバージョン)
Linuxのcutコマンドとは?テキスト処理の基本
Linuxにおける cut コマンドは、ファイルや標準入力から行単位で読み込み、指定した部分(フィールドや文字)を切り出して標準出力に表示するためのコマンドです。
cutコマンドの主な役割と向いているケース
cut コマンドは、構造化されたテキストデータをシンプルに加工する場面に向いています。
- CSVやTSVなどの区切られたデータから、特定の列だけを取得する
/etc/passwdなどのシステム設定ファイルからユーザー名やホームディレクトリを取り出す- ログファイルの出力フォーマットから、特定の文字位置(桁数)のデータだけを切り出す
複雑なパターンマッチングや条件分岐を伴わない、単純な列抽出や文字位置の切り出しにおいて、非常に軽量で手軽に利用できるのが特徴です。
awkやsedとの違い・使い分けのポイント
Linuxのテキスト処理には、cut のほかにも awk や sed といった強力なコマンドが存在します。それぞれの特徴と使い分けのポイントは以下の通りです。
| コマンド | 主な特徴 | 向いている用途 |
|---|---|---|
| cut | 指定した区切り文字や文字位置でシンプルに切り出す | 固定フォーマットや単純な列・文字数の切り出し |
| awk | フィールド指向のプログラミング言語。数値計算や条件分岐が可能 | 複数条件のフィルタリング、列の並べ替え、集計処理 |
| sed | ストリームエディタ。文字列の置換、行の削除・挿入が得意 | パターンマッチングによる置換、特定の行の抽出や加工 |
単純な列の切り出しであれば cut コマンドが最も簡潔に記述できますが、スペースやタブが連続している複雑な区切り文字の処理や、数値計算を伴う場合は awk の利用を検討します。
cutコマンドの基本的な使い方とオプション
cut コマンドの基本的な構文は以下の通りです。
cut [オプション] [ファイル名]ファイルを指定しない場合は標準入力(パイプ経由の入力など)からデータを受け取ります。 主なオプションは以下の通りです。
-d, --delimiter=<区切り文字>: フィールドを分割する区切り文字を指定します(デフォルトはタブ)。-f, --fields=<リスト>: 抽出するフィールド(列)の番号を指定します。-s, --only-delimited: 区切り文字を含まない行を出力しません(デフォルトでは区切り文字がない行はそのまま出力されます)。-c, --characters=<リスト>: 抽出する文字位置を指定します。-b, --bytes=<リスト>: 抽出するバイト位置を指定します。--output-delimiter=<文字列>: 出力時の区切り文字を指定します。--complement: 指定した抽出対象(フィールドや文字)以外の部分を出力します。
抽出基準の使い分け(-f / -c / -b)
cut コマンドでは、抽出の基準に応じて以下の3つのオプションを使い分けます。
| オプション | 抽出基準 | 主な用途 |
|---|---|---|
| -f | フィールド番号 | CSVやTSV、設定ファイルなどの区切り文字で区切られた列の抽出 |
| -c | 文字位置 | 固定長データなど、文字位置・文字数を基準とした抽出 |
| -b | バイト位置 | ASCII固定長やバイト位置を直接指定した抽出 |
-dオプションで区切り文字を指定する方法
-d オプションを使用すると、フィールドを区切る文字を変更できます。例えば、カンマ(,)を区切り文字として指定する場合は -d',' と記述します。
なお、デフォルトの区切り文字はタブ(\t)であるため、TSVファイルを扱う場合は -d オプションを省略可能です。
注意(区切り文字の指定ルール):
-dに指定できる区切り文字は1文字のみです。::や---のように複数の文字からなる文字列をひとつの区切り文字として指定することはできません(cut: the delimiter must be a single characterエラーになります)。複数文字を区切り文字として扱いたい場合は、awk -F'::'などの利用を検討してください。
-fオプションで抽出するフィールド(列)を指定する方法
-f オプションでは、何番目のフィールドを抽出するかを指定します。番号は 1 から始まります。
複数のフィールドを指定したり、範囲を指定することも可能です。
- 単一の指定:
-f 1(1番目のフィールド) - 複数の指定:
-f 1,3(1番目と3番目のフィールド) - 範囲の指定:
-f 1-3(1番目から3番目までのフィールド) - 範囲の省略(以降):
-f 2-(2番目以降のすべてのフィールド) - 範囲の省略(以前):
-f -2(最初から2番目までのフィールド)
補足(列の並べ替えについて):
cut -f 3,1のように順番を入れ替えて指定しても、出力は常に元の入力順(1番目、3番目)で表示されます。cutコマンドには列の順序を並べ替える機能はないため、列順を入れ替えたい場合はawk '{print $3, $1}'などを利用します。
—output-delimiterで出力の区切り文字を変更する
フィールド抽出時の区切り文字は、通常は入力と同じ区切り文字が使われます。--output-delimiter を指定すると、出力時の区切り文字を自由に変更できます。
echo 'apple,banana,orange' | cut -d',' -f1,3 --output-delimiter=' | '実行結果:
apple | orangeカンマ区切りデータをパイプ(|)やタブ区切りに整形して出力したい場合に役立ちます。また、文字位置(-c)やバイト位置(-b)を複数の範囲(例: -c1-3,5-7)で抽出する際の区切り文字としても利用できます。
【実践】区切り文字を変更してデータを抽出する
ここでは、具体的なファイルやテキストデータを例に、区切り文字を変更したデータ抽出の実践的な手順を解説します。
CSVファイルから特定の列だけを抽出する
例えば、以下のような内容を持つカンマ区切りのファイル users.csv があるとします。
id,name,department,email1,Taro Yamada,Sales,taro@example.com2,Hanako Sato,Development,hanako@example.com3,Ichiro Suzuki,Infrastructure,ichiro@example.comこのCSVファイルから「名前(2列目)」と「メールアドレス(4列目)」だけを抽出したい場合、以下のようにコマンドを実行します。
cut -d',' -f2,4 users.csv実行結果:
name,emailTaro Yamada,taro@example.comHanako Sato,hanako@example.comIchiro Suzuki,ichiro@example.com-d',' でカンマを区切り文字として指定し、-f2,4 で2番目と4番目のフィールドを指定することで、必要な列のみを効率よく取り出すことができました。
注意:
cutは単純にカンマの位置で機械的に切り分けるため、セル内にカンマが含まれているデータ(例:"Tokyo, Japan")やダブルクォートのエスケープ、改行を含む複雑なCSVには対応できません。そのようなデータを処理する場合は、PythonPython [パイソン]汎用プログラミング言語のcsvモジュールや専用のCLICLI [シーエルアイ]Command Line Interface。コマンドで操作するインターフェースツール(csvkit等)を利用するのが安全です。
コロン(:)区切りの/etc/passwdからユーザー名を取り出す
Linuxシステム上のユーザーアカウント情報が格納されている /etc/passwd ファイルは、各フィールドがコロン( : )で区切られています。
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/usr/sbin:/usr/sbin/nologinこのファイルから1番目のフィールドである「ユーザー名」だけを抽出するには、以下のように実行します。
cut -d':' -f1 /etc/passwd実行結果:
rootdaemonbin...(以下略)...このように、システム管理の現場で設定ファイルの中身を素早く確認したい場合に cut コマンドが役立ちます。
文字数(バイト数)を指定して切り出す方法
cut コマンドは区切り文字を使ったフィールド単位の抽出だけでなく、文字数やバイト数を基準にして行内の特定の位置を切り出すことも可能です。
-cオプションを使った文字位置による切り出し
-c オプションを使用すると、指定した文字の位置(何文字目か)でテキストを切り出せます。-f と同様に、範囲指定や複数指定が可能です。
例えば、固定長の文字列データや、以下のような日付データ(YYYY-MM-DD)から年部分だけを切り出したい場合を考えます。
echo "2026-10-21" | cut -c1-4実行結果:
2026また、1文字目から5文字目までをスキップして6文字目以降を取得したい場合は、-f と同様に -c6- のように指定します。
マルチバイト文字(日本語)を扱う際の注意点
cut コマンドには、バイト位置を指定する -b と、文字位置を指定する -c があります。
- ASCII文字(英数字・半角記号)の場合: 1文字=1バイトのため、
-bと-cのどちらを使っても同じ結果が得られます。 - UTF-8(日本語など)の場合: ひらがなや漢字は1文字あたり3バイト以上を消費します。
GNU coreutils のマニュアル上、-c は文字位置を指定するオプションと説明されていますが、多くのLinux環境(Ubuntu 24.04 LTS や AlmaLinux 9.4 などの標準バージョンを含む)では、-c が -b と同様にバイト単位で動作する実装になっています。
そのため、日本語を含むテキストに対して cut -c を使用すると、文字の途中でバイトが分断されて文字化けの原因になります。
# Ubuntu 24.04 LTS / AlmaLinux 9.4 等での実行結果の例$ echo "あいうえお" | cut -c1-2
# ※UTF-8で「あ」は3バイトのため、2バイト分だけが切り出されて文字化けする環境確認のポイント: お使いの環境で
-cが文字単位で動作するかどうかは、以下のコマンドで事前に確認できます。Terminal window cut --versionlocale charmapprintf 'あいうえお\n' | cut -c1-2
locale charmapがUTF-8と表示されても、cutの実装自体がマルチバイト文字境界に対応していなければ文字化けします。
日本語文字列を文字数単位で安全に切り出すならawkが確実
シェルスクリプト等で日本語の文字数を基準に切り出したい場合は、マルチバイト文字処理に標準対応している awk の substr() 関数を利用するのが確実です。
# awk を使って先頭2文字(あい)を正確に抽出する例$ echo "あいうえお" | awk '{print substr($0, 1, 2)}'あい補足: GNU awk(gawk)はロケール設定に従って文字位置を正確に認識します。実行環境のロケール(
locale charmap)がUTF-8になっていることを確認して利用してください。
シェルスクリプトやパイプラインでの実用的な活用例
cut コマンドは単体で使うだけでなく、他のコマンドとパイプライン(|)で繋ぐことで、シェルスクリプトや日々の運用作業において強力なテキスト処理ツールとして機能します。
特定のプロセスのPIDを抽出する方法(pgrepとcutの使い分け)
システム上で稼働している特定のプロセス情報を調べ、プロセスID(PID)だけを抽出したい場面はよくあります。
推奨:pgrepコマンドを利用して簡潔にPIDを取得する
プロセスのPIDを取得する場合は、専用の pgrep コマンドを利用すると簡潔に記述できます。
# nginx というプロセス名に完全一致するPIDを取得pgrep -x nginx-xはプロセス名全体が完全に一致するプロセスを検索するオプションです。- PIDだけでなくコマンドライン全体も合わせて確認したい場合は、
pgrep -a nginxを利用できます。
参考:psコマンドとcutを組み合わせるパイプライン例と注意点
テキスト処理の練習や古典的なスクリプトでは、ps コマンドの結果を cut で切り出す手法も見られます。
ps aux | grep nginx | grep -v grep | tr -s ' ' | cut -d' ' -f2空白区切りデータを処理する際の注意点:
ps auxの出力は可変長のスペースで整列されているため、tr -s ' 'で連続するスペースを1つに圧縮してからcut -d' 'に渡しています。- ただし、
tr -s ' 'は行頭にあるスペースを削除しないため、OSやユーザー名の長さによって行頭に空白が含まれていると、cut -d' ' -f2がPIDではなく空文字や別の列を抽出してしまうリスクがあります。- また、
grep nginxはコマンドライン引数にnginxが含まれる別プロセスまで拾ってしまう可能性があります。そのため、単にPIDを取得したい場合は前述の
pgrepを使い、スペース区切りのテキストから安全に特定列を抽出したい場合は、空白の連続を自動で1つの区切りとして認識するawk '{print $2}'などを検討するのがおすすめです。
他のコマンドと組み合わせてログファイルを解析するコツ
Webサーバーのアクセスログなどから、アクセス元のIPIP [アイピー]Internet Protocol。インターネット通信の基本プロトコルアドレスだけを効率的に集計したい場合にも cut が活躍します。
ApacheApache [アパッチ]世界中で広く利用されているオープンソースのWebサーバーソフトウェアやNginxNginx [エンジンエックス]高性能なWebサーバー・リバースプロキシの標準的なアクセスログ形式(combined形式)では、1番目のフィールドにリモートホスト(クライアントIPアドレス)が記録されています。
cut -d' ' -f1 /var/log/nginx/access.log | sort | uniq -c | sort -nrこのパイプライン処理では以下の操作を行っています。
cut -d' ' -f1 /var/log/nginx/access.logでログファイルを直接読み込み、スペース区切りの1番目の要素(IPアドレス)を抽出するsortとuniq -cでIPアドレスごとのアクセス数を集計する- 再度
sort -nrでアクセス数の多い順に並べ替える
ワンポイント:
cutコマンドは引数にファイルを直接指定できます。cat <ファイル名> | cut ...のようにcatを挟まずに直接ファイルを渡すことで、余計なプロセスを消費せず効率的に処理できます。
実務での注意点:
- ログ形式の確認: 上記は先頭にクライアントIPが記録される標準フォーマットを前提としています。Nginxの
log_formatディレクティブで独自のカスタムログフォーマットを設定している場合は、何番目の列にIPアドレスがあるか確認してから-fの番号を調整してください。- リバースプロキシ環境: AWSAWS [エーダブリュエス]Amazon Web Services。Amazonのクラウドサービス ALBやCloudflare、リバースプロキシ等を経由している環境では、アクセスログの先頭にプロキシ自体のIPアドレスが記録される場合があります。クライアントのIPアドレスを確認するには、Nginxのログ設定やプロキシ側の転送設定を確認してください。
X-Forwarded-Forなどのヘッダーを利用する場合は、信頼できるプロキシから渡された情報であることも確認する必要があります。
まとめ:cutコマンドをマスターして日々のテキスト処理を効率化しよう
今回は、Linuxの cut コマンドについて、基本的な使い方から実践的な活用例、注意すべきポイントまでを解説しました。
記事のポイントを以下にまとめます。
cutコマンドはファイルや標準入力から特定の列や文字を効率的に切り出す軽量・高速なツールである。-dオプションで区切り文字を指定し、-fオプションで必要なフィールド(列)番号を指定して抽出する。- デフォルトの区切り文字はタブであるため、CSVを扱う場合は
-d','のように明示的に指定する。 - マルチバイト文字(日本語)を扱う際、多くのLinux環境では
cut -cもバイト単位で動作し文字化けするため、文字数単位で切り出す場合はawkなどを利用する。 - 列の並べ替えや複雑な文字列処理、セル内カンマを含むCSVなどの高度な処理には、無理に
cutを使わずawkや Python などを適切に使い分ける。
テキスト処理ツールの使い分けの目安
| ツール | 得意な用途・向いているケース |
|---|---|
| cut | シンプルな区切り文字による列抽出、固定長テキストの位置切り出し |
| awk | 複数条件の抽出、列の並べ替え、集計計算、柔軟な文字列処理 |
| sed | パターンマッチによる文字列置換、特定行の削除や挿入 |
| Python等 | 引用符(クォート)や改行を含む本格的なCSV/JSONJSON [ジェイソン]JavaScript Object Notation。軽量データ交換フォーマットデータの処理 |
テキスト処理の基本である cut コマンドの特徴と限界を正しく理解し、日々のシステム管理や開発作業をよりスムーズに進めましょう。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。