概要
2つのファイルの差分を表示するdiffコマンドですが、オプションによって様々な形式で表示するがことできます。
オプションがなかなか覚えられず、diffコマンドを使用する際にいつも調べ直してしまうので、記事にまとめて知識を整理しておこうと思います。
この記事で取り扱う表示形式
- オプションなしの形式
-
-u
オプションを使用した形式(ユニファイド形式) -
-y
オプションを使用した形式
今回比較する2ファイル
以下のbefore.txt
(元のファイル)とafter.txt
(編集後のファイル)を比較してみたいと思います。
before only
not changed
changed
after only
not changed
changed!!!!!
オプションなしの場合
オプションなしでdiffコマンドを使用した場合の出力は以下のようになります。
diff before.txt after.txt
1d0
< before only
2a2
> after only
4c4
< changed
---
> changed!!!!!
ここでd
は削除(delete)、a
は追加(add)、c
は変更(change)を表しています。
つまり
1d0
: 元のファイルの1行目が削除された
2a2
: 新しいファイルの2行目に追加された
4c4
: 4行目が変更された
という情報が示されており、各変更内容(あるいは削除・追記内容)がその下に書かれています。慣れないと難しいですね。
-uオプションを使用した場合
-u
を使用した出力形式はユニファイド形式と呼ばれます。
diff -u before.txt after.txt
--- before.txt 2024-08-01 20:00:00
+++ after.txt 2024-08-01 20:05:30
@@ -1,4 +1,4 @@
-before only
+after only
not changed
-changed
+changed!!!!!
最初の2行は比較したファイルの名前と更新日時が表示されます。
その次の@@
から始まる行は、比較したそれぞれのファイルの変更開始行と何行分の変更表示をしているかを示しています。
今回のケースだと、両ファイルともに1行目から4行分の変更表示をしていることを表します。
その次の行からが変更内容の詳細です。
-
が書かれている行は削除された行、+
が書かれている行は追加された行を表しています。
この@@
から始まる行からその変更詳細までの単位のことを「ハンク」と呼びます。
今回はハンクが1つだけしか表示されていませんが、もう少し長いファイルなどで試してみるとハンクが複数表示されます。
各ハンクには変更行だけでなく、変更の前後何行かも併せて表示されています。
そのため、ユニファイド形式は似たような変更箇所が多い場合に、ファイルのどの部分が変更されたのかを確認しやすいという特長があります。
-yオプションを使用した場合
個人的には一番使いやすい表示形式です。
比較結果を1行ごとに出力してくれます。
diff -y before.txt after.txt
before only <
> after only
not changed not changed
changed | changed!!!!!
各行の結果が1行ごとに表示されており、
<
: 左のファイルにのみ存在
>
: 右のファイルにのみ存在
|
: 内容不一致
を表しています。
(上記の3種類が表示されていない行は一致を表します。)
1行ごとに表示してくれるので、以下のように左のファイルにのみ存在する内容を抜き出す操作などに便利です。
diff -y before.txt after.txt | grep '<' | cut -f 1
before only
まとめ
今回はdiffコマンドの3種類の表示形式についてまとめてみました。
diffコマンドには他にも様々なオプションがあるので、興味のある方はman diff
コマンド等で確認してみてください!