diffコマンド出力フォーマット解読


diffコマンド出力フォーマット解読
1.diffコマンドの使い方diffコマンドは、2つのファイル(またはフォルダ)の違いを比較できます.コマンドの使用方法は、次のとおりです.
diff [  ]       ( )       ( )

フォルダの比較であれば、【-r】オプションを追加する必要があります.他の多くのオプションについては、自分で資料を調べることができますが、ここでは省略します.
2.diffの3種類の出力フォーマット
歴史的な理由からdiffには3つのフォーマットがあります.
  • 通常フォーマット
  • コンテキストフォーマット(context diff)、-cオプション
  • を追加する必要があります.
  • 統合フォーマット(unified diff)は、-uオプション
  • を追加する必要があります.
    説明を容易にするために、まず2つのテキストファイルを作成します.ファイル名はそれぞれf 1(変更前)とf 2(変更後)です.f 1の内容は:
    a
    a
    a
    a

    f 2の内容は、
    a
    a
    b
    c
    d

    2.1一般形式
    コマンドライン入力
    $ diff f1 f2

    得られた結果は
    3,4c3,5
    < a
    < a ---
    > b
    > c
    > c

    上の出力は4つの部分に分かれています.
    2.1.1 3,4c3,5は、変動位置を説明するために使用される.
    また、3つの部分に分かれています.1.前の3,4は、f 1の3~4行目を示す.2.中間のcは変動を示すパターンがコンテンツ変更(change)であり、他のパターンはa(増加、addition)とd(削除、deletion)である.3.後の3,5はf 2の3~5行目を示す.
    2.1.2 f1で削除するロー
    < a
    < a

    前の小さい番号は、f 1から行を除去することを示し、後の「a」は行の内容を示す.
    2.1.3分割線
    ---

    f 1とf 2を分割するための変動状況.
    2.1.4 f2で追加するロー
    > b
    > c
    > c

    前の大きい符号はf 2が行を追加したことを示し、後の「b」または「c」は行の内容を表す.
    2.2コンテキストフォーマット
    使用方法は、-cオプション(contextを表す)を追加することです.
    diff -c f1 f2

    出力結果は以下の通りです.
    *** f1 2016-04-17 11:48:13.008810500 +0800
    --- f2 2016-04-17 11:48:24.090444400 +0800
    ***************
    *** 1,4 ****
      a
      a
    ! a
    ! a
    --- 1,5 ----
      a
      a
    ! b
    ! c
    ! c

    上記の出力結果は4つの部分に分かれています.
    2.2.1ファイル名と時間情報
    *** f1  2016-04-17 11:48:13.008810500 +0800
    --- f2  2016-04-17 11:48:24.090444400 +0800

    特に注意:***は変動前の文書、---は変動後の文書を表す.
    2.2.2分割線
    ***************

    2.2.3変更前の文書f1
    *** 1,4 ****
      a
      a
    ! a
    ! a
    *** 1,4 ****は、変動前のファイル(すなわちf 1)の1~4行目を示す.また、ファイル内容の各行の先頭には、1つのタグビットがある.空であれば、その行に変化がないことを示す.(!)であれば、その行に変更があることを示す.マイナス記号(-)であれば、その行が削除されたことを示す.プラス記号(+)であれば、その行為が新たに追加されたことを示す.
    2.2.4変更後の文書f2
    --- 1,5 ----
      a
      a
    ! b
    ! c
    ! c
    --- 1,5 ----は、変動後の文書(すなわちf 2)の1~5行目を示す.その他は前述の通りである.
    2.3連結フォーマット
    2つのファイルの類似度が高い場合、コンテキストフォーマットのdiffは、重複するコンテンツを大量に表示し、スペースを浪費します.1990年、GNU diffは「統合フォーマット」のdiffを率先して発売し、f 1とf 2のコンテキストを統合して表示した.その使用方法は-uオプション(unifiedを表す)を追加することです.
    コマンドの入力
    $ diff -u f1 f2

    出力結果は
    --- f1 2016-04-17 11:48:13.008810500 +0800
    +++ f2 2016-04-17 11:48:24.090444400 +0800
    @@ -1,4 +1,5 @@
     a
     a
    -a
    -a
    +b
    +c
    +c

    上の結果は3つの部分に分かれています.
    2.3.1ファイル名と時間情報
    --- f1  2016-04-17 11:48:13.008810500 +0800
    +++ f2  2016-04-17 11:48:24.090444400 +0800
    ---は変動前の文書、+++は変動後の文書を表す.
    2.3.2変動位置@@ -1,4 +1,5 @@が変動する位置は、2つのグループ@@の間に配置される.-1,4は、変動前のファイルについて、1行目(1行目を含む)から4行連続(すなわち1,2,3,4行)を示し、+1,5は、変動後のファイルについて、1行目(1行目を含む)から5行連続(すなわち1,2,3,4,5行)を示す.
    2.3.3変動の具体的な内容
     a
     a
    -a
    -a
    +b
    +c
    +c

    2つのファイルのコンテキストを結合して表示するので、「結合フォーマット」と呼ばれます.各行の一番前のフラグビットは、空は変動なし、マイナスは最初のファイルが削除された行、プラスは2番目のファイルが追加された行、または最初のファイルに基づいて追加された行を表します.
    ファイルを変更するのは、車を改造するのと同じで、部品の一部(-)を取り外して部品の一部(+)を取り付ける過程と見ることができます.下図は行番号とファイルの対応関係を説明しています.
    【end】
    参考資料
    チェン一峰:diffが読めます