毎日1つのlinuxコマンド:diffコマンド

17513 ワード

diffコマンドはlinux上で非常に重要なツールであり、ファイルの内容、特に2つのバージョンの異なるファイルを比較して変更箇所を見つけるために使用されます.diffは、コマンドラインに各ラインの変更を印刷します.最新バージョンのdiffでは、バイナリファイルもサポートされています.diffプログラムの出力はパッチ(patch)と呼ばれ、Linuxシステムにはもう一つのpatchプログラムがあり、diffの出力に基づいてa.cのファイル内容をb.cに更新することができるからである.diffはsvn、cvs、gitなどのバージョン管理ツールに欠かせない部分です.

1.コマンド形式:

diff[  ][  1   1][  2   2]

2.コマンド機能:


diffコマンドは、単一のファイルまたはディレクトリの内容を比較できます.比較するファイルを指定した場合は、テキストファイルとして入力した場合にのみ有効です.テキストファイルの異同箇所を行単位で比較します.比較がディレクトリであることを指定すると、diffコマンドは2つのディレクトリの下に同じ名前のテキストファイルを比較します.異なるバイナリ・ファイル、共通サブディレクトリ、および1つのディレクトリにのみ表示されるファイルをリストします.

3.コマンドパラメータ:


表示する行のテキストを指定します.このパラメータは、-cまたは-uパラメータとともに使用する必要があります.
  • -aまたは-text diffプリセットは、テキストファイルを行ごとに比較するだけです.
  • -bまたは-ignore-space-changeスペース文字の違いはチェックされません.
  • -Bまたは–ignore-blank-lines空白行はチェックされません.
  • -cは、すべてのテキストを表示し、異なる点を示します.
  • -Cまたは–contextは、実行"-c-"コマンドと同じです.
  • −dまたは−minimalは、異なる演算アルゴリズムを用いて、比較を小さい単位で行う.
  • -Dまたはifdefこのパラメータの出力フォーマットは、フロントプロセッサの巨大セットに使用できます.
  • -eまたは-edこのパラメータの出力フォーマットは、edのscriptファイルに使用できます.
  • -fまたは-forward-ed出力のフォーマットはedのscriptファイルに似ていますが、元のファイルの順序で異なる箇所が表示されます.
  • -Hまたは-speed-large-filesが大きなファイルの場合、高速化できます.
  • -lまたは–ignore-matching-lines 2つのファイルがいくつかの行で異なる場合、これらの行にオプションで指定された文字または文字列が同時に含まれている場合、これらのファイルの違いは表示されません.
  • -iまたは–ignore-caseでは、大文字と小文字の違いはチェックされません.
  • -lまたは-paginateは、結果をprプログラムによってページングする.
  • −nまたは−rcsは、比較結果をRCS形式で表示する.
  • -Nまたは–new-fileディレクトリを比較する場合、ファイルAがディレクトリにのみ表示される場合、プリセットには、Only inディレクトリ:ファイルAが-Nパラメータを使用すると、diffはファイルAを空白のファイルと比較します.
  • -p比較したファイルがC言語のプログラムコードファイルである場合、差異のある関数名が表示されます.
  • -Pまたは-unidirectional-new-fileは-Nと似ていますが、2番目のディレクトリに1番目のディレクトリにないファイルが含まれている場合にのみ、このファイルを空白のファイルと比較します.
  • -qまたは-briefには、差異の有無のみが表示され、詳細は表示されません.
  • -rまたは-recursiveは、サブディレクトリ内のファイルを比較します.
  • -sまたは-report-identical-files差異が見つからない場合は、情報が表示されます.
  • -Sまたは-starting-fileディレクトリの比較時に、指定したファイルから比較を開始します.
  • -tまたは–expand-tabs出力時にtab文字を展開します.
  • -Tまたは-initial-tab各行の前にtab文字を付けて位置合わせします.
  • -u,-Uまたは-unified=ファイルの内容の違いをマージして表示します.
  • -vまたは-versionにバージョン情報が表示されます.
  • -wまたは-ignore-all-spaceは、すべてのスペース文字を無視します.
  • -Wまたは-width-yパラメータを使用する場合は、バー幅を指定します.
  • -xまたは–excludeは、オプションで指定したファイルまたはディレクトリを比較しません.
  • -Xまたは–exclude-fromファイルまたはディレクトリタイプをテキストファイルとして保存し、=で指定できます.
  • -yまたは-side-by-sideは、ファイルの異同点を並列に表示します.
  • –helpにヘルプが表示されます.
  • –left-column-yパラメータを使用する場合、2つのファイルのいずれかの行の内容が同じであれば、左側の欄にのみその行の内容が表示されます.
  • –suppress-common-lines-yパラメータを使用すると、違いのみが表示されます.

  • 4.使用例:


    例1:2つのファイルコマンドを比較します.
    diff log2014.log log2013.log

    出力:
    [root@localhost test3]# diff log2014.log log2013.log 
    3c3
    < 2014-03
    ---
    
    > 2013-03
    8c8
    < 2013-07
    ---
    > 2013-08
    11,12d10
    < 2013-11
    < 2013-12

    説明:
    上の「3 c 3」と「8 c 8」はlog 2014を表す.logとlog 20143 logファイルは3行目と8行目で内容が異なる.」11,12 d 10」は、第1のファイルが第2のファイルよりも11行目と12行目多いことを示す.
    diffのnormal表示フォーマットには、a-add c-change d-deleteの3つのヒントがあります.
    例2:並列形式出力コマンド:
    diff log2013.log log2014.log  -y -W 50

    出力:
    [root@localhost test3]# diff log2014.log log2013.log  -y -W 50
    2013-01                 2013-01
    2013-02                 2013-02
    2014-03               | 2013-03
    2013-04                 2013-04
    2013-05                 2013-05
    2013-06                 2013-06
    2013-07                 2013-07
    2013-07               | 2013-08
    2013-09                 2013-09
    2013-10                 2013-10
    2013-11               <
    2013-12               <
    [root@localhost test3]# diff log2013.log log2014.log  -y -W 50
    2013-01                 2013-01
    2013-02                 2013-02
    2013-03               | 2014-03
    2013-04                 2013-04
    2013-05                 2013-05
    2013-06                 2013-06
    2013-07                 2013-07
    2013-08               | 2013-07
    2013-09                 2013-09
    2013-10                 2013-10
                          > 2013-11
                          > 2013-12

    説明:
    「|」は前後の2つのファイルの内容が異なることを示します「>」は、後のファイルが前のファイルより1行多いことを示します.
    例3:コンテキスト出力フォーマットコマンド:
    diff log2013.log log2014.log  -c

    出力:
    [root@localhost test3]# diff log2013.log log2014.log  -c
    *** log2013.log 2012-12-07 16:36:26.000000000 +0800
    --- log2014.log 2012-12-07 18:01:54.000000000 +0800
    ***************
    *** 1,10 ****
      2013-01
      2013-02
    ! 2013-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-08
      2013-09
      2013-10
    --- 1,12 ----
      2013-01
      2013-02
    ! 2014-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-07
      2013-09
      2013-10
    + 2013-11
    + 2013-12[root@localhost test3]# diff log2014.log log2013.log  -c
    *** log2014.log 2012-12-07 18:01:54.000000000 +0800
    --- log2013.log 2012-12-07 16:36:26.000000000 +0800
    ***************
    *** 1,12 ****
      2013-01
      2013-02
    ! 2014-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-07
      2013-09
      2013-10
    - 2013-11
    - 2013-12
    --- 1,10 ----
      2013-01
      2013-02
    ! 2013-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-08
      2013-09
      2013-10[root@localhost test3]#

    説明:
    この方式は最初の2行で比較ファイルの説明をして、ここで3中の特殊な文字があります:“+”の比較するファイルの後者は前より1行多い“-”の比較するファイルの後者は前より1行少ないです!”比較されたファイルの行の違い
    例4:統合フォーマット出力コマンド:
    diff log2014.log log2013.log  -u

    出力:
    [root@localhost test3]# diff log2014.log log2013.log  -u
    --- log2014.log 2012-12-07 18:01:54.000000000 +0800
    +++ log2013.log 2012-12-07 16:36:26.000000000 +0800
    @@ -1,12 +1,10 @@
     2013-01
     2013-02
    -2014-03
    +2013-03
     2013-04
     2013-05
     2013-06
     2013-07
    -2013-07
    +2013-08
     2013-09
     2013-10
    -2013-11
    -2013-12

    説明:
    その第1部は、ファイルの基本情報でもあります:—log 2014.log 2012-12-07 18:01:54.000000000 +0800 +++ log2013.log 2012-12-07 16:36:2600000000+0800"—"は変動前のファイルを表し、"++"は変動後のファイルを表す.第2部では,変動する位置を2つの@で先頭と終了とする.@@@-1,12+1,10@@の前の"-1,12"は3つの部分に分かれている.マイナス記号は最初のファイル(すなわちlog 2014.log)を表し、「1」は1行目を表し、「12」は12行連続を表す.合わせて、次は最初のファイルが1行目から12行連続であることを示します.同様に、"+1,10"は変動後、2番目のファイルが1行目から10行連続となることを示す.
    例5:フォルダの異なるコマンドを比較するには:
    diff  test3 test6

    出力:
    [root@localhost test]# diff test3 test6
    Only in test6: linklog.log
    Only in test6: log2012.log
    diff test3/log2013.log test6/log2013.log
    1,10c1,3
    < 2013-01
    < 2013-02
    < 2013-03
    < 2013-04
    < 2013-05
    < 2013-06
    < 2013-07
    < 2013-08
    < 2013-09
    < 2013-10
    ---
    > hostnamebaidu=baidu.com
    > hostnamesina=sina.com
    > hostnames=true
    diff test3/log2014.log test6/log2014.log
    1,12d0
    < 2013-01
    < 2013-02
    < 2014-03
    < 2013-04
    < 2013-05
    < 2013-06
    < 2013-07
    < 2013-07
    < 2013-09
    < 2013-10
    < 2013-11
    < 2013-12
    Only in test6: log2015.log
    Only in test6: log2016.log
    Only in test6: log2017.log
    [root@localhost test]# 

    説明:
    例6:2つのファイルの違いを比較し、パッチコマンドを生成します.
    diff -ruN log2013.log log2014.log >patch.log

    出力:
    [root@localhost test3]# diff -ruN log2013.log log2014.log >patch.log
    [root@localhost test3]# ll
       12
    -rw-r--r-- 2 root root  80 12-07 16:36 log2013.log
    -rw-r--r-- 1 root root  96 12-07 18:01 log2014.log
    -rw-r--r-- 1 root root 248 12-07 21:33 patch.log
    [root@localhost test3]# cat patc.log
    cat: patc.log:          
    [root@localhost test3]# cat patch.log 
    --- log2013.log 2012-12-07 16:36:26.000000000 +0800
    +++ log2014.log 2012-12-07 18:01:54.000000000 +0800
    @@ -1,10 +1,12 @@
     2013-01
     2013-02
    -2013-03
    +2014-03
     2013-04
     2013-05
     2013-06
     2013-07
    -2013-08
    +2013-07
     2013-09
     2013-10
    +2013-11
    +2013-12[root@localhost test3]#

    説明:
    例7:パッチ適用コマンド:
    出力:
    [root@localhost test3]# cat log2013.log
    2013-01
    2013-02
    2013-03
    2013-04
    2013-05
    2013-06
    2013-07
    2013-08
    2013-09
    2013-10[root@localhost test3]# patch log2013.log patch.log 
    patching file log2013.log
    [root@localhost test3]# 
    [root@localhost test3]# cat log2013.log 
    2013-01
    2013-02
    2014-03
    2013-04
    2013-05
    2013-06
    2013-07
    2013-07
    2013-09
    2013-10
    2013-11
    2013-12[root@localhost test3]#

    説明: