第二十一章 創建任意大小的文件和分隔任意大小的文件:dd命令、split命令、csplit命令
dd命令
名詞解釋
dd命令用語復制文件,並對原文件的內容進行轉換和格式化處理。dd命令功能很強大對於一些比較底層的問題,使用dd命令往往可以得到出人意料的效果。用的比較多的還是用dd來備份裸設備。但是不推薦,如果需要備份oracle裸設備的,可以使用rman備份,或使用第三方軟件備份,使用dd的話,管理起來不太方便。
建議在有需要的時候使用dd對物理磁盤操作,如果是文件系統的話,還是使用tar backup cpio等其他命令更加方便。另外,使用dd對磁盤操作時,最好使用塊設備文件。
語法
dd(選項)
選項
bs=<字節數> :將ibs(輸入)與歐巴桑(輸出)設成指定的字節數。 cbs=<字節數> :轉換時,每次只轉換指定的字節數。 conv=<字節數>:指定文件轉換的方式。 count=<區塊數>:僅讀取指定的區塊數。 ibs=<字節數>:每次讀取的字節數。 obs=<字節數>:每次輸出的字節數。 of=<文件>:輸出到文件。 seek=<區塊數>:一開始輸出時,跳過指定的區塊數。 skip=<區塊數>:一開始讀取時,跳過指定的區塊數。 --help:幫助 --version:顯示版本信息
實例
[root@ceshi dd]# dd if=/dev/zero of=sun.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00395019 s, 265 MB/s
[root@ceshi dd]# du -sh sun.txt
1.0M sun.txt
該命令創建了一個1M大小的文件sun.txt,其中參數解釋:
- if 代表輸入文件。如果不指定if,默認就會從stdin中讀取輸入。
- of 代表輸出文件。如果不指定of,默認就會將stdout作為默認輸出。
- bs 代表字節為單位的塊大小。
- count 代表被賦值的塊數。
- /dev/zero 是一個字符設備,會不斷返回0值字節(\0)。
塊大小可以使用的計量單位表:
單元大小 | 代碼 |
---|---|
字節(1B) | c |
字節(2B) | w |
塊(512B) | b |
千字節(1024B) | k |
兆字節(1024KB) | M |
吉字節(1024MB) | G |
以上命令可以看出,可以使用dd命令來測試內存操作速度:
1048576 bytes (1.0 MB) copied, 0.00395019 s, 265 MB/s
split命令
名詞解釋
split命令可以將一個大文件分割成很多個小文件,有時需要將文件分割成更小的片段,比如:為提高可讀性,生成日誌等。
選項
-b:值為每一輸出檔案的大小,單位為byte 。
-C:每一輸出當中,單行的最大byte數。
-d:使用數字作為後綴。
-l:值為每一輸出檔的列數大小。
-a length:設定length指定輸出文件的後綴的長度
-a length split_file:設定split_file指定輸出文件名的前綴
實例
生成一個大小為100KB的測試文件
[root@ceshi split]# dd if=/dev/zero bs=100k count=1 of=date.file
1+0 records in
1+0 records out
102400 bytes (102 kB) copied, 0.000913943 s, 112 MB/s
使用split命令將上面創建的date.file文件分割成大小為10KB的小文件:
[root@ceshi split]# split -b 10k date.file
[root@ceshi split]# ls
date.file xaa xab xac xad xae xaf xag xah xai xaj
文件被分割成多個帶有字母的後綴文件,如果想用數字後綴使用-d;同時可以使用-a length來指定後綴的長度:
[root@ceshi split]# split -b 10k date.file -d -a 3
[root@ceshi split]# ls
date.file x000 x001 x002 x003 x004 x005 x006 x007 x008 x009 xaa xab xac xad xae xaf xag xah xai xaj
為分割後的文件指定文件名的前綴:
[root@ceshi split]# split -b 10k date.file -d -a 3 split_file
[root@ceshi split]# ls
date.file split_file002 split_file005 split_file008 x001 x004 x007 xaa xad xag xaj
split_file000 split_file003 split_file006 split_file009 x002 x005 x008 xab xae xah
split_file001 split_file004 split_file007 x000 x003 x006 x009 xac xaf xai
使用-l選項根據文件的行數來分割文件,例如把文件分割成每個文件包含10行的小文件:
split -l 10 date.file
csplit命令
名詞解釋
csplit命令 用於將一個大文件分割成小的碎片,並且將分割後的每個碎片保存成一個文件。碎片文件的命令類似“xx00、xx01”。csplit命令 是split的一個變體,split只能夠根據文件大小或行數來分割,但csplit能夠根據文件本身特點來分割文件。
語法
csplit(選項)(參數)
選項
- -b<輸出格式> 或 --suffix-format=<輸出格式> :預設的輸出 格式其文件名稱為xx00、xx01等,用戶可以通過改變<輸出格式>來改變輸出的文件名;
- -f<輸出字首字符串> 或 --prefix=<輸出字首字符串> :預設的輸出字首字符串其文件名為xx00、xx01等;如果指定輸出字首字符串為hello,則輸出文件名為hello00、hello01等。
- -k 或 --keep-files :保留文件,就算發生錯誤或中斷執行,也不能刪除已經輸出保存的文件。
- -n<輸出文件名位數> 或 --digits=<輸出文件名位數> :預設的輸出文件名位數,其文件名稱為xx00、xx01等;如果用戶指定輸出文件名位數為3,則輸出文件名為xx000、xx001等。
- -q 或 --quiet 或 --silent :不顯示指令執行過程。
- -z 或 --elide-empty-files :刪除長度為0 byte文件。
參數
文件:指定要分割的原文件。
模式:指定要分割文件時的匹配模式。
實例
測試文件內容server.log
[root@ceshi csplit]# cat server.log
SERVER-1
[con] 10.10.10.1 suc
[con] 10.10.10.2 fai
[dis] 10.10.10.3 pen
[con] 10.10.10.4 suc
SERVER-2
[con] 10.10.10.5 suc
[con] 10.10.10.6 fai
[dis] 10.10.10.7 pen
[con] 10.10.10.8 suc
SERVER-3
[con] 10.10.10.9 suc
[con] 10.10.10.10 fai
[dis] 10.10.10.11 pen
[con] 10.10.10.12 suc
需要將server.log分割成server1.log、server2.log、server3.log,這些文件的內容分別取自原文件中不同的SERVER部分:
[root@ceshi csplit]# csplit server.log /SERVER/ -n2 -s {*} -f server -b "%02d.log"; rm -rf server00.log
[root@ceshi csplit]# ls
server01.log server02.log server03.log server.log
命令詳細說明:
- /正則表達式/ :匹配文本樣式,如:/server/ ,從第一行到包含server的匹配行。
- {*} :表示根據匹配重復執行分割,知道文件末尾停止,使用{整數}代表分割執行的次數。
- -s :靜默模式,不打印其他信息。
- -n :指定分割後的文件名後綴的數字個數。如:01、02、03
- -f :指定分割後的文件名前綴。
- -b :指定後綴格式。如:%02d.log,類似於C語言中的printf參數格式。
- rm -rf server00.log :是刪除第一個文件,因為分割後的第一個文件沒有內容,匹配的單詞就位於文件的第一行中。
第二十一章 創建任意大小的文件和分隔任意大小的文件:dd命令、split命令、csplit命令