diffコマンドの読み方(その1)

diffコマンドの表示結果を確認していきましょう。
まずは、差分がない場合の比較です。実験用に2つのファイルを作成します。to.txtは、from.txtからのコピーです。

~$ seq 10 > from.txt
~$ cp from.txt to.txt
~$ 

両者の内容をpasteコマンドで左右並べて見てみます。

~$ paste from.txt to.txt
1	1
2	2
3	3
4	4
5	5
6	6
7	7
8	8
9	9
10	10
~$ 

見た目、差分はないですね。

では、diffでの確認といきましょう。

~$ diff from.txt to.txt
~$ 

結果が表示されませんでした。つまり一致したということになります。
LinuxやUNIX、UNIXライクなシステムにおいて、結果が表示されないというのは、重要なことです。たいていのコマンドはフィルタ設計されており、パイプで渡すことを意識しなければならないからです。lsならディレクトリに何もなければ、何も表示せず、diffなら差分がなければ何も表示しない、といった具合です。
念の為、一致しても結果を表示させるオプションを使って再度確認してみましょう。

~$ diff -s from.txt to.txt
ファイル from.txt と to.txt は同一です
~$ 

同一です、と報告されました。
次に、to.txtに修正を加えます。sedのサブコマンドに一行をまるまる変更するコマンドがあります。
書式「sed 行番号c変更内容」
これを使って3行目を修正します。

~$ sed 3c変更された行 -i to.txt

いつものように何も表示されませんでしたが、これだけで、ファイルの修正は完了です。
pasteで確認してみます。

~$ paste from.txt to.txt
1	1
2	2
3	変更された行
4	4
5	5
6	6
7	7
8	8
9	9
10	10
~$ 

pasteコマンドは、引数で指定した通りの並びで結果が表示されますので、右側がto.txtの結果となります。先ほど変更した通りに表示されていますね。
では、diffコマンドで確認しましょう。

~$ diff from.txt to.txt
3c3
< 3
---
> 変更された行
~$ 

冒頭の3c3は、両脇の数字が変更行、中央のcが、「変更」という意味を表しています。
さらに、次の行からは、
from.txtの3行目が、to.txtの3行目ではどうなったかということが書かれています。

では、diffの-yオプションで左右に並べて結果を確認してみます。合わせて-Wオプションを使い、50文字に収まるように表示します。

~$ diff -y -W50 from.txt to.txt
1                       1
2                       2
3                     | 変更された行
4                       4
5                       5
6                       6
7                       7
8                       8
9                       9
10                      10
~$ 

素のdiff表示と比べて、差分が随分わかりすく表示されました。
次にto.txtの先頭行に新しく空行を追加して確認してみます。

sed "1s/^/\n/" -i to.txt
~$ diff from.txt to.txt
0a1
> 
3c4
< 3
---
> 変更された行

0a1は、from.txtの0行目、つまり存在しない行を表し、追加されたのがto.txtの1行目にあたることを表しています。そして、先頭に一行追加になっているので、3c3だった箇所は3c4と変わっています。これを-yオプションで左右に並べて見てみましょう。

~$ diff -y -W50 from.txt to.txt
                      >
1                       1
2                       2
3                     | 変更された行
4                       4
5                       5
6                       6
7                       7
8                       8
9                       9
10                      10
~$ 

何か変です。
まず、一行目が左右とも空行に見えます。どちらに空行が存在するのかわかりません。from.txtに空行を入れて確認、to.txtの1行目の空行を消して確認してみましょう。

~$ sed "1s/^/\n/" -i from.txt
~$ diff -y -W50 from.txt to.txt

1                       1
2                       2
3                     | 変更された行
4                       4
5                       5
6                       6
7                       7
8                       8
9                       9
10                      10
~$ sed 1d -i to.txt
~$ diff -y -W50 from.txt to.txt
                      <
1                       1
2                       2
3                     | 変更された行
4                       4
5                       5
6                       6
7                       7
8                       8
9                       9
10                      10
~$ 

両者共に1行目に空行がある時は、’>’ ‘|’ ‘<‘いずれの表示もなく、from.txtのみに空行が存在する時は、'<‘の表示になりました。つまり、diffで左右表示する場合は、’>’や'<‘の付き方で空行かどうかを判断しなければなりません。

コマンドラインを使いこなすには、各コマンドの結果に目を凝らす必要があります。’>’ ‘|’ ‘<‘ のようにたった一文字ではありますが、大事なことを語っていることもあります。

One response to “diffコマンドの読み方(その1)

  1. Pingback: diffコマンドの読み方(その2) | コマンドの達人

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA