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 验证有哪几行会被匹配。