分割文件和数据(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,可以根据文本自身的特点进行分割

posted @ 2020-02-04 16:45  江戸川のコナン  阅读(511)  评论(0编辑  收藏  举报
……