RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【diff コマンド】オプションを駆使してファイル比較を楽にする

こんにちは、インフラエンジニアのfro-rivです。

業務でよく使う機会がある(私はよくある)diffコマンドですが、調べてみると知らなかったオプションがたくさん…
diff ${file1} ${file2}の通り、簡単に使えるが故に今までちゃんと調べたことはありませんでした。

今回は、そんなdiffコマンドの表示オプションを中心に紹介できればと思いますので、よろしければご覧ください。

diffコマンドとは

diffコマンドは、2つのファイルを比較して違い(差分)を出力するコマンドです。
またリダイレクトを使えば、コマンド実行結果などの文字列比較も行うことができます。
以下、例

###ファイル比較(基本)
$ diff file1.txt file2.txt
1c1
< test
---
> tests

###リダイレクトしたコマンド実行結果(文字列)を比較
$ diff <(echo 'test') <(echo 'tests')
1c1
< test
---
> tests

よく使うオプション

diffコマンドでよく使うオプションのご紹介です。
私は今回調べるまで、patchファイルを作るときに-uを使ったりするくらいでしたが、便利なオプションがたくさんありました。

オプション 説明
-c context形式で差分を表示
!(変更点)や+(追加), -(削除)で表示される
-u unified形式で差分を表示
変更点は+, -で表示される
-y
--side-by-side
横並びで差分を表示
|(変更点)や<(削除), >(追加)で表示される
-q
--brief
差分があれば、差分がある旨メッセージを出力
※差分は出ない
※差分がなければ出力もなし
-s 差分があれば、差分を出力
無ければ、差分がない旨メッセージを出力
-b 空白の差分は無視
-i
--ignore-case
大文字小文字の区別をしない
--suppress-common-lines 共通行を表示しない
※-yオプションと併用で効果あり
-W
--width=${NUM}
表示幅を指定する
※-yオプションと併用で効果あり
(デフォルト: 130カラム)
--color 色付きで差分表示する
※diffutils3.4以上で有効

diffコマンドのオプションで変わる表示形式

よく使うdiffコマンドのオプションの違いでどのように表示形式が変わるのか、いくつか実際にご紹介したいと思います。
比較するファイルは下のものを使用します。

test1.txtファイルに手を加えtest2.txtを作成しましたので、
それぞれ説明の際は、test1.txt変更前test2.txt変更後とさせていただきます。

# cat test1.txt
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
やゆよ
らりるれろ
わをん
アイウエオ
# cat test2.txt
あいうゑお
かきくケこ
さしすせそ
たちつてと
ららららら
なにぬねの
はひふへほ
まみむめも
やゆよよよ
らりるれろ
わをん

ちなみに、オプションなしでdiffコマンドを使って比較するとこんな出力となります。
この文量なら何とかなりますが、差分がもっと増えると、正直何が何だか分かりにくい…

# diff test1.txt test2.txt
1,2c1,2
< あいうえお
< かきくけこ
---
> あいうゑお
> かきくケこ
4a5
> ららららら
8c9
< やゆよ
---
> やゆよよよ
11d11
< アイウエオ
#

-uオプション:unified形式

まずは、unified形式です。
---の部分は変更前のファイルを、+++は変更後のファイルを表しており、

  • 変更後に存在しない行は-
  • 変更後にのみ存在する行は+

が行頭についてます。
こちらのオプションは見やすさで選ぶというよりも、patchを当てたりするため、使うことが多い気がします。

# diff -u test1.txt test2.txt
--- test1.txt   2022-08-22 18:23:54.717925300 +0900
+++ test2.txt   2022-08-23 09:18:48.147925300 +0900
@@ -1,11 +1,11 @@
-あいうえお
-かきくけこ
+あいうゑお
+かきくケこ
 さしすせそ
 たちつてと
+ららららら
 なにぬねの
 はひふへほ
 まみむめも
-やゆよ
+やゆよよよ
 らりるれろ
 わをん
-アイウエオ
#

-cオプション:context形式

次に、context形式です。
***の部分は変更前のファイルを、---は変更後のファイルを表しており、

  • 変更のあった行は!
  • 変更後に存在しない行は-
  • 変更後にのみ存在する行は+

行頭についています。
こちらのオプションも、一目で見てわかるという感じではありませんね。

# diff -c test1.txt test2.txt
*** test1.txt   2022-08-22 18:23:54.717925300 +0900
--- test2.txt   2022-08-23 09:18:48.147925300 +0900
***************
*** 1,11 ****
! あいうえお
! かきくけこ
  さしすせそ
  たちつてと
  なにぬねの
  はひふへほ
  まみむめも
! やゆよ
  らりるれろ
  わをん
- アイウエオ
--- 1,11 ----
! あいうゑお
! かきくケこ
  さしすせそ
  たちつてと
+ ららららら
  なにぬねの
  はひふへほ
  まみむめも
! やゆよよよ
  らりるれろ
  わをん
#

-yオプション:side by side形式

