《LINUX教學:Linux dd、split、csplit命令》要點:
本文介紹了LINUX教學:Linux dd、split、csplit命令,希望對您有用。如果有疑問,可以聯系我們。
在Linux最常用的文件生成和切片工具是dd,它功能比擬全面,但無法以行為單位提取文件數據,也無法直接將文件按大小或行數進行均分(除非借助循環).另兩款數據分割工具split和csplit能夠比擬輕松地實現這些需求.csplit是split的升級版.
從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
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 ~]# ls fs_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 0 UUID=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.bak 29b94c500f484040a675cb4ef81c87bf /etc/fstab 29b94c500f484040a675cb4ef81c87bf /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
?
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.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表示一個段落,于是要依照段落切分該文件,使用以下語句:
[root@linuxidc ~]# 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},將匹配一次成功后就不再匹配.
[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/ {*} 140 139 140
還可以指定只拷貝匹配到的行偏移數量.例如,匹配到行時,只拷貝它后面的1行(包含它自身共兩行),但多余的行將放入下一個小文件中.
[root@linuxidc ~]# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*} 42 139 140 98
第一個小文件只有兩行.
[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 success SERVER-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全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8847.html