こんにちは、インフラエンジニアの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コマンドの表示形式を見やすく、ファイル比較を楽にするためのオプションについて紹介しました。
記事内にも記載しておりますが、diffコマンドについて詳しく調べるまでは、業務でリモートサーバ上のファイルを比較するとなると毎回ローカルPC上に持ってきてWinMergeを使っておりました。
特に-y
のオプションはWinMergeに似た出力となり直感的に変更点がわかりやすいということから、今や-y
オプションに頼りきりです。笑
diffコマンドを使いこなして、“楽” にファイル比較をしましょう。
というわけで、diffコマンドのオプション紹介でした。
参考文献
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
https://rakus.hubspotpagebuilder.com/visit_engineer/rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com