dd、split、csplit命令



本文目录:

1.1 dd命令

1.2 split命令

1.3 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.iso
504dbef14aed9b5990461f85d9fdc667  CentOS_m.iso
504dbef14aed9b5990461f85d9fdc667  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.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按行切分,每5行切分一次,并指定小文件的前缀为"fs_",后缀为数值后缀,且后缀长度为2。

[[email protected] ~]# split -l 5 -d -a 2 /etc/fstab fs_

[[email protected] ~]# ls
fs_00  fs_01  fs_02

查看任一小文件。

[[email protected] ~]# 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。

[[email protected] ~]# cat fs_0[0-2] >~/fstab.bak

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

[[email protected] ~]# md5sum /etc/fstab ~/fstab.bak
29b94c500f484040a675cb4ef81c87bf  /etc/fstab
29b94c500f484040a675cb4ef81c87bf  /root/fstab.bak

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

[[email protected] ~]# seq 1 2 15 | split -l 3 -d - new_

[[email protected] ~]# ls new*
new_00  new_01  new_02

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

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

[[email protected] ~]# 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此前一个模式匹配。
{*}             :表示一直匹配到文件结尾才停止匹配。

假设文件内容如下:

[[email protected] ~]# 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

假设每个SERVER-n表示一个段落,于是要按照段落切分该文件,使用以下语句:

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

"-f test_" 指定小文件前缀为"test_", "-b %04d.log" 指定文件后缀格式"00xx.log",它自动为每个小文件追加额外的后缀".log", "/SERVER/" 表示匹配的模式,每匹配到一次,就生成一个小文件,且匹配到的行是该小文件中的内容, "{*}" 表示无限匹配前一个模式即/SERVER/直到文件结尾,假如不知道{*}或指定为{1},将匹配一次成功后就不再匹配。

[[email protected] ~]# 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"选项来删除。

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

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

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

第一个小文件只有两行。

[[email protected] ~]# cat test2_0000.log
SERVER-1
[connection] 192.168.0.1 success

SERVER-1段落的其余内容放入到了第二个小文件中。

[[email protected] ~]# 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

同理第三个小文件也一样,直到最后一个小文件中存放剩余所有无法匹配的内容。

[[email protected] ~]# cat test2_0003.log
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed

指定"-s"或"-q"选项以静默模式运行,将不会输出小文件的大小信息。

[[email protected] ~]# csplit -q -f test3_ -z -b %04d.log test.txt /SERVER/+2 {*}

回到系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/7454671.html

注:若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!

时间: 08-28

dd、split、csplit命令的相关文章

Linux下dd和od命令备份查看硬盘mbr,并用vim修改!

主引导记录(Master Boot Record,MBR),位于一个硬盘的0柱面.0盘面.1扇区,共512字节.具体划分依次为:引导代码区440字节.磁盘签名4字节.空白(Ox0000)2字节.MBR分区表(Disk Partition Table,DPT)64字节.结束标志(Ox55AA)2字节.其中的MBR分区表(DPT)区别于另一种“全局唯一标识分区表(GUID Partition Table,GPT)”.本文今天仅讨论MBR及DPT. 废话不多说了,下面先介绍如何备份.恢复MBR及DPT

特殊符号、管道符命令:cut、sort、uniq、wc、tee、tr、split等命令

特殊符号 *任意个任意字符 ?任意一个字符 #注释字符 \脱义字符 |管道符 $变量前缀, !$组合,正则里面表示行尾 :多条命令写到一行,用分号分隔 ~用户家目录,后面正则表达式中表示匹配符 &放到命令后面,会把命令丢到后台 > >> 2> 2>> &>:输出重定向.追加重定向.错误输出重定向.错误追加重定向.不区分重定向: []方括号表示指定字符中的一个,[0-9],[a-zA-Z],[abc]: ||和&& 判断语句,用于命令

mac os x 下查看dd命令刻录U盘的进度

dd命令在Linux操作系统上运行,我们使用"killall -USR1 dd"命令即显示当前dd命令刻录的进度,但在OS X上面执行此命令,可能会导致dd进程中止: 维基百科对dd命令的介绍说:"向运行中的dd进程发送SIGINFO信号(Linux上为USR1)可以使它将I/O统计信息打印到标准错误一次,然后继续复制(注意在OS X上,信号可能导致进程终止)." 重点是SIGINFP信号,Linux上为使用"killall -USR1 dd"向

linux命令dd

原文链接: http://blog.csdn.net/adaptiver/article/details/6672592 dd 使用dd这个linux命令可以创建一定大小文件. linux创建文件命令:dd命令把指定的输入文件拷贝到指定的输出文件中,并且在拷贝的过程中可以进行格式转换.语法:CODE:[Copy to clipboard]dd [选项]QUOTE:if =输入文件(或设备名称).of =输出文件(或设备名称).ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数.

磁盘,fdisk分区,MBR,dd命令

光盘和磁盘.u盘.软盘.硬盘有什么区别 ①光盘: cdrom/dvdrom:光驱(光盘驱动器)    rom:只读    ram:可以擦写    cd:700M    dvd:4G ②软盘:floppy:软驱(软盘驱动器)③U盘:U盘,全称USB闪存盘,英文名“USB flash disk”.使用USB接口的无需物理驱动器的微型高容量移动存储产品,通过USB接口与电脑连接,实现即插即用.④磁盘:计算机的外部存储器中也采用了类似磁带的装置,比较常用的一种叫磁盘,将圆形的磁性盘片装在一个方的密封盒子

Linux文件和目录管理常用命令(下)

dd 命令 描述:dd命令用于复制文件并对原文件的内容进行转换和格式化处理.dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果.用的比较多的还是用dd来备份裸设备.但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便. 建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便.另外,使用dd对磁盘操作时,最好使用块设备文件. 语法:dd

高效Linux用户需要了解的命令行技能

摘自:1.http://www.lingcc.com/2013/03/22/12282/ 内容:1.基本命令: 了解基本的bash,通读整个bash man page 学习vim 了解SSH,基本的无密码验证方式:   熟悉Bash中常用的任务管理命令 &,Ctrl-Z,Ctrl-C,jobs,fg,bg,kill 等.  基本的文件管理命令 ls, ls-l, less, head, tail, tail -f, ln, ln -s, chmod, chown, du, du -sk *, d

linux上的常见命令掌握

http://coolshell.cn/articles/8883.html 这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?>—— Linux用户有哪些应该知道的提高效率的技巧.我觉得挺好的,总结得比较好,把其转过来,并加了一些自己的理解. 首先,我想告诉大家,在Unix/Linux下,最有效率技巧的不是操作图形界面,而是命令行操作,因为命令行意味着自动化.如果你看过<

linux常用命令技巧

原文地址 这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?>-- Linux用户有哪些应该知道的提高效率的技巧.我觉得挺好的,总结得比较好,把其转过来,并加了一些自己的理解. 首先,我想告诉大家,在Unix/Linux下,最有效率技巧的不是操作图形界面,而是命令行操作,因为命令行意味着自动化.如果你看过<你可能不知道的Shell>以及<28个Unix/Linu