|
csplit 命令是split 命令的一个变种。split 只能根据文件大小和文件中的行数来分割文件,而 csplit 则可以根据文件内容来分割文件,这一特性在对分割一个内容具有一定规律分块的日志文件来说比较有用,比如下面的一个日志文件:# cat tmp.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 failed
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-4
[connection] 192.168.0.5 pending
[connection] 192.168.0.7 success
[disconnect] 192.168.0.8 failed
[connection] 192.168.0.2 failed 对上面的文本使用 csplit 进行分割:# csplit tmp.txt /SERVER/ -n 3 -s {*} -f server -b "%03d.log"; rm server000.log
# ls *.log
server001.log server002.log server003.log server004.log
# cat server001.log
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
# cat server004.log
SERVER-4
[connection] 192.168.0.5 pending
[connection] 192.168.0.7 success
[disconnect] 192.168.0.8 failed
[connection] 192.168.0.2 failed 在上面的命令中,/SERVER/ 是正则表达式匹配,这里匹配的是文本中含有的 SERVER 字样,也就是我们希望 SERVER 这样的行作为分割的界限。
-n 选项后接一个数字,该数字表示分割文件的文件名中后缀序号的位数,比如上面的 001, 002, 003 等这些序号是 3 位的。
-s 选项表示采用静默模式,在运行命令时不会输出其它的信息。
{*} 表示根据上面所匹配的正则表达式进行重复分割,直到文件末尾。这么做的结果就如同上面输出所示的,每个分割后的文件里还有一个分割段落。还可以时用 {interger} ,比如 {3} 表示会产生 3 个分割文件,第 1 个分割文件是 SERVER-1 段落,第 2 个分割文件是 SERVER-2 段落,第 3 个分割文件将包含 SERVER-3 和 SERVER-4 两个段落。
-f 指定分割文件名前缀,如上面的 server。
-b 指定分割文件名的后缀,它后接的格式如同 C 语言中的 printf() 函数,如这里是 "%03d.log" ,它指示了文件名后缀部分的输出样式,其中 .log 的前面含有 3 位的整数长度,一般和上面的 -n 选项指定的位数是一致的。 |
|