csplit 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
csplit——文本处理命令族(见文本处理与搜索命令族)。split 只能按固定大小切,而csplit能按"内容模式"切——比如每遇到一个Chapter标题就开一个新文件。
csplit 根据行号或正则表达式,把输入文件切成若干段,每段写成一个独立文件。它适合"按语义边界"拆分,而不是机械地每 N 行一刀。
一、按行号切
bash
csplit data.txt 100 # 在第 100 行处切开:前 99 行 → xx00,其余 → xx01
csplit data.txt 50 120 # 在 50 行、120 行各切一刀,得到 3 段给数字表示"在第 N 行之前断开"。可以列多个数字,切出多段。默认输出文件名像
xx00、xx01,每段一个。
二、按正则模式切
bash
csplit report.txt '/^Chapter/' # 每遇到以 Chapter 开头的行就断开
csplit -z report.txt '/^Chapter/' '{*}' # -z 丢弃空文件;{*} 重复切到最后这才是 csplit 的杀手锏:
/正则/表示"在匹配该行的位置断开"。单独一个/.../只切一次,加{*}表示"对后续每一次匹配都继续切",直到文件结束。-z会把切出来的空段丢掉,避免生成一堆xx00空文件。
三、自定义输出名与编号
bash
csplit -f chap_ -n 2 report.txt '/^Chapter/' '{*}' # 输出 chap_00, chap_01 ...
-f设文件名前缀,-n设编号位数(默认 2 位)。处理长文档时把前缀设成有意义的词,后续好辨认。
四、csplit vs split
| 命令 | 切分依据 |
|---|---|
csplit | 按行号 / 正则内容边界(语义切分) |
| split | 按固定字节/行数大小(机械切分,见split 命令详解) |
要"每 1MB 一刀"用 split;要"每章一个文件""每遇空行断开"用 csplit。csplit 懂内容,split 只懂大小。
五、实战:把大日志按日期行拆开
bash
# 假设日志每段以 "[2026-08-28" 开头
csplit -z -f day_ access.log '/^\[2026-/' '{*}'一句话总结
csplit = 按内容边界切文件:/正则/ 在匹配行断开、{*} 重复切到结尾、-z 丢空段、-f/-n 控文件名;适合按章节/日期语义拆分。纯按大小机械切请用 split。