「csplit(1)」-

根据上下文行将文件分割成多个部分

命令语法格式

csplit [OPTION]… FILE PATTERN…

命令描述

csplit可以将一个大文件中的内容进行分割,然后将得到的各个部分分别写入不同的文件中。其中,分割点是与PATTERN匹配的行。在任何情况下,按排序顺序连接所有的输出文件都可以会生成原始输入文件。

由csplit产生的输出文件的内容由PATTERN参数确定,如下所述。如果PATTERN参数指向了输入文件的不存在行(例如,如果没有任何行可以与给定的正则表达式匹配),则会发生错误。csplit使用PATTERN与文件内容进行匹配查找,如果匹配到行,则会将匹配行之前的内容写入文件。如果后面还有PATTERN,则csplit只会将文件的剩余部分与下一个PATTERN进行匹配。以此类推。在每个PATTERN都匹配后,剩余的输入将被复制到最后一个输出文件中。

输出文件的名称由一个前缀(默认为’xx’),然后加一个后缀组成。默认情况下,后缀是从’00’到’99’的两位十进制数的升序,形如’xx00′, ‘xx01’, …。在任何情况下,按排序顺序连接所有的输出文件都可以会生成原始输入文件。

默认情况下,csplit在创建完文件后,会打印出写入每个输出文件的字节数。

如果FILE为-,则从标准输入中读取文件。

默认情况下,如果csplit遇到错误或收到hangup, interrupt, quit, terminate信号,它将在退出之前删除创建的所有输出文件。

命令支持的选项及含义

长选项的必填参数,在短选项中也是必须提供的。

-b, –suffix-format=FORMAT
修改生成文件的后缀,使用格式FORMAT作为输出文件名后缀。默认为两位数值‘%02d’。当指定此选项时,后缀字符串FORMAT必须包含一个printf(3)式转换规范,可能包括格式规范标志,字段宽度,精度规格或所有这些类型的修饰符。格式字母必须将二进制无符号整数参数转换为可读形式。格式字母’d’和’i’是’u’的别名,允许’u’,’o’,’x’和’X’转换。整个格式FORMATh会发送给sprintf(3)来格式化文件名后缀,依次为每个单独的输出文件形成文件名后缀。

如果使用此选项,则会忽略–digits选项。

-f, –prefix=PREFIX
修改输出文件名的前缀。默认为’xx’。

-k, –keep-files
发生错误时,不要删除已经生成的文件。默认情况下,如果csplit遇到错误或收到hangup, interrupt, quit, terminate信号,它将在退出之前删除创建的所有输出文件。

–suppress-matched
不要输出符合PATTERN的行。即,下一个文件中不会包含作为上一个文件结束分界线的行。

但是,如果这个文件是“结束文件”(所以PATTERN都匹配结束后,剩余的输入内容),那它包含了上一个文件的结束分界线的行。详见下面的「关于–suppress-matched选项」示例。

-n, –digits=DIGITS
指定生成文件名中后缀数字的长度。默认为长度为2,即两位数字。

-s, –quiet, –silent
默认csplit会输出写入每个文件的字节数。

-z, –elide-empty-files
不要生成空的输出文件。如果输入文件的一行就匹配PATTERN,那么第一个输出文件通常是空文件。输出文件名的序列号始终从0开始,即使指定了此选项移除了空文件,对于那些非空的文件名也是从零开始。

–help
显示帮助信息并退出。

–version
显示版本信息并退出。

PATTERN参数的取值如下:

INTEGER
创建一个输出文件,其中包含第INTEGER行之前的内容,但是不包含第INTEGER行。如果后面跟着一个重复计数,那么还要为每次重复创建一个包含输入文件的后INTEGER行的输出文件。

/REGEXP/[OFFSET]
创建一个输出文件,该文件包含的内容为第一匹配REGEXP的行的前面的行,但不包括匹配REGEXP的行。可选的偏移量OFFSET是一个整数。如果给出了OFFSET,匹配REGEXP的行加上或者减去OFFSET后的行会输出到文件中。然后,从那个地方开始剩下的行会用做输入的下一部分。

%REGEXP%[OFFSET]
像上一个的类型一样,只是它不创建输出文件,所以输入文件的部分被有效地忽略。

{INTEGER}
重复上一个模式INTEGER次。INTEGER既可以是正整数也可以是星号,表示重复需要次数直到输入耗尽。

偏移量OFFSET要求格式是一个加号(+)或者减号(-)后跟一个数字。

使用示例

关于–suppress-matched选项

# seq 14 | csplit –suppress-matched – ‘/[79]$/’ ‘/[79]$/’
12
2
17
# head *
==> xx00 <==
1
2
3
4
5
6

==> xx01 <==
8

==> xx02 <==
9
10
11
12
13
14

生成第二个文件时,没有了做为第一个文件分割边界的行`7`。但是,第二个文件结束后,第三个文件是“结束文件”(即,包含剩余输入的文件),其中包含了边界行`9`。

相关手册

查看在线手册:http://www.gnu.org/software/coreutils/csplit

查看info手册:info ‘(coreutils) csplit invocation’

参考文献

  • man 1 csplit, version GNU coretuils 8.26

更新日志

  • 06/06/2018 创建文章