次に、side by side(横並び)形式です。
非常に見やすい(直感的にわかりやすい)表示となっており、すべての比較で使いやすいとまでは言いませんが
私が一番頻繁に使用するdiffコマンドのオプションになります。(オススメ!)

左側に変更前・右側に変更後のファイルが表示されており、変更行があれば真ん中に記号がつきます。

  • 変更のあった行は|
  • 変更後に存在しない行は<
  • 変更後にのみ存在する行は>

が表示されます。
以下の様に、直感的にわかりやすい表示となっております。
(ご覧の端末の幅によってはコマンド結果がきれいに表示できていないかもしれませんが、ご了承ください)

# diff -y test1.txt test2.txt
あいうえお                                                    | あいうゑお
かきくけこ                                                    | かきくケこ
さしすせそ                                                      さしすせそ
たちつてと                                                      たちつてと
                                                              > ららららら
なにぬねの                                                      なにぬねの
はひふへほ                                                      はひふへほ
まみむめも                                                      まみむめも
やゆよ                                                        | やゆよよよ
らりるれろ                                                      らりるれろ
わをん                                                          わをん
アイウエオ                                                    <
#

-yオプションを知らなかった時は、
diffコマンドが見づらいのでリモートサーバからわざわざローカルPCに比較ファイル持ってきてWinMerge
使っていました。
-yオプションにはさらに見やすくなるオプションもありますので、以下にてご紹介させていただきます。

--suppress-common-lines(共通行非表示)と組み合わせる

diff -yコマンドに--suppress-common-linesオプションを加えると、差異のある行のみを表示してくれます。
通常共通行も表示され、それはそれで便利なこともあるのですが、--suppress-common-linesオプションを使うことで
簡潔に表示させることができます。

# diff -y --suppress-common-lines test1.txt test2.txt
あいうえお                                                    | あいうゑお
かきくけこ                                                    | かきくケこ
                                                              > ららららら
やゆよ                                                        | やゆよよよ
アイウエオ                                                    <
#

-W(表示幅指定)と組み合わせる

例で使っているような各行の文字数が少ない場合、または多い場合diff -yだけでは少し見づらいこともあります。
そんな時には-W ${カラム数}(デフォルト:130カラム)オプションをつけることで表示幅を変更することもできます。
今回比較に使用しているファイルは各行の文字数が少ないので、30カラムを指定してみます。

# diff -y -W 30 test1.txt test2.txt
あいうえお    | あいうゑお
かきくけこ    | かきくケこ
さしすせそ      さしすせそ
たちつてと      たちつてと
              > ららららら
なにぬねの      なにぬねの
はひふへほ      はひふへほ
まみむめも      まみむめも
やゆよ        | やゆよよよ
らりるれろ      らりるれろ
わをん          わをん
アイウエオ    <
#

これでかなり見やすくなりました。
さらに、1つ前に紹介した--suppress-common-linesを組み合わせると、差異のある行のみをさらに見やすく表示できます。

# diff -y -W 30 --suppress-common-lines test1.txt test2.txt
あいうえお    | あいうゑお
かきくけこ    | かきくケこ
              > ららららら
やゆよ        | やゆよよよ
アイウエオ    <
#

ちなみに、1行当たりの文字数が多いと、途中で切れてしまうので-W 170など広めに設定すれば見やすくなります。
(ご覧の端末の幅によってはコマンド結果がきれいに表示できていないかもしれませんが、ご了承ください)

###デフォルトの130だと最後まで見れない
# diff -y file1.txt file2.txt
1234567891011121314151617181920212222324252627282930313233343 | 1234567891011121314151617181920212222324252627282930313233343
###幅を170にするとファイルの端の文字まで確認できる
# diff -y -W 170 file1.txt file2.txt
123456789101112131415161718192021222232425262728293031323334353637383940            |   123456789101112131415161718192021222232425262728293031323334353637383950
#

--colorオプション:色表示(番外編)

こちらはdiffコマンドのオプション番外編となりますが、diffutilsのバージョン3.4以降で使用できる色表示オプションになります。
CentOS7の公式リポジトリで提供されているdiffutilsは3.3系が最新でしたので使えませんが、CentOS8系からは使用できるかと思います。

こんな感じで、diffを色表示できるので視覚的に見やすいです。
※epelリポジトリにて、colordiffというパッケージも配布されているようですので、--colorオプションが使えない方は、
インストールしてみてください。

diff --color実行結果

最後に

今回は、diffコマンドの表示形式を見やすく、ファイル比較を楽にするためのオプションについて紹介しました。
記事内にも記載しておりますが、diffコマンドについて詳しく調べるまでは、業務でリモートサーバ上のファイルを比較するとなると毎回ローカルPC上に持ってきてWinMergeを使っておりました。
特に-yのオプションはWinMergeに似た出力となり直感的に変更点がわかりやすいということから、今や-yオプションに頼りきりです。笑

diffコマンドを使いこなして、“楽” にファイル比較をしましょう。
というわけで、diffコマンドのオプション紹介でした。

参考文献


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.