Linuxのcsplitコマンド活用術:正規表現や行数で自在にファイル分割

概要:パターンマッチで賢くテキストを切り分ける

肥大化したサーバーログや長大なテキストデータを処理する際、単純な固定バイト数や行数単位ではなく、特定のキーワードやセクションの境界で綺麗に分割したい場面が多々あります。一般的な split コマンドでは難しい「内容ベース・正規表現による柔軟なファイル切り分け」を実現するのが csplit です。本記事では、Linux環境における csplit の基本挙動から実務で即戦力となる便利オプションまで、手を動かしながら体系的に解説します。

指定行番号でテキストを境界分割する基本操作

実験用の安全な作業領域を準備するため、mkdir -p ~/csplit_lab && cd ~/csplit_lab を実行して専用ディレクトリを用意し、そこへ移動します。

作業用ディレクトリの作成と移動

分割テストの対象として、全15行で構成されるサンプルのステータスログを seq -f "Line %g: System status normal" 1 15 > server_status.txt で生成します。

サンプルテキストファイルの作成

作成されたテキストの構造を確かめるため、head -n 5 server_status.txt を実行して先頭5行を出力してみます。

先頭行の確認

csplit は、引数に指定した行番号や正規表現をトリガーにして入力ファイルを複数ピースへと分離します。
具体的には csplit server_status.txt 6 11 と指定すると、第6行と第11行がそれぞれ新しいファイルの起点となり、元ファイルは「1〜5行目」「6〜10行目」「11〜15行目」の計3ファイルへ分割されます。
実行時にコンソールへ表示される数値は、生成された各分割ファイルのバイト数を示しています。
⚙️ [主要オプション一覧]

-f PREFIX : 生成ファイル名の接頭辞(デフォルトの xx)を任意の文字列へ変更します。
-b FORMAT : 連番サフィックスの書式を printf 形式でカスタマイズします。
-n DIGITS : 末尾に付与される連番の桁数を指定します(初期値: 2)。
-s : ファイルサイズ(バイト数)の画面出力を抑制し、サイレントモードで実行します。
-z : 0バイトの空ファイルが生成された場合に自動で破棄します。
-k : 処理途中でエラーが発生しても、すでに書き出されたファイルを残します。

行番号指定によるcsplit実行

コマンド実行によって生成された成果物を確認するため、ls -l xx* を叩きます。
標準の接頭辞である xx に2桁連番が付いた xx00、xx01、xx02 という3つの断片ファイルが意図通りの容量で並んでいることが分かります。

生成された分割ファイル一覧の確認

正規表現パターンを検知してセクション単位で自動切り出し

続いて、複数のセクションが混在する構造化ドキュメントを正規表現で自動仕分けしてみましょう。ヒアドキュメントを使い cat << 'EOF' > reports.txt を実行して検証用ログを生成します。

cat « ‘EOF’ > reports.txt
SECTION_A
CPU utilization: 32%
Memory utilization: 55%
SECTION_B
Disk space free: 120GB
Inode usage: 40%
SECTION_C
Network in: 1.2Gbps
Network out: 850Mbps
EOF

保存されたデータの内容を cat reports.txt で俯瞰します。
SECTION_A、SECTION_B、SECTION_C という見出しごとにシステムリソース情報が記載されていることを確認できます。

テストデータの確認

このファイルをセクションごとに自動分離するには、csplit reports.txt '/SECTION_/' '{*}' を投入します。
/SECTION_/ で分割トリガーとなる文字列パターンを定義し、後ろの {*} によってファイル末尾に達するまでマッチングを無制限に繰り返すよう指示しています。
出力された数値は各生成ファイルのバイト長であり、最初のマッチ直前に生じた0バイトファイルを含め、セクションごとのサイズが順次レポートされます。

正規表現による繰り返しファイル分割

切り出されたファイルの中身を検証すべく、head -n 20 xx* を実行します。
先頭パターン以前の空領域である xx00 に続き、各セクションのブロックが xx01、xx02、xx03 へ的確に振り分けられている様子が把握できます。

分割ファイル内容の一括表示

出力ファイル名のプレフィックスと連番桁数を柔軟に設定する

標準の xx00 というファイル名では、スクリプトでの後続処理や視認性の面で不便な場合があります。そこで、実用的なログファイルを模した cat << 'EOF' > app.log を用意します。

cat « ‘EOF’ > app.log
[ERROR] 2026-10-25 DB connection timeout
[INFO] Retrying connection attempt 1
[ERROR] 2026-10-25 Authentication failure
[WARN] High memory consumption detected
[ERROR] 2026-10-25 Redis cache cluster down
EOF

特定のエラーブロックごとに仕分けつつ、出力名も整えるため csplit -f log_part_ -n 3 app.log '/\[ERROR\]/' '{*}' を実行します。
ここでは -f log_part_ でプレフィックスを明示し、-n 3 でインデックス番号を3桁固定(000, 001…)に揃えています。正規表現中の特殊文字 [ と ] はバックスラッシュで適切にエスケープ処理を施します。

接頭辞と桁数を指定したログ分割

反映結果を ls -l log_part_* でチェックします。
指定通りの接頭辞と3桁フォーマットが付与され、log_part_000 から log_part_003 までの連番ファイル群が綺麗に生成されました。

カスタム命名された出力ファイルの確認

実務で役立つ実戦オプション:空ファイル除外(-z)と生成保持(-k)

テキスト冒頭が分割キーワードで始まる場合、手前に0バイトの無駄なファイルが作られてしまいます。この問題を回避し、さらに障害耐性を高めるコマンドが csplit -z -k -f clean_part_ reports.txt '/SECTION_/' '{*}' です。
-z オプションは不要な空ファイルの生成を自動で抑止し、-k オプションは処理エラーが起きても作成済みのファイルを消去せず維持します。
その結果、不要な0バイトの出力は排除され、実データが存在する3ファイル分のサイズ(55、50、51バイト)だけがスマートに計上されます。

空ファイル抑止オプション付きのcsplit実行

ディレクトリ内の状態を ls -l clean_part_* で確認してみましょう。
-z の働きにより、先頭にあった無意味な空ファイルが排除され、clean_part_00 から clean_part_02 までの実用的な3ファイルのみが残されていることが確認できます。

クリーンに分割されたファイル一覧

最初のパーツが正常にデータを含んでいるかを確かめるため、cat clean_part_00 を実行します。
余計な空行や欠落がなく、先頭行の SECTION_A から綺麗にデータが収録されていることが見て取れます。

先頭分割ファイルの内容確認

一連の検証が終わったら、rm -rf ~/csplit_lab を実行してラボ用ディレクトリとテストファイルを後片付けします。

検証用ディレクトリの削除

行数や固定バイト数での分割にとどまらず、パターンマッチを活用して意味のある単位でテキストを分解できるのが csplit の最大の強みです。ログ調査の自動化スクリプトやバッチデータの前処理など、日々のシステム運用やテキスト処理パイプラインにぜひ組み込んでみてください。