分割文件和数据(linux)
在某些情况下,必须把文件分割成多个更小的片段。如今我们分割文件的目的比如:提高可读性、生成日志、通过Email发送文件等等。
假设我们有一个erro.log的测试文件,其大小为14M。你可以将该文件分割成多文件,例如:
[root@gameserver1 file]# split -b 5M erro.log #-b 大小选项 [root@gameserver1 file]# ls erro.log xaa xab xac [root@gameserver1 file]# du -hs * 14M erro.log 5.0M xaa 5.0M xab 3.8M xac
上面的命令将erro.log文件分割成多个文件,以每个文件5M的大小分割。这些文件以xaa、xab、xac的形式命名。这表明他们都有一个字母后缀。如果想以数字为后缀,可以另外使用-d参数。此外,使用-a 可以指定后缀的长度:
[root@gameserver1 file]# split -b 5M erro.log -d -a 4 #-d以数字为后缀 -a 4 表示后缀为4位 [root@gameserver1 file]# ls erro.log x0000 x0001 x0002 [root@gameserver1 file]# du -hs * 14M erro.log 5.0M x0000 5.0M x0001 3.8M x0002
除了M(MB)后缀,我们还可以使用G(GB)、c(byte)、w(word)、k(KB)等后缀。
刚刚说了为分割的文件名指定了后缀,那么也可以给分割的文件名指定前缀。之前分割的文件名前缀都有一个x,我们可以通过提供一个前缀名来使用自己的文件名前缀,例如:
[root@gameserver1 file]# split -b 5M erro.log -d -a 5 erro_log #erro_log 指定的切割后的文件前缀 [root@gameserver1 file]# ls erro.log erro_log00000 erro_log00001 erro_log00002 [root@gameserver1 file]# du -hs * 14M erro.log 5.0M erro_log00000 5.0M erro_log00001 3.8M erro_log00002
如果不想按照数据块大小,而是需要根据行数来分割文件的话,可以使用: -l 行数 的格式来进行分割:
[root@gameserver1 file]# split -l 99999 erro.log #按照每个文件99999行来进行分割 [root@gameserver1 file]# ls erro.log xaa xab xac [root@gameserver1 file]# du -hs * 14M erro.log 6.7M xaa 6.7M xab 456K xac
另外还有一个工具是csplit。他能够根据指定的条件和字符串匹配选项对日志文件分割。来看看这个工具是如何运作的。
csplit是split工具的一个变体。split只能够根据数据大小或行数进行分割文件,而csplit可以根据文本自身的特点进行分割。是否存在某个单词或文本内容都可以作为分割文件的条件。例如我有一个host.txt文件:
我现在需要将这个文件分割成server1.txt、server2.txt和server3.txt,这些文件的内容分别取自原文件host.txt中不同的server部分。那么,可以使用下面的方法来实现:
[root@gameserver1 file]# csplit host.txt /server/ -n 2 -s {*} -f server -b "%02d.txt" ; rm server00.txt rm:是否删除普通空文件 "server00.txt"?y [root@gameserver1 file]# ls host.txt server01.txt server02.txt server03.txt [root@gameserver1 file]# cat server01.txt server-1 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5 192.168.1.6 192.168.1.7 [root@gameserver1 file]# cat server02.txt server-2 192.168.2.1 192.168.2.2 192.168.2.3 192.168.2.4 192.168.2.5 192.168.2.6 192.168.2.7 [root@gameserver1 file]# cat server03.txt server-3 192.168.3.1 192.168.3.2 192.168.3.3 192.168.3.4 192.168.3.5 192.168.3.6 192.168.3.7
有关命令的详细说明:
csplit host.txt /server/ -n 2 -s {*} -f server -b "%02d.txt" ; rm server00.txt
/server/ 用来匹配某一行,分割过程即从此处开始。
-n 指定分割后的文件名后缀的数字个数,例如:01、02、03等。
-s 使命令进入静默模式,不打印其它信息
{*} 表示根据匹配重复执行分割操作,直到文件末尾为止。也可以用 {整数} 的方式来指定分割执行的次数。
-f 指定分割后的文件名的前缀(在上面的例子中server就是前缀)。
-b 指定后缀格式。例如%02d.txt,类似于C语言中printf的参数格式。在这里 文件名 = 前缀 + 后缀 = server + %02d.txt。
因为分割后的第一个文件没有内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.txt。
综上所述:
split,可以根据数据大小和行数来进行分割
csplit,可以根据文本自身的特点进行分割