Linux で diff3 ツールを使用して 3 つのファイルを比較する方法
以前のチュートリアルの 1 つで、2 つのファイルを 1 行ずつ比較できる Linux コマンド ライン ユーティリティ (diff と呼ばれる) について説明しました。しかし、要件が 2 つではなく 3 つのファイルを比較することである場合はどうなるでしょうか?はい、これ用の Linux コマンド ライン ユーティリティも存在しており、それは適切にdiff3 と呼ばれています。
このようなツールを探していたなら、もう探す必要はありません。このチュートリアルでは、diff3 の使い方をわかりやすい例で説明します。
diff3 をインストールする
diff3 ツールはシステムにデフォルトでインストールされる可能性が高く、少なくとも Ubuntu ではインストールされます。ただし、そうでない場合でも、GNU Diffutils パッケージをインストールすることで簡単に実行できるため、心配する必要はありません。パッケージをダウンロードしてシステムにインストールする方法については、ここを参照してください。
Diff3 の使用法
diff3 ユーティリティは 3 つのファイルを比較するため、使用例では、入力としてツールに渡す 3 つのファイルを取得する必要があります。
ファイル1は次のとおりです。
This is line1 with some change
This is line2
This is line3
ファイル2は次のとおりです。
This is line1
This is line2
This is line3
そして、これがファイル 3 です:
This is line1
This is line2
This is line3
これら 3 つのファイルの内容を見ると、最初のファイルの最初の行だけが変更されていることがわかります。それでは、diff3 がこの変更をどのように報告するかを見てみましょう。
この場合に diff3 を使用する方法は次のとおりです。
diff3 file1 file2 file3
そして、生成される出力は次のとおりです。
====1
1:1c
This is line1 with some change
2:1c
3:1c
This is line1
出力は次の方法で理解できます。
- 4 つの「=」記号で始まり、数字「1」で終わる最初の行は、変更が最初のファイルにあることを示しています。
- 次の行の最初の「1」は file1 を意味します。コロンの後の「1c」は「最初の行に次が含まれていることを意味します」。実際の行は出力の次の行に表示されます。
- 同様に、2:1c と 3:1c は、「file2 と file3 の最初の行に含まれる」を意味します。また、行の内容は両方のファイルで同じであるため、実際の行は出力の最後に 1 回だけ表示されます。
状況をより明確にするために、変更が file3 にある別のケースを考えてみましょう。
ファイル1は次のとおりです。
This is line1
This is line2
This is line3
ファイル2は次のとおりです。
This is line1
This is line2
This is line3
そして、これがファイル 3 です:
This is line1 with some change
This is line2
This is line3
コマンドは同じままです。
diff3 file1 file2 file3
そして出力は次のとおりです。
====3
1:1c
2:1c
This is line1
3:1c
This is line1 with some change
したがって、この場合の出力は次のように理解できます。
- 変更はfile3にあります
- file1 と file2 の両方に、最初の行として「This is line1」が含まれています。
- file3 には、最初の行として「これは line1 にいくつかの変更が加えられています」が含まれています。
以上が diff3 レポートの行単位での変化についての説明でした。ここで、ファイルの 1 つに余分な行が含まれている場合に diff3 がどのように動作するかを見てみましょう。
file1 と file2 は同じですが、file3 は次のとおりです。
This is line1
This is line2
This is line3
This is line4
その内容から明らかなように、file3 には最後に余分な行が含まれています。
同じ diff3 コマンドを実行してみましょう。
diff3 file1 file2 file3
コマンドが生成する出力は次のとおりです。
====3
1:3a
2:3a
3:4c
This is line4
出力は、変更が file3 にあるということから始まります。変更は file3 の 4 行目 (3:4c) にあり、file1 および file2 と比較するとまったく新しい行です。
これまで説明したのは、いくつかの簡単なケースでした。少し複雑な状況をいくつか考えてみましょう。たとえば、file1、file2、および file3 には次の内容が含まれていると考えてください。
This is line1
This is line2 with some change
This is line3
This is line1
This is line2
This is line3
This is line1
This is line2
This is line3 with some change
したがって、file1 と file2 の両方に変更が含まれており、それも異なる行に含まれています。この場合に diff3 が何を生成するかを見てみましょう。
====
1:2,3c
This is line2 with some change
This is line3
2:2,3c
This is line2
This is line3
3:2,3c
This is line2
This is line3 with some change
上記の出力からわかるように、最初の行には数値が含まれていません。これは、1 つではなく複数のファイルに変更が含まれているためです。 diff3 の場合、3 つのファイルすべての行 2 と行 3 が異なります。これが、出力にコロン (:) の後の単一の数値の代わりに範囲「2,3」が含まれるようになった理由です。これは 2 行目から 3 行目を意味します。
もう一つ例を挙げてみましょう。今回は、3 つのファイルに次の情報が含まれているとします。
This is line1
This is line2
This is line3
This is line4
This is line1
This is line2
This is line3
This is line1
This is line2
This is line3
This is line4
This is line5
ここで diff コマンドを実行すると、次の出力が生成されます。
====
1:4c
This is line4
2:3a
3:4,5c
This is line4
This is line5
ここで、理解しようとすると、 diff3 コマンドは、変更が 3 つのファイルすべての 3 行目以降にあることを示しています。 file1 には 4 行目に「This is line4」という行が含まれていますが、file3 には 4 行目と 5 行目にそれぞれ「This is line4」と「This is line5」が含まれています。一方、file2 には 3 行しかありません。
以上、diff3 の基本的な作業についての説明でした。公式ドキュメントには、このツールについて次のように書かれています。「diff3
コマンドを使用して、3 つのファイル間の違いを表示できます。 diff3
は、共通のオリジナルに独立した変更を加えた場合、オリジナルと 2 つの変更されたバージョンの違いを報告し、両方の変更を含むマージされたファイルを生成できます。競合に関する警告。".
結論
ここではほんの表面をなぞっただけですが、Diff3 ではさらに多くのことができます。たとえば、公式ドキュメントでも指摘されているように、これを使用して変更をマージすることもできます。さらに、コマンドの出力をカスタマイズしたり、コマンドが提供する他の機能にアクセスしたりできるコマンド ライン オプションが多数あります。 man ページにすべてが記載されているので、目を通してください。 sdiff コマンドのチュートリアルもご覧ください。