Linux diff出力結果の解釈2つの方法

本投稿では、Linuxコマンドdiff出力結果を解釈する方法について詳しく説明します。Linuxのdiffコマンドは、2つのファイルやディレクトリの違いを比較し、その結果を出力する便利なツールです。しかし、diffコマンドの基本的な出力形式は、初めて使う人にはやや複雑に見えることがあります。

基本出力形式

diffコマンドの基本出力は、2つのファイル間の違いを示す非常に簡潔な形式です。出力は次のような形式で表示されます:

<行番号><操作タイプ><行番号>
< 前の行
---
> 後の行
Plaintext

それでは、それぞれの部分を詳しく見ていきましょう。

<行番号><操作タイプ><行番号>: 変更箇所と操作タイプ

diffコマンドは、比較結果で変更された行の位置と操作タイプを最初に表示します。以下の3つの操作タイプがあります:

  • a: 追加 (add)
  • d: 削除 (delete)
  • c: 変更 (change)

各操作タイプは、特定の形式で表示されます:

  • <n1>a<n2>: ファイル1のn1番目の行の後に、ファイル2のn2番目の行が追加されたことを意味します。たとえば、2a3はファイル1の2番目の行の後に、ファイル2の3番目の行が追加されたことを意味します。
  • <n1>d<n2>: ファイル1のn1番目の行が、ファイル2のn2番目の行の次に削除されたことを意味します。たとえば、3d2はファイル1の3番目の行が、ファイル2の2番目の行の次に削除されたことを意味します。
  • <n1>c<n2>: ファイル1のn1番目の行が、ファイル2のn2番目の行に変更されたことを意味します。たとえば、3c3はファイル1の3番目の行がファイル2の3番目の行に変更されたことを意味します。

<>: 行の比較結果

diffの出力で <> 記号は、それぞれファイル1とファイル2の内容を示します。

  • <: ファイル1にのみ存在する行を表示します。
  • >: ファイル2にのみ存在する行を表示します。

diff出力結果の解釈例

以下は、2つのファイルを比較したdiffコマンドの出力結果を解釈する例です。

例のファイル

file1.txt:

Hello World
This is a file.
Let's compare.
Plaintext

file2.txt:

Hello World
This is another file.
Let's compare this.
Plaintext

基本的なdiffコマンドの出力

diff file1.txt file2.txt
ShellScript

出力:

図1. diff出力結果
図1. diff出力結果

出力の解釈

最初の行に表示される 2,3c2,3 とその後の出力結果は次の通りです。

  • 2,3c2,3 は、ファイル1の2番目と3番目の行が、ファイル2の2番目と3番目の行に変更されたことを意味します。
  • < This is a file. はファイル1の2番目の行です。
  • < Let's compare. はファイル1の3番目の行です。
  • > This is another file. はファイル2の2番目の行が変更された内容です。
  • > Let's compare this. はファイル2の3番目の行が変更された内容です。

この例を通じて、diffはファイル1とファイル2の各行がどのように異なるかを明確に示します。

拡張された出力形式

diffコマンドは、さまざまなオプションを使用して出力形式を拡張することができます。-c(コンテキスト)および-u(統一形式)オプションを使用すると、さらに多くの情報を含む比較結果を得ることができます。

-cオプション: コンテキスト出力

-cオプションを使用すると、前後のコンテキストを確認できます。どの位置で変化が生じたのかを簡単に確認することができます。

diff -c file1.txt file2.txt
ShellScript

以下の図では、「1,3」と表示されている部分は、1~3行を意味します。

図2. diff出力結果: 前後コンテキスト付き出力
図2. diff出力結果: 前後コンテキスト付き出力

-uオプション: 統一形式出力

-uオプションを使用すると、全体的な変更点を一目で把握できるようになります。

diff -u file1.txt file2.txt
ShellScript

以下の図では、1~3行で「-」と表示されたfile1.txtの内容と「+」と表示されたfile2.txtの内容を通じて、異なる部分を一目で確認できます。バージョン管理ツールで使用されるスタイルで確認できます。

図3. diff出力結果: 統一形式での比較出力
図3. diff出力結果: 統一形式での比較出力

統一形式出力の解釈

  • --- file1.txt+++ file2.txt は、それぞれのファイル名と比較時点のタイムスタンプを表示します。
  • @@ -1,3 +1,3 @@ は、比較するブロックの位置を示しています。
  • -1,3 はファイル1の1番目の行から3行を比較したことを意味します。
  • +1,3 はファイル2の1番目の行から3行を比較したことを意味します。
  • -で始まる行は、ファイル1に存在するがファイル2では削除された行を示しています。
  • +で始まる行は、ファイル2に新しく追加された行を示しています。

追加の例: 削除と追加

次は、削除と追加の例として、file3.txtfile4.txtの内容を以下に示します。

file3.txt:

Line 1
Line 2
Line 4
Plaintext

file4.txt:

Line 1
Line 3
Line 4
Line 5
Plaintext

以下のようにdiffコマンドで比較します。

diff file3.txt file4.txt
ShellScript

出力:

図4. diff出力結果: 削除と追加の比較
図4. diff出力結果: 削除と追加の比較

基本的な比較出力の解釈

  • 2c2 は、ファイル3の2番目の行「Line 2」が、ファイル4の2番目の行「Line 3」に変更されたことを意味します。
  • 3a4 は、ファイル3の3番目の行の後に、ファイル4の4番目の行「Line 5」が追加されたことを意味します。

-uオプションを利用した出力の解釈

-uオプションを使用すると、状況を簡潔に把握することができます。

diff -u file3.txt file4.txt
ShellScript

以下の図のように、file3.txtの「Line 2」が削除され、file4.txtの「Line 3」が追加されたことがわかります。また、最後にfile4.txtの「Line 5」が追加されたことが確認できます。

図5. diff出力結果: -uオプションを使用して削除と追加を確認
図5. diff出力結果: -uオプションを使用して削除と追加を確認

まとめ

diffコマンドは、Linuxでファイルやディレクトリの違いを比較する際に非常に便利なツールです。基本的なdiff出力形式を理解することは重要で、これにより2つのファイル間の変更点を明確に把握することができます。さらに、-c-uオプションを使用すると、より直感的で読みやすい出力を得ることができます。

ファイル間の変更点を追跡し管理することは、コードレビュー、設定ファイルの管理、ドキュメント変更管理など、さまざまな場面で重要です。diff出力形式をよく理解し活用することで、これらの作業をより効率的かつ体系的に行うことができるでしょう。

リファレンス

関連ポスト

コメントする