首页/系统/Linux 运维命令速查/csplit 按模式切分文件
文本处理77 条

csplit 按模式切分文件

按正则行或行号把大文件切成多段:日志按会话标记切段、按固定行数分卷都行;-f/-b 控制命名。

Linux 运维命令速查系统更新于 2026-10-13

csplit 切分文件

csplit 属于 GNU coreutils,按给定模式把一个文件切成若干个小文件。模式既可以是行号(每 10000 行切一段),也可以是正则(每次遇到符合特征的行就开一段),重复次数用 {n} 表示、{*} 表示一直切到末尾。日志按会话标记切段、大文件按行数分卷、把合并过的文档拆回多份,都是它的主场。

基本信息

适用平台Linux(GNU coreutils);macOS 自带 BSD 版
语法csplit [选项] 文件 模式...
模式写法/正则/ 在匹配行前切开;纯数字按行数切;{n} 重复 n 次;{*} 重复到文件尾
输出命名默认 xx00、xx01,用 -f 改前缀、-b 改后缀格式、-n 改位数

典型使用场景

  • 把包含多个请求或会话的日志切成一段一个文件,便于逐个分析
  • 按固定行数给超大文本分卷,绕开编辑器与工具的行数限制
  • 按章节标题把合并导出的大文档拆回独立文件
  • 从混合输出中按标记行提取多段内容,供后续脚本处理
  • 给测试数据按分隔标记切片,做数据驱动的批量校验

常用示例

常用示例
csplit -f part- -b '%02d.log' access.log '/^== /' '{*}'   # 每个 == 开头的行起一段
csplit -z -n 3 big.txt 10000 '{*}'                         # 每 1 万行一段,-z 不产出空文件
csplit -n 2 -f chunk- report.txt 5000 '{*}'                # 每 5000 行一段,两位数序号
ls -l part-*.log | head                                     # 先确认切出的分片
head -n 3 part-00.log                                       # 抽查边界是否符合预期
wc -l part-00.log big.txt                                   # 用行数交叉验证总量

模式与选项读法

写法含义使用注意
/正则/匹配行之前切开,该行归入新段开头从第二段起才按正则切,第一段是最前面的内容
数字每多少行切一段常与 {*} 连用做等长分卷
{n}把前一个模式重复 n 次重复次数不足时提前结束并返回非零
{*}重复到文件末尾分卷场景最常用
-f -b -n输出文件的前缀、后缀格式、序号位数默认 xx00 很容易和别的任务撞名
-z不产出空文件正则连续匹配时能避免一堆空分片
-k出错时保留已切出的文件调试切分规则时很有用
csplit 不删除原文件,但分片默认写在工作目录;模式完全不匹配时退出码非 0,此时已经切出的分片仍然存在,set -e 的脚本要单独判断。
正则采用基础正则语法,写 .log 这类含点的模式要注意转义习惯;不确定时先用 grep -n 验证有哪几行会被匹配。

易错点

  • 默认输出 xx00、xx01 命名,批量运行时容易与别的任务互相覆盖,正式脚本务必用 -f 与 -b 定制
  • 模式行本身归入新段开头,肉眼核对分片边界时容易以为切错,验收先 head 几行
  • 匹配数少于预期时 csplit 返回非零但分片已经生成,脚本若直接删源文件会丢数据
  • 在文件所在目录直接跑,分片与原文件混在一起;先 cd 到临时目录或加前缀,方便整体清理

数据来源与参考

  • man 1 csplit(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