dd、split、csplit命令

在Linux最常用的公文生成和切成片工具是dd,它作用相比周详,但无能为力以行为单位领到文件数量,也心中无数直接将文件按大小或行数进行均分(除非借助循环)。另三款数额分割工具split和csplit能够相比轻易地贯彻那几个供给。csplit是split的晋级版。

1.1 dd命令

从if钦赐的公文读取数据,写入到of钦点的文件。使用bs钦赐读取和写入的块大小,使用count钦赐读取和写入的数目块数量,bs和count相乘正是文件总大小。能够钦点skip忽略读取if内定文件的前有个别个块,seek内定写入到of内定文件时大意前某个个块。

dd if=/dev/zero of=/tmp/abc.1 bs=1M count=20

if是input file,of是output
file;bs有c(一byte)、w(2bytes)、b(512bytes)、kB(1000bytes)、K(拾二四bytes)、MB(一千)、M(拾二四)和GB、G等二种单位。因而,不要任意在单位后增加字母B。

若果现存文件CentOS.iso的轻重缓急壹.三G,要求将其切分后苏醒,切分的第壹个小文件大小为500M。

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M count=250

更动第三个小文件,由于第一个小文件不知晓具体尺寸,所以不点名count选项。由于第1个小文件要从第肆00M处开首切分,于是须求忽略CentOS.iso的前500M。要是bs=2M,于是skip掉的数据块数量为250。

dd if=/tmp/CentOS.iso of=/tmp/CentOS2.iso bs=2M skip=250

现在CentOS.iso=CentOS1.iso+CentOS2.iso。可以将CentOS[1-2].iso还原。

cat CentOS1.iso CentOS2.iso >CentOS_m.iso

比较CentOS_m.iso和CentOS.iso的md5值,它们是一点1滴平等的。

shell> md5sum CentOS_m.iso CentOS.iso
504dbef14aed9b5990461f85d9fdc667  CentOS_m.iso
504dbef14aed9b5990461f85d9fdc667  CentOS.iso

那么seek选项呢?和skip有啥样分别?skip选项是忽视读取时的前N个数据块,而seek是忽视写入文件的前N个数据块。假诺要写入的文书为a.log,则seek=贰时,将从a.log的第3个数据块开首增大多据,假设a.log文件自个儿尺寸就相差二个数据块,则缺少的部分机关使用/dev/zero填充。

于是,在有了CentOS壹.iso的基本功上,要将其还原为和CentOS.iso一样的文书,能够行使上面包车型客车措施:

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M skip=250 seek=250

苏醒后,它们的md5值也是千篇1律的。

shell> md5sum CentOS1.iso CentOS.iso
504dbef14aed9b5990461f85d9fdc667  CentOS1.iso
504dbef14aed9b5990461f85d9fdc667  CentOS.iso

1.2 split命令

split工具的法力是将文件切分为八个小文件。既然要生成四个小文件,必然要钦点切分文件的单位,帮助按行切分以及按文件大小切分,此外还需消除小文件命名的主题材料。举例,文件名前缀、后缀。若是未分明钦命前缀,则暗中同意的前缀为”x”。

以下是命令的语法表达:

split [OPTION]... [INPUT [PREFIX]]

-a N:生成长度为N的后缀,默认N=2
-b N:每个小文件的N,即按文件大小切分文件。支持K,M,G,T(换算单位1024)或KB,MB,GB(换算单位1000)等,默认单位为字节
-l N:每个小文件中有N行,即按行切分文件
-d N:指定生成数值格式的后缀替代默认的字母后缀,数值从N开始,默认为0。例如两位长度的后缀01/02/03
--additional-suffix=string:为每个小文件追加额外的后缀,例如加上".log"。有些老版本不支持该选项,在CentOS 7.2上已支持。

INPUT:指定待切分的输入文件,如要切分标准输入,则使用"-"
PREFIX:指定小文件的前缀,如果未指定,则默认为"x"

比方,将/etc/fstab按行切分,每伍行切分1回,并点名小文件的前缀为”fs_”,后缀为数值后缀,且后缀长度为二。

[root@xuexi ~]# split -l 5 -d -a 2 /etc/fstab fs_

[root@xuexi ~]# ls
fs_00  fs_01  fs_02

翻看任一小文件。

[root@xuexi ~]# cat fs_01
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0
UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0

能够将那几个切分后的小文件再度构建还原。比如,将方面包车型的士八个小文件还原为~/fstab.bak。

[root@xuexi ~]# cat fs_0[0-2] >~/fstab.bak

大张旗鼓后,它们的内容是完全1致的。能够使用md5sum相比较。

[root@xuexi ~]# md5sum /etc/fstab ~/fstab.bak
29b94c500f484040a675cb4ef81c87bf  /etc/fstab
29b94c500f484040a675cb4ef81c87bf  /root/fstab.bak

还足以将行业内部输入的数码开展切分,并分别写入到小文件中。举个例子:

[root@xuexi ~]# seq 1 2 15 | split -l 3 -d - new_

[root@xuexi ~]# ls new*
new_00  new_01  new_02

可认为各样小文件追加额外的后缀。某些老版本的split不匡助该选用,而是在csplit上帮助的,但是新本子的split已经支撑。举例,加上”.log”。

[root@xuexi ~]# seq 1 2 20 | split -l 3 -d -a 3 --additional-suffix=".log" - new1_

[root@xuexi ~]# ls new1*
new1_000.log  new1_001.log  new1_002.log  new1_003.log

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@xuexi ~]# 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

假使每一个SESportageVE奥迪Q3-n表示多个段落,于是要安份守己段落切分该公文,使用以下语句:

[root@xuexi ~]# csplit -f test_  -b %04d.log test.txt /SERVER/ {*}
0
140
139
140

 “-f test_” 钦定小文件前缀为”test_”, “-b %0四d.log” 钦点文件后缀格式”00xx.log”,它自动为各样小文件追加额外的后缀”.log”, “/SESportageVELacrosse/” 表示卓殊的格局,每相称到1回,就生成三个小文件,且匹配到的行是该小文件中的内容, “{*}” 表示特别匹配前叁个方式即/SE奥迪Q伍VEQX56/直到文件结尾,若是不知底{*}或钦赐为{壹},将协作2遍得逞后就不再相配。

[root@xuexi ~]# ls test_*
test_0000.log  test_0001.log  test_0002.log  test_0003.log

下边包车型客车文件中即便唯有八个段子:SEPRADOVE奥迪Q5-1,SESportageVE奥迪Q3-2,SEENVISIONVE奥德赛-3,但切分的结果生成了五个小文件,并且注意到第3个小文件大小为0字节。为何会那样?因为在形式相称的时候,每相配到一行,这一行就当作下3个小文件的早先行。由于此文件首先行”SE汉兰达VECRUISER-1″就被/SELANDVE路虎极光/相称到了,因而那壹行是作为下二个小文件的剧情,在此小文件从前还自动生成一个空文件。

变动的空文件能够利用”-z”选项来删除。

[root@xuexi ~]# csplit -f test1_ -z -b %04d.log test.txt /SERVER/ {*}
140
139
140

还是能够钦命只拷贝相称到的行偏移数量。举个例子,相称到行时,只拷贝它背后的1行(包含它本人共两行),但剩余的就要放入下贰个小文件中。

[root@xuexi ~]# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*}
42
139
140
98

首先个小文件只有两行。

[root@xuexi ~]# cat test2_0000.log 
SERVER-1
[connection] 192.168.0.1 success

SE奥迪Q五VE凯雷德-1段落的任何内容放入到了第贰个小文件中。

[root@xuexi ~]# 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@xuexi ~]# 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@xuexi ~]# csplit -q -f test3_ -z -b %04d.log test.txt /SERVER/+2 {*}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图