天天看點

【一天一個shell指令】文本操作系列-dd

   近來找工作,面試頻繁。 很多公司對shell感興趣,很久沒用了,最近有在玩perl和python這些東西,總弄混,決定每天抽些時間回顧一下。

    今天第一天寫,先說下寫shell腳本的基本知識

1. shell腳本以.sh 為擴充名,通常運作 ./${filename}.sh 或者 sh ${filename}.sh

2. shell 腳本開頭以 #!/bin/bash #!讀作 “shebang”

3. 開啟調試  #!/bin/bash –xv

4. /dev/null 任何東西丢進去都會消失,linux黑洞。 /dev/zero 用于初始化,會産生0

今天先介紹 dd 指令

由來(全稱):本來應根據其功能描述“Convert an copy”命名為“cc”,但“cc”已經被用以代表“CComplier”,是以命名為“dd”

開篇例子:

1.  dd if=infile.log  of=outfile.log bs=1M count=1

  拷貝 infile.log内容 到 outfile.log. 一次讀寫比特數為1M , 每次讀寫一個塊(1M,由bs決定)

2.  echo -n "hello world" | dd cbs=1 conv=unblock 2>/dev/null

  主要示範cbs,每次轉換一個位元組, conv=unblock 是将cbs 大小的塊中尾部的空格替換為一個換行符  2> 是錯誤資訊輸出流  /dev/null 開頭介紹了

解讀help:

(不願意看這麼一大段,嘗試先跳過,看解讀)

用法:dd [操作數] ... 

或:dd 選項 

複制檔案,依照操作數轉換并格式化。

  bs=比特數    一次讀寫的比特數 

  cbs=比特數    一次轉換的比特數 

  conv=CONVS    依照每個逗号分割的标志清單轉換檔案 

  count=塊數    隻将指定個塊數複制到塊 

  ibs=比特數    一次讀取的比特數(預設:512) 

  if=檔案    從指定檔案中讀取 

  iflag=符号    按照以逗号分隔的符号清單指定的方式讀取 

  obs=比特數    一次寫入指定比特數(預設:512) 

  of=檔案    寫入到指定檔案 

  oflag=符号    按照以逗号分隔的符号清單指定的方式寫入 

  seek=塊數    在輸出開始處跳過指定的塊數 

  skip=塊數    在輸入開始處跳過指定的塊數 

  status=noxfer    禁止傳輸統計

塊和位元組數後可能帶有以下的一個或多個字尾: 

c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M 

GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.

每個 CONV 符号可能為:

  ascii        由EBCDIC 碼轉換至ASCII 碼 

  ebcdic    由ASCII 碼轉換至EBCDIC 碼 

  ibm        由ASCII 碼轉換至替換的EBCDIC 碼 

  block        将結束字元塊裡的換行替換成等長的空格 

  unblock    将cbs 大小的塊中尾部的空格替換為一個換行符 

  lcase        将大寫字元轉換為小寫 

  ucase        将小寫字元轉換為大寫 

  swab        交換每一對輸入資料位元組 

  sync        将每個輸入資料塊以NUL 字元填滿至ibs 的大小;當配合block 

        或unblock 時,會以空格代替NUL 字元填充 

  excl        fail if the output file already exists 

  nocreat    do not create the output file 

  notrunc    不截斷輸出檔案 

  noerror    讀取資料發生錯誤後仍然繼續 

  fdatasync    結束前将輸出檔案資料寫入磁盤 

  fsync    類似上面,但是中繼資料也一同寫入

FLAG 符号可以是:

  append    追加模式(僅對輸出有意義;隐含了conv=notrunc) 

  direct    使用直接I/O 存取模式 

  directory    除非是目錄,否則 directory 失敗 

  dsync        使用同步I/O 存取模式 

  sync        與上者類似,但同時也對中繼資料生效 

  fullblock    為輸入積累完整塊(僅iflag) 

  nonblock    使用無阻塞I/O 存取模式 

  noatime    不更新存取時間 

  nocache    丢棄緩存資料 

  noctty    不根據檔案指派控制終端 

  nofollow    不跟随連結檔案

解讀:

1. bs ibs obs  cbs

bs: 一次 讀寫 = ibs+obs

ibs: 一次讀

obs: 一次寫

cbs: 一次轉換 

2. if of

if 是讀取的檔案

of 是輸出的檔案 

3. seek skip

skip 在從if中讀取時  跳過多少比特

seek 在寫入of時, 跳過多少比特

實戰例子:

1. 批量生成随機名稱的測試檔案

for i in {10..10}   

do   

dd if=/dev/zero of=junk.test$i bs="$RANDOM"K count=20   

done 

2. 備份和恢複

備份

dd if=abc.gz of=abc.gz.bak1 bs=1k count=10000   

dd if=abc.gz of=abc.gz.bak2 bs=1k skip=10000 count=70000   

dd if=abc.gz of=abc.gz.bak3 bs=1k skip=80000 

恢複方法如下: 

dd if=abc.gz.bak1 of=abc.gz   

dd if=abc.gz.bak2 of=abc.gz bs=1k seek=10000   

dd if=abc.gz.bak3 of=abc.gz bs=1k seek=80000 

3. 轉換大小寫

生成大寫:dd if=dd.txt of=my.log bs=1M count=1 conv=ucase

生成小寫:為了不懶惰,留給讀者試試

4. 拷貝自己  

file_subscript=copy   

dd if=$0 of=$0.$file_subscript 2>/dev/null 

<a href="http://down.51cto.com/data/2361118" target="_blank">附件:http://down.51cto.com/data/2361118</a>

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/yjplxq/947090,如需轉載請自行聯系原作者