天天看点

【一天一个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,如需转载请自行联系原作者