支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • 【Linux】diffコマンドの使い

【Linux】diffコマンドの使い方

diffコマンドは英語の「difference」を意味する、二つのファイルの違いを比較するコマンドです。diffコマンドは比較する対象となる二つのファイルを指定して実行することで、差分を結果と表示することが出来ます。今回はこのdiffコマンドの使い方について実際の実行結果を見ながら紹介していきたいと思います。

diffコマンドの基本的な使い方

diffコマンドの基本的な構文は以下の通りです。


diff [オプションコマンド] [ファイルa] [ファイルb]

とてもシンプルですが、これだけで差分を結果として出力することが出来ます。今回は、例としてこのようなサンプルファイルを用意しました。


#一つ目のファイル
$ cat sample1.dat
abcdefghi
jklmnopqr
stuvwxyz

#二つ目のファイル
$ cat sample2.dat
abcdefghi
jklmnopqr12
stuvwxyz

この二つのファイルを使って比較していきます。まずはオプションファイルを使用せずにそのまま実行した結果を表示してみましょう。


$ diff sample1.dat sample2.dat
2c2
< jklmnopqr
---
> jklmnopqr12

以上のような結果となっています。結果に「2c2」という表示があります。これはどう意味かというと「C」は「Change」を表しており変更がある、ということを示しています。そして、ファイルの内容が一つ目のファイルの「2行目」と二つ目のファイルの「2行目」が違っている、ということを表示しているのです。では複数の行で違う部分がある場合はどのように表示されるのでしょうか。先ほどの「sample1.dat」に変更を加え、そして複数行で違いのある「sample3.dat」というファイルを用意し、比較を行います。


$ cat sample1.dat
abcde
fghij
klmno
pqrst
uvwxyz

$ cat sample3.dat
abcde
fghij
klmno
uvwxyz
123456

この二つのファイルを比較するとこのような出力結果となります。


$ diff sample1.dat sample3.dat
4d3
< pqrst
5a5
> 123456

今度は「4d3」と「5a5」という出力結果となりました。「d」はdelete(削除)を意味しており、行が削除されていることを表しています。また、「a」はadd(追加)ですので、数字の行が追加されたことがわかりますね。

オプションコマンド

diffコマンドのオプションコマンドです。「○○形式」という項目については後程解説していきます。

-a

強制的にテキストファイルとみなした比較を行うことが出来ます。例えば、バイナリファイルと呼ばれるテキストファイルでないものも比較を行うことが可能です。

-b

スペース数の違いを無視して比較を行います。

-c

context形式で出力を行います。

-i

大文字・小文字の区別をせずに比較を行います。

-q

ファイルに差異があるかどうかの判別のみを行います。内容の出力は行いません。

-n

RCS形式で出力を行います。

-r

ディレクトリを比較する際には、階層下にあるサブディレクトリも含めて比較を行います。

-u

unified形式で出力を行います。

-s

指定した二つのファイルが同じである場合でも出力を行います。(デフォルトでは比較対象が同一のものであった場合、何も表示されません。)

-y

side-by-side形式で出力を行います。

diffコマンドの出力形式について

diffコマンドには様々な表示形式があります。オプションコマンドを指定することで表示形式を指定して実行することが可能です。

normal形式

デフォルトの表示形式です。なにもオプションコマンドを指定して実行すると、先程紹介したように差異のある部分のみを表示します。

context形式

オプション「-c」を指定することで、context形式で出力します。


$ diff -c sample1.dat sample3.dat

*** sample1.dat	2020-10-06 09:31:20.087532069 +0900
--- sample3.dat	2020-10-06 09:31:43.653389465 +0900
***************
*** 1,5 ****
! abcde
  fghij
  klmno
- pqrst
  uvwxyz
--- 1,5 ----
! abcd
  fghij
  klmno
  uvwxyz
+ 123456

二つのテキストファイルの内容も表示されるので、わかりやすい表示形式であると言えます。記号のある個所が、差異のある部分を示しています。「!」は変更、「-」は削除、「+」は追加された行であるということを表しています。

unified形式

「-u」オプションをしようするとunified形式で出力できます。


$ diff -u sample1.dat sample3.dat
--- sample1.dat	2020-10-06 09:31:20.087532069 +0900
+++ sample3.dat	2020-10-06 10:03:57.430254752 +0900
@@ -1,5 +1,5 @@
-abcde
+abcd
 fghij
 klmno
-pqrst
 uvwxyz
+123456

context形式と非常によく似た表示形式となっています。違っている点としては、比較結果を同時に出力している点です。記号については基本的にcontext形式と同一のものを使用しますが変更点はcontext形式では「!」ですが、unified形式では「+」と「-」で表します。

RCS形式

オプションに「-n」を指定してRCS形式で出力すると以下のようになります。


$ diff -n sample1.dat sample3.dat

d1 1
a1 1
abcd
d4 1
a5 1
123456

これはunified形式と同様に「a(追加)」と「d(削除)」で出力されています。比較対象に注目しているので、今回の結果を見てみると、「d1 1」は「sample3.dat」ファイルの1行目から1行削除し、「a1 1」は「sample3.dat」ファイルの1行目に1行追加、追加内容「abcd」を出力していることがわかります。「d4 1」も「a5 1」も同様に削除と追加を意味しています。

side-by-side形式

オプションに「-y」を指定してside-by-side形式で出力すると以下のようになります。


$ diff -y sample1.dat sample3.dat
abcde							      |	abcd
fghij								fghij
klmno								klmno
pqrst							      <
uvwxyz								uvwxyz
							      >	123456

二つを並べて表示しているので非常にわかりやすいですね。記号がある個所が差異のある部分となっています。

まとめ

いかかでしょうか。diffコマンドを用いて差分を比較することで、エラーが発生した際には正常時のファイルと比べるなど、様々なことが行えるようになるのでdiffコマンドを是非使いこなせるようになってください。