Linuxターミナルで2つのテキストファイルを比較する方法

  • diffコマンドは2つのファイルを比較し、変更、削除、追加を含む違いを表示するために使用されます。
  • diffコマンドの出力には、行番号とラベルが含まれており、変更の種類(変更、削除、追加)を示します。
  • diffコマンドには、ファイルの違いに関する簡潔な文の表示、左右の比較、空白と大文字小文字の無視、違いの背景の提供など、さまざまなオプションがあります。

テキストファイルの2つのリビジョンの違いを見る必要がありますか?その場合はdiffが必要なコマンドです。diffをLinuxとmacOSで簡単に使用する方法は次のとおりです。

diffコマンドとは何ですか?

diffコマンドは2つのファイルを比較し、2つの違いのリストを生成します。より正確には、2番目のファイルと一致するように1番目のファイルに加える必要がある変更のリストを生成します。それを念頭に置けば、diffの出力は理解しやすくなります。diffコマンドは、ソースコードファイルの違いを検出し、patchコマンドなどの他のプログラムで読み取って実行できる出力を生成するために設計されました。このチュートリアルでは、diffを使用する最も役立つ人間に優しい方法を見ていきます。

diffコマンドを使用する方法

すぐに2つのファイルを分析してみましょう。コマンドライン上のファイルの順序によって、diffがどのファイルを「1番目のファイル」と見なし、どのファイルを「2番目のファイル」と見なすかが決まります。以下の例では、alpha1が1番目のファイルであり、alpha2が2番目のファイルです。どちらのファイルにも音声記号が含まれていますが、2番目のファイルであるalpha2はさらに編集されているため、2つのファイルは同一ではありません。

このコマンドでファイルを比較できます。diff、スペース、1番目のファイルの名前、スペース、2番目のファイルの名前と入力し、Enterキーを押します。

diff alpha1 alpha2

その出力を分析するにはどうすればよいでしょうか?探すべきものがわかれば、それほど難しくありません。各違いは1列に順番にリストされ、各違いにはラベルが付けられます。ラベルには4c4のように文字の両側に数字が含まれます。最初の数字はalpha1の行番号であり、2番目の数字はalpha2の行番号です。真ん中の文字は次のとおりです。

  • c:1番目のファイルの行は、2番目のファイルの行と一致するように変更する必要があります。
  • d:2番目のファイルと一致するように、1番目のファイルの行を削除する必要があります。
  • a:2番目のファイルと一致するように、1番目のファイルに余分なコンテンツを追加する必要があります。

この例では4c4は、alpha1の4行目をalpha2の4行目と一致するように変更する必要があることを示しています。これは、diffが見つけた2つのファイルの最初の違いです。

<で始まる行は1番目のファイル(この例ではalpha1)を参照し、>で始まる行は2番目のファイル(alpha2)を参照します。行< Deltaは、Deltaという単語がalpha1の4行目のコンテンツであることを示しています。行> Daveは、Daveという単語がalpha2の4行目のコンテンツであることを示しています。つまり、両方のファイルでその行を一致させるには、alpha1の4行目でDeltaをDaveに置き換える必要があります。

次の変更は12c12で示されます。同じロジックを適用すると、alpha1の12行目にLimaという単語が含まれているが、alpha2の12行目にLinuxという単語が含まれていることがわかります。

3番目の変更は、alpha2から削除された行を参照します。ラベル21d20は、「20行目から両方のファイルを同期させるには、1番目のファイルから21行目を削除する必要がある」と解読されます。< Uniform行は、alpha1から削除する必要がある行のコンテンツを示しています。

4番目の違いは26a26,28というラベルが付いています。この変更は、alpha2に追加された3つの余分な行を参照します。ラベルの26,28に注意してください。コンマで区切られた2つの行番号は、行番号の範囲を表します。この例では、範囲は26行目から28行目です。ラベルは、「1番目のファイルの26行目に、2番目のファイルの26行目から28行目を追加する」と解釈されます。alpha1に追加する必要があるalpha2の3行が表示されます。これらには、Quirk、Strange、Charmという単語が含まれています。

diffを使用した便利な単一行コマンド

2つのファイルが同じかどうかを知りたいだけの場合は、-s(同一のファイルを報告)オプションを使用してください。

diff -s alpha1 alpha3

-q(簡潔)オプションを使用して、2つのファイルが異なることについて同様に簡潔な文を取得できます。

diff -q alpha1 alpha2

注意すべきことの1つは、2つのファイルが同一の場合、-q(簡潔)オプションは完全にクラムアップして何も報告しないということです。

diffの別のビュー

-y(左右)オプションは、ファイルの違いを記述するために異なるレイアウトを使用します。表示される列の数を制限するために、左右のビューで-W(幅)オプションを使用することがよくあります。これにより、出力を理解しにくくする醜い折り返し行を回避できます。ここでは、diffに左右の表示を生成し、出力を70列に制限するように指示しました。

diff -y -W 70 alpha1 alpha2

コマンドラインの最初のファイルであるalpha1は左側に表示され、コマンドラインの2番目の行であるalpha2は右側に表示されます。各ファイルの行が左右に表示されます。alpha2で変更、削除、または追加された行の横にインジケータ文字があります。

  • |:2番目のファイルで変更された行。
  • <:2番目のファイルから削除された行。
  • >:1番目のファイルにない2番目のファイルに追加された行。

ファイルの違いをよりコンパクトに左右でまとめたものがよければ、--suppress-common-linesオプションを使用してください。これにより、diffは変更された行、追加された行、または削除された行のみをリストすることが強制されます。

diff -y -W 70 --suppress-common-lines alpha1 alpha2

diff出力に色を付ける

colordiffと呼ばれる別のユーティリティは、diff出力に色のハイライトを追加します。これにより、どの行に違いがあるかがはるかにわかりやすくなります。

Ubuntuまたは他のDebianベースのディストリビューションを使用している場合は、apt-getを使用してこのパッケージをシステムにインストールします。他のLinuxディストリビューションでは、代わりにLinuxディストリビューションのパッケージ管理ツールを使用します。

sudo apt-get install colordiff

diffを使用するのと同じようにcolordiffを使用します。

実際、colordiffdiffのラッパーであり、diffは舞台裏ですべての作業を行います。そのため、すべてのdiffオプションはcolordiffで機能します。

コンテキストを提供する

ファイル内のすべての行を画面に表示したり、変更された行のみをリストしたりするの中間に位置するものを見つけるには、diffにコンテキストを提供するように依頼できます。これを行う方法は2つあります。どちらの方法も同じ目的を達成します。それは、変更された各行の前後にいくつかの行を表示することです。ファイル内で違いが検出された場所で何が起こっているかを確認できます。

最初の方法は-c(コピーされたコンテキスト)オプションを使用します。

colordiff -c alpha1 alpha2

diff出力にはヘッダーがあります。ヘッダーには、2つのファイル名とその変更時刻がリストされます。最初のファイル名の前にアスタリスク(*)があり、2番目のファイル名の前にダッシュ(-)があります。アスタリスクとダッシュを使用して、出力内の行がどのファイルに属するかを示します。

中央に1,7があるアスタリスクの行は、alpha1の行を見ていることを示しています。正確には、1行から7行を見ています。Deltaという単語は変更されたものとしてフラグが付けられています。その横には感嘆符()があり、赤色になっています。その行の前後に3行の変更されていないテキストが表示されているので、ファイル内のその行のコンテキストを確認できます。

中央に1,7があるダッシュの行は、alpha2の行を見ていることを示しています。繰り返しますが、1行から7行を見ており、4行目のDaveという単語が異なるものとしてフラグが付けられています。

各変更の上下3行のコンテキストがデフォルト値です。diffに提供するコンテキストの行数を指定できます。これを行うには、大文字の「C」で-C(コピーされたコンテキスト)オプションを使用し、必要な行数を指定します。

colordiff -C 2 alpha1 alpha2

コンテキストを提供する2番目のdiffオプションは-u(統一されたコンテキスト)オプションです。

colordiff -u alpha1 alpha2

以前と同様に、出力にはヘッダーがあります。2つのファイルが名前付けられ、変更時刻が表示されます。alpha1の名前の前にダッシュ(-)があり、alpha2の名前の前にプラス記号(+)があります。これにより、ダッシュはalpha1を参照するために使用され、プラス記号はalpha2を参照するために使用されることがわかります。リスト全体にアットマーク(@)で始まる行が散らばっています。これらの行は、各違いの始まりを示しています。また、各ファイルからどの行が表示されているかを示しています。

変更された行としてフラグが付けられた行の前後3行が表示されているため、変更された行のコンテキストを確認できます。統一されたビューでは、違いのある行が上下に表示されます。alpha1からの行にはダッシュが、alpha2からの行にはプラス記号が付けられています。この表示は、8行でコピーされたコンテキスト表示が15行で行ったことを達成します。

予想どおり、diffに表示したい統一されたコンテキストの行数を正確に指定するように依頼できます。これを行うには、大文字の「U」で-U(統一されたコンテキスト)オプションを使用し、必要な行数を指定します。

colordiff -U 2 alpha1 alpha2

空白と大文字小文字を無視する

別の2つのファイル、test4とtest5を分析してみましょう。これらにはスーパーヒーローの名前が6つ含まれています。

colordiff -y -W 70 test4 test5

結果は、diffがブラックウィドウ、スパイダーマン、トールの行に違いを見つけないことを示しています。キャプテンアメリカ、アイアンマン、ハルクの行で変更をフラグ付けします。

何が違うのでしょうか?さて、test5ではハルクは「h」の小文字で綴られており、キャプテンアメリカは「キャプテン」と「アメリカ」の間に余分なスペースがあります。わかりました。それは一目瞭然ですが、アイアンマンの行には何が問題でしょうか?目に見える違いはありません。これが良い経験則です。見えない場合は、答えは空白です。その行の最後に、迷子のスペースが1つまたは2つ、またはタブ文字がほとんど確実にあります。

それが重要でない場合は、diffに次のような特定の種類の行の違いを無視するように指示できます。

  • -i:大文字小文字の違いを無視します。
  • -Z:末尾の空白を無視します。
  • -b:空白の量の変更を無視します。
  • -w:すべての空白の変更を無視します。

diffにそれらの2つのファイルをもう一度チェックするように依頼してみましょう。ただし、今回は大文字小文字の違いをすべて無視します。

colordiff -i -y -W 70 test4 test5

「ハルク」と「ハルク」の行は一致すると見なされ、小文字の「h」には違いがフラグ付けされません。diffに末尾の空白も無視するように依頼してみましょう。

colordiff -i -Z -y -W 70 test4 test5

予想通り、diffがその行の違いをフラグ付けしなくなったため、末尾の空白はアイアンマンの行の違いであったに違いありません。キャプテンアメリカが残っています。diffに大文字小文字を無視し、すべての空白の問題を無視するように依頼してみましょう。

colordiff -i -w -y -W 70 test4 test5

diffに気にならない違いを無視するように指示することで、diffは目的のためにファイルが一致することを示しています。

diffコマンドにはさらに多くのオプションがありますが、そのほとんどは機械可読の出力の生成に関連しています。これらはLinuxのマニュアルページで確認できます。上記の例で使用したオプションにより、コマンドラインと人間の目で、テキストファイルのバージョン間のすべての違いを追跡できるようになります。