GNU/Linux >> Linux の 問題 >  >> Linux

LinuxターミナルでDiffコマンドを使用して2つのファイルを比較する

Linuxで類似したテキストを含む2つのファイルを比較する必要がある場合、diffコマンドを使用するとタスクがはるかに簡単になります。このコマンドは、2つのファイルを比較して、ファイルを同一にする変更を提案します。新しく更新されたコードを壊した余分な中括弧を見つけるのに最適です。

diffコマンドの使用は非常に簡単です。構文は次のとおりです。

diff [options] file1 file2

しかし、その出力を理解することは別のことです。心配しないでください。2つのファイルを比較して、それらの違いを理解できるように、出力について説明します。

Linuxでのdiffコマンドについて

開始するには、いくつかのファイルが必要です。ランダムワードジェネレータを使用してリストを生成しました。

リストを2つの異なるファイルに追加してから、次の方法でリストを変更しました。

  • リストの順序を変更する
  • 文字の追加
  • 切り替えケース

これらの同様のファイルを1.txtおよび2.txtとして保存しました。何かをする前の様子は次のとおりです。

読みながらチュートリアルに従うことをお勧めします。新しいファイルを作成し、次のコンテンツを追加してください。

1.txtの内容

クモの巣
ロケット
音響
拡張
記録

2.txtの内容:

クモの巣
ロケット
音響
記録
拡張

例1:オプションなしの差分

diffを実行するとどうなるか見てみましょう オプションなしのコマンド。

christopher:~$ diff 1.txt 2.txt
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

混乱している?あなたは一人じゃない。出力は正確に人間に優しいものではありません。何が起こっているのかを理解するには、diffがどのように機能するかについてもっと知る必要があります。

分析が完了したら、 file2 [構文内]は、照合しようとしている参照ドキュメントとして扱われます。したがって、diffは次のように機能すると言うことができます:

diff <file_to_edit> <file_as_reference>

これは、ファイル名を配置した順序に基づいて異なる出力が得られることも意味します。

順序が重要です

ファイルの順序によって出力がどのように異なるかの例:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

christopher:~$ diff 2.txt 1.txt 
2c2
< LOCKET
---
> locket
4d3
< records
5a5
> record

diffコマンド出力の重要な記号

以下の表を参考にして、端末で何が起こっているかをよりよく理解できます。

シンボル 意味
A 追加
C 変更
D 削除
行番号
– – – 出力でファイルを分離する
< ファイル1
> ファイル2

diffコマンドの出力をもう一度見てみましょう:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

diffコマンド出力の説明

出力の最初の違いを見てみましょう:

出力ライン 説明
2c2 ファイル1の2行目、ファイル2の2行目と変更します。
<ロケット—>ロケット ファイル2.txtに一致するように「locket」を「LOCKET」に変更します

出力の次の部分を見てみましょう:

出力ライン 説明
3a4 ファイル1の3行目の後に、ファイル2の4行目を追加します。
>レコード つまり、「レコード」を追加して、ファイル1に4行目を作成します。これにより、ファイル1.txtがファイル2.txtと一致します

同様に:

出力ライン 説明
5d5<レコード ファイル1の5行目からテキスト「record」を削除します。ファイル1.txtがファイル2.txtと一致するようにします

コマンドに組み込まれているスペルチェックまたは辞書機能はありません。 「レコード」と「レコード」が関連しているとは認識しません。その唯一の目標は、2つのファイルを完全に一致させることです。

出力を見ると、翻訳するのはまだかなり難しいです。多くの時間を節約できるとは考えられません。

幸いなことに、物事をより人間が読めるようにするために追加できるオプションがあります。同じリストを使用して、いくつかの異なる例を見てみましょう。

例2:-cを使用した「コピーされた」コンテキストの差分

コンテキストオプションは、デフォルトで表示されるより多くのプログラム情報よりも視覚的な表現を提供します。例のテキストを続けましょう。

diffコマンド出力のより重要な記号

シンボル 意味
+ 追加
変更
削除
*** ファイル1
– – – ファイル2
christopher:~$ diff -c 1.txt 2.txt 
*** 1.txt    2019-10-20 12:05:09.244673327 -0400
--- 2.txt    2019-10-20 12:11More:31.382547316 -0400
***************
*** 1,5 ****
  cobweb
! locket
  acoustics
  expansion
- record
--- 1,5 ----
  cobweb
! LOCKET
  acoustics
+ records
  expansion

このように情報を見ると、はるかに理解しやすくなります。英数字の出力の代わりに、新しい記号のセットを使用すると、2つのファイルの違いをすばやく識別できます。

出力には、最初のファイル、つまり1.txtとその1行目から5行目が最初に表示されます。これは、ファイル1.txtの2行目(の一部)とファイル2の2行目(の一部)にわずかな変更があることを示しています。 .txt。

また、2番目のファイルでファイル1の行番号5が削除されている(-)ことも示しています。

— 1,5 —-2番目のファイルの開始を示し、2行目がファイル1の2行目からわずかに変更されていることを示します。また、4行目が2番目のファイルに追加(+)されており、対応するものがないことを示します。ファイル1の行。

例3:-uを使用した「統合」コンテキストでの差分

このオプションは、コピーされたコンテキスト形式と同様の出力を提供します。 2つのファイルを別々に表示する代わりに、それらをマージします。

christopher:~$ diff 1.txt 2.txt -u
--- 1.txt    2019-10-20 12:05:09.244673327 -0400
+++ 2.txt    2019-10-20 12:11:31.382547316 -0400
@@ -1,5 +1,5 @@
 cobweb
-locket
+LOCKET
 acoustics
+records
 expansion
-record

ご覧のとおり、以前と同じ記号を使用していますが、変更記号の代わりに、読みやすい+を使用して変更を行うことを提案しています。 または- シンボル。ここでは、1.txtから2行目を削除することをお勧めします 2.txtの2行目に置き換えます 。

今後は、レコードを追加することもお勧めします 音響を含む行の後、行を削除 record 展開を含む行の後。

これらの変更はすべて、diffコマンドの最初のファイルに対して提案されます。これは、diffプログラムが「元の」または修正の基礎としてリストされている2番目のファイルを使用することを覚えておくのに役立つ別のシナリオです。

このようなリストを比較するために、私は個人的にこの方法が最も使いやすいと思います。ファイルを同一にするために変更する必要のあるテキストを明確に視覚化できます。

例4:-iを使用してケースを比較しますが無視します

大文字と小文字を区別する検索はdiffのデフォルトですが、これをオフにすることができます。それを行うとどうなるか見てみましょう。

christopher:~$ diff 1.txt 2.txt -i
3a4
> records
5d5
< record

ご覧のとおり、「ロケット」と「ロケット」は提案された変更として表示されなくなりました。

例5:–colorとの差分

--colorを使用できます diffコマンド出力の変更を強調表示します。コマンドを実行すると、出力のセクションがターミナルパレットとは異なる色で印刷されます。

例6:diffコマンドオプション-sおよび-qを使用したファイルのクイック分析

ファイルが同一であるかどうかを確認する簡単な方法がいくつかあります。 -sを使用する場合 ファイルが同一であるか、通常どおりdiffを実行することが通知されます。

-qを使用する ファイルが「異なる」ことだけがわかります。そうでない場合、出力は得られません。

christopher:~$ diff 1.txt 1.txt -s
Files 1.txt and 1.txt are identical
christopher:~$ diff 1.txt 2.txt -q
Files 1.txt and 2.txt differ

ボーナスのヒント:Linuxで大きなテキストファイルを使用してdiffコマンドを使用する

このような単純な情報を常に比較しているとは限りません。スキャンして違いを見つけるための大きなテキストファイルがある場合があります。このタイプの問題を処理するためのいくつかの方法について詳しく説明します。

この例では、テキストの大きなチャンク(lorem ipsum)を含む2つのファイルを作成しました。各行には数百の列があります。これは明らかに線の比較を困難にしました。

このようなファイルでdiffを実行すると、出力に大量のテキストが生成され、コンテキスト出力のようなツールを使用しても記号が表示されにくくなります。

スペースを節約するために、出力のスクリーンショットを撮りました。

あまり役に立たないですよね?

同じ概念のいくつかを使用して、これらの種類のファイルを分析できます。ファイルが適切にフォーマットされていないと、うまく機能しません。一部の大きなテキストブロックには改行がありません。スクロールバーを使用せずに割り当てられたスペース内にすべてのテキストを表示するには、「ワードラップ」を有効にする必要があるこのようなファイルに遭遇した可能性があります。これが発生する理由は、一部のテキスト形式では改行が自動的に作成されないためです。これは、2〜3行のテキストの大きなチャンクになってしまう方法です。これにはかなり簡単な修正があります。

foldを使用してテキストを行に折り返します

これはLinuxハンドブックなので、当然のことながら、私たちはあなたのための解決策を持っており、ミニチュートリアルを詰め込むことができます。ここにfold(Unix)とfmt(GNU)に関する素晴らしい記事があります。私たちを前進させるために、かなり自明であるはずの簡単な例を挙げましょう。

foldコマンドは、列数を使用して行を分割するために使用されます。これらの新しい改行を実装する方法に関するオプションを提供するようにカスタマイズできます。

この例では、ファイルを標準化された幅に分割し、-sを使用します。 オプション。これは、テキストの途中ではなく、空白がある場所でのみ中断するようにプログラムに指示します。

foldを使用して改行をすばやく挿入します

fold -w 80 -s lorem.txt > lorem.txt
fold -w 80 -s lorem2.txt > lorem2.txt

両方のファイルを3行ではなく31行に分割すると、はるかに効果的に比較できます。統合コンテキストフィルターを使用した出力の例を次に示します。

christopher:~$ diff lorem.txt 2lorem.txt -u
--- lorem.txt    2019-10-27 09:39:07.298691695 -0400
+++ 2lorem.txt    2019-10-27 09:39:08.370704501 -0400
@@ -1,10 +1,10 @@
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in tincidunt 
 sapien. Maecenas sagittis ex risus, in vehicula turpis imperdiet sed. Phasellus 
 placerat posuere maximus. In hac habitasse platea dictumst. Ut vel tristique 
-eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
+eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
 Suspendisse at mauris vitae sapien euismod tincidunt. Sed placerat finibus 
 blandit. Duis ornare ante at ipsum accumsan, nec bibendum nibh tincidunt. 
-Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
+Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
 vitae enim. Nam condimentum, purus nec semper efficitur, nisi quam vehicula 
 sem, eget finibus diam ipsum suscipit velit.

@@ -21,7 +21,7 @@

 Maecenas lacinia cursus tristique. Nulla a hendrerit orci. Donec lobortis nisi 
 sed ante euismod lobortis. Nullam sit amet est nec nunc porttitor sollicitudin 
-a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
+a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 
 interdum mi metus vel tellus. Fusce nec dui a risus posuere mattis at eu orci. 
 Proin purus sem, finibus eget viverra vel, porta pulvinar ex. In hac habitasse 
 platea dictumst. Nunc faucibus leo nec tristique porta. Phasellus luctus ipsum

–minimal出力でdiffを使用

--minimalを使用すると、これを少し読みやすくすることができます。 鬼ごっこ。これにより、大きなテキストファイルが少し読みやすくなります。出力を見てみましょう。

christopher:~$ diff lorem.txt 2lorem.txt --minimal
4c4
< eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
---
> eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
7c7
< Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
---
> Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
24c24
< a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
---
> a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 

これらのヒントのいずれかを組み合わせたり、diffのマニュアルページにリストされている他のオプションのいくつかを使用したりできます。これは強力で使いやすいソフトウェアユーティリティです。

この記事がお役に立てば幸いです。ヒントがあれば、コメントを残して、それについて教えてください。


Linux
  1. Linuxで2つのテキストファイルを結合する方法

  2. Linuxでfdコマンドを使用してファイルを検索する方法

  3. Sort コマンドを使用して Linux でファイルをソートする方法

  1. diffコマンドを使用してLinuxでファイルを行ごとに比較する方法-パートII

  2. diffコマンドを使用してLinuxでファイルを行ごとに比較する方法

  3. diff を使用して 2 つのファイルを手動でマージする

  1. LinuxのRmコマンド

  2. 11 Linux diff3 コマンドの例 (3 つのファイルを 1 行ずつ比較)

  3. Linux での diff コマンドの例