csplit
https://www.linuxidc.com/Linux/2017-08/146610.htm
1.3 csplit命令
split只能按行或按照大小进行切分,无法按段落切分。csplit是split的变体,功能更多,它主要是按指定上下文按段落分割文件。
csplit [OPTION]... FILE PATTERN...
描述:按照PATTERN将文件切分为"xx00","xx01", ...,并在标准输出中输出每个小文件的字节数。
选项说明:
-b FORMAT:指定文件后缀格式,格式为printf的格式,默认为%02d。表示后缀以2位数值,且不足处以0填充。
-f PREFIX:指定前缀,不指定是默认为"xx"。
-k:用于突发情况。表示即使发生了错误,也不删除已经分割完成的小文件。
-m:明确禁止文件的行去匹配PATTERN。
-s:(silent)不打印小文件的文件大小。
-z:如果切分后的小文件中有空文件,则删除它们。
FILE:待切分的文件,如果要切分标准输入数据,则使用"-"。
PATTERNs:
INTEGER :数值,假如为N,表示拷贝1到N-1行的内容到一个小文件中,其余内容到另一个小文件中。
/REGEXP/[OFFSET]:从匹配到的行开始按照偏移量拷贝指定行数的内容到小文件中。
:其中OFFSET的格式为"+N"或"-N",表示向后和向前拷贝N行
%REGEXP%[OFFSET]:匹配到的行被忽略。
{INTEGER} :假如值为N,表示重复N此前一个模式匹配。
{*} :表示一直匹配到文件结尾才停止匹配。
假设文件内容如下:
[root@linuxidc ~]# cat test.txt
SERVER-1
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[CONNECTION] 192.168.0.4 pending
SERVER-3
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed
假设每个SERVER-n表示一个段落,于是要按照段落切分该文件,使用以下语句:
[root@linuxidc ~]# csplit -f test_ -b %04d.log test.txt /SERVER/ {*}
0
140
139
140
"-f test_" 指定小文件前缀为"test_", "-b %04d.log" 指定文件后缀格式"00xx.log",它自动为每个小文件追加额外的后缀".log", "/SERVER/" 表示匹配的模式,每匹配到一次,就生成一个小文件,且匹配到的行是该小文件中的内容, "{*}" 表示无限匹配前一个模式即/SERVER/直到文件结尾,假如不知道{*}或指定为{1},将匹配一次成功后就不再匹配。
[root@linuxidc ~]# ls test_*
test_0000.log test_0001.log test_0002.log test_0003.log
上面的文件中虽然只有三个段落:SERVER-1,SERVER-2,SERVER-3,但切分的结果生成了4个小文件,并且注意到第一个小文件大小为0字节。为什么会如此?因为在模式匹配的时候,每匹配到一行,这一行就作为下一个小文件的起始行。由于此文件第一行"SERVER-1"就被/SERVER/匹配到了,因此这一行是作为下一个小文件的内容,在此小文件之前还自动生成一个空文件。
生成的空文件可以使用"-z"选项来删除。
[root@linuxidc ~]# csplit -f test1_ -z -b %04d.log test.txt /SERVER/ {*}
140
139
140
还可以指定只拷贝匹配到的行偏移数量。例如,匹配到行时,只拷贝它后面的1行(包括它自身共两行),但多余的行将放入下一个小文件中。
[root@linuxidc ~]# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*}
42
139
140
98
第一个小文件只有两行。
[root@linuxidc ~]# cat test2_0000.log
SERVER-1
[connection] 192.168.0.1 success
SERVER-1段落的其余内容放入到了第二个小文件中。
[root@linuxidc ~]# cat test2_0001.log
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed
同理第三个小文件也一样,直到最后一个小文件中存放剩余所有无法匹配的内容。
[root@linuxidc ~]# cat test2_0003.log
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed
指定"-s"或"-q"选项以静默模式运行,将不会输出小文件的大小信息。
[root@linuxidc ~]# csplit -q -f test3_ -z -b %04d.log test.txt /SERVER/+2 {*}