LINUX教学:Linux dd、split、csplit命令

LINUX教学:Linux dd、split、csplit命令,第1张

概述介绍《LINUX教学:Linux dd、split、csplit命令》开发教程,希望对您有用。

《liNUX教学:linux dd、split、csplit命令》要点:
本文介绍了liNUX教学:linux 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(1byte)、w(2bytes)、b(512bytes)、kB(1000bytes)、K(1024bytes)、MB(1000)、M(1024)和GB、G等几种单元.因此,不要随意在单元后加上字母B.

假设现有文件CentOS.iso的大小1.3G,必要将其切分后还原,切分的第一个小文件大小为500M.

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

生成第二个小文件,由于第二个小文件不知道具体大小,所以不指定count选项.由于第二个小文件要从第500M处开始切分,于是必要忽略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值,它们是完全一样的.

shell> md5sum CentOS_m.iso CentOS.iso504dbef14aed9b5990461f85d9fdc667  CentOS_m.iso504dbef14aed9b5990461f85d9fdc667  CentOS.iso

那么seek选项呢?和skip有什么区别?skip选项是忽略读取时的前N个数据块,而seek是忽略写入文件的前N个数据块.假如要写入的文件为a.log,则seek=2时,将从a.log的第3个数据块开始追加数据,如果a.log文件自己大小就不足2个数据块,则缺少的部分自动使用/dev/zero填充.

于是,在有了CentOS1.iso的基础上,要将其还原为和CentOS.iso相同的文件,可以使用下面的办法:

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

还原后,它们的md5值也是雷同的.

shell> md5sum CentOS1.iso CentOS.iso504dbef14aed9b5990461f85d9fdc667  CentOS1.iso504dbef14aed9b5990461f85d9fdc667  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按行切分,每5行切分一次,并指定小文件的前缀为"fs_",后缀为数值后缀,且后缀长度为2.

[root@linuxIDc ~]# split -l 5 -d -a 2 /etc/fstab fs_[root@linuxIDc ~]# lsfs_00  fs_01  fs_02

查看任一小文件.

[root@linuxIDc ~]# 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 0UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0

可以将这些切分后的小文件重新组装还原.例如,将上面的三个小文件还原为~/fstab.bak.

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

还原后,它们的内容是完全一致的.可以使用md5sum比拟.

[root@linuxIDc ~]# md5sum /etc/fstab ~/fstab.bak29b94c500f484040a675cb4ef81c87bf  /etc/fstab29b94c500f484040a675cb4ef81c87bf  /root/fstab.bak

还可以将尺度输入的数据进行切分,并分别写入到小文件中.例如:

[root@linuxIDc ~]# seq 1 2 15 | split -l 3 -d - new_[root@linuxIDc ~]# ls new*new_00  new_01  new_02

可以为每个小文件追加额外的后缀.有些老版本的split不支持该选项,而是在csplit上支持的,然则新版本的split已经支持.例如,加上".log".

[root@linuxIDc ~]# seq 1 2 20 | split -l 3 -d -a 3 --additional-suffix=".log" - new1_[root@linuxIDc ~]# 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@linuxIDc ~]# cat test.txtSERVER-1[connection] 192.168.0.1 success[connection] 192.168.0.2 Failed[disconnect] 192.168.0.3 pending[connection] 192.168.0.4 successSERVER-2[connection] 192.168.0.1 Failed[connection] 192.168.0.2 Failed[disconnect] 192.168.0.3 success[CONNECTION] 192.168.0.4 pendingSERVER-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/ {*}0140139140

 "-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/ {*}140139140

还可以指定只拷贝匹配到的行偏移数量.例如,匹配到行时,只拷贝它后面的1行(包含它自身共两行),但多余的行将放入下一个小文件中.

[root@linuxIDc ~]# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*}4213914098

第一个小文件只有两行.

[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 successSERVER-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 {*}

本文永远更新链接地址

内存溢出PHP培训学院每天发布《liNUX教学:linux dd、split、csplit命令》等实战技能,PHP、MysqL、liNUX、APP、Js,CSS全面培养人才。

总结

以上是内存溢出为你收集整理的LINUX教学:Linux dd、split、csplit命令全部内容,希望文章能够帮你解决LINUX教学:Linux dd、split、csplit命令所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1042206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存