【1日1 shellコマンド】テキスト操作シリーズ-dd

6702 ワード

最近仕事を探して、面接が頻繁です.多くの会社は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
コピーlog内容はoutfile.log. 1回の読み書きビット数は1 Mであり、1つのブロックを読み書きするたびに(1 M、bsによって決定される)
2.  echo -n "hello world"| dd cbs=1 conv=unblock 2>/dev/null
主にcbsを実証し、1バイト変換するたびにconv=unblockはcbsサイズのブロックの末尾のスペースを改行文字2>に置き換えた.エラー情報出力ストリーム/dev/nullの冒頭に説明しました
解読help:
(こんな大きな部分は見たくないので、先にスキップして、解読してみてください)
使用法:dd[オペランド]...または:ddオプションでファイルをコピーし、オペランドに従って変換してフォーマットします.
bs=ビット数1回読み書きのビット数cbs=ビット数1回変換のビット数conv=CONVSカンマごとに分割されたフラグリスト変換ファイルcount=ブロック数指定されたブロック数のみをブロックibs=ビット数1回読み出しのビット数にコピーする(デフォルト:512)if=ファイル指定ファイルからiflag=シンボルを読み込むコンマで区切られたシンボルリストで指定された方法でobs=ビット数を読み込む指定ビット数を1回書き込みます(デフォルト: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、G=1024*1024*1024、and so on for T、P、E、Z、Yの1つ以上の接尾辞がある.
各CONV記号は次のようになります.
ascii EBCDICコードからASCIIコードebcdicに変換ASCIIコードからEBCDICコードibmに変換ASCIIコードから置換EBCDICコードblock終了文字ブロックの改行を等長スペースunblockに置き換えcbsサイズのブロックの末尾のスペースを改行文字lcaseに置き換える大文字を小文字ucaseに変換小文字を大文字swabに変換各入力データバイトsyncを交換各入力データブロックをibsのサイズにNUL文字で満たす.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.ランダム名のテストファイルを一括生成

  
  
  
  
  1. for i in {10..10}   
  2. do   
  3. dd if=/dev/zero of=junk.test$i bs="$RANDOM"K count=20   
  4. done 

2.バックアップとリカバリ
バックアップ

  
  
  
  
  1. dd if=abc.gz of=abc.gz.bak1 bs=1k count=10000   
  2. dd if=abc.gz of=abc.gz.bak2 bs=1k skip=10000 count=70000   
  3. dd if=abc.gz of=abc.gz.bak3 bs=1k skip=80000 

リカバリ方法は次のとおりです.

  
  
  
  
  1. dd if=abc.gz.bak1 of=abc.gz   
  2. dd if=abc.gz.bak2 of=abc.gz bs=1k seek=10000   
  3. 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.コピー

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