設定ファイルを書き換えたあと、「どこを変えたんだっけ」と手が止まることがあります。
バックアップは残っているのに、目視で見比べても差分が見つからない。
こういうときに一発で答えを出してくれるのが diff です。
この記事では、diff の出力の読み方と、実務で使うオプションを整理します。
diff は何を出しているのか
diff は2つのファイルを行単位で比較して、片方にしか無い行だけを並べるコマンドです。
同じ行はまとめて省略されるので、出力に現れる行はすべて「変わった場所か、その周辺」。
ファイル全体を目で追う作業が、数行のチェックに縮むわけです。
まずは -u だけ覚える
出力形式はいくつかありますが、実務で使うのは -u(unified 形式)のほぼ一択。
Git のログや GitHub の差分表示もこの形なので、読めるようになると応用が広い。
$ diff -u before.txt after.txt
--- before.txt 2026-07-28 09:00:00.000000000 +0900
+++ after.txt 2026-07-28 09:05:00.000000000 +0900
@@ -1,4 +1,4 @@
common line
-old line
+new line
tail line
先頭2行が「どのファイルを比べたか」のヘッダになっています。
— が比較元、+++ が比較先。
hunk の読み方
@@ で挟まれた行は hunk(ハンク)と呼ばれ、差分のかたまりが本文のどこにあるかを示します。
@@ -1,4 +1,4 @@ なら、比較元の1行目から4行分と、比較先の1行目から4行分が対応しているという意味。
その下に続く行の先頭1文字が、そのまま差分の種類を表します。
(先頭の1文字が意味を持つ)
" "(半角スペース) … 両方にある行(文脈として表示)
"-" … 比較元にだけあった行
"+" … 比較先にだけあった行
文脈として表示される行数は、指定しなければ前後3行が既定値です(GNU diffutils マニュアル)。
広く見たいときは -U 10 のように行数を渡せばいい。
現場で効く4つのオプション
-u に添えて使う頻度が高いのは、この4つでした。
-r ディレクトリごと再帰的に比較する
-q 中身は出さず「違うかどうか」だけ報告する
-w 空白の違いをすべて無視する
-y 2つのファイルを左右に並べて表示する
とくに -r と -q の組み合わせは、デプロイ前後のディレクトリ比較で重宝します。
$ diff -rq dirA dirB
Files dirA/config.yml and dirB/config.yml differ
Only in dirB: new.txt
インデントをタブからスペースへ直したあとの確認なら、-w で空白差を殺すと本質的な変更だけが残る。
-y は横に並ぶぶん幅を食うので、既定では130桁分の出力になります。
終了ステータスでスクリプトに組み込む
diff がありがたいのは、結果を終了ステータスで返してくれるところです。
0 なら差分なし、1 なら差分あり、2 ならエラー。
diff -q a.txt b.txt > /dev/null
case $? in
0) echo "差分なし" ;;
1) echo "差分あり" ;;
*) echo "エラー" ;;
esac
この分岐を使えば、「設定ファイルが書き換わっていたら通知する」といった監視スクリプトが数行で書けます。
0 と 1 を「成功・失敗」と読み違えると逆の挙動になるので、そこだけ注意。
最後に
diff は -u で読み方さえ掴めば、あとはオプションを足していくだけの素直なコマンドでした。
grep で場所を絞り、sed で直し、diff で確かめる。
この3つが揃うと、テキストファイルまわりの作業がぐっと速くなります。
以上です。











コメントを残す