技術ノート Linux Linux ターミナルで 2 つのテキスト ファイルを比較する方法

Linux ターミナルで 2 つのテキスト ファイルを比較する方法

Linux ターミナルで 2 つのテキスト ファイルを比較する方法

重要なポイント

  • diff コマンドは、2 つのファイルを比較し、変更、削除、追加などの相違点を表示するために使用されます。
  • diff コマンドの出力には、差異の種類 (変更、削除、または追加) を示す行番号とラベルが含まれます。
  • diff コマンドの使用には、ファイルの相違点に関する簡単な説明の表示、並べて表示、空白文字と大文字小文字の無視、相違点のコンテキストの提供など、さまざまなオプションが用意されています。

テキスト ファイルの 2 つのリビジョン間の違いを確認する必要がありますか?次に、必要なコマンドは diff です。 Linux と macOS で diff 使用する簡単な方法を紹介します。

diffコマンドとは何ですか?

diff コマンドは 2 つのファイルを比較し、2 つのファイル間の相違点のリストを生成します。より正確に言うと、最初のファイルを 2 番目のファイルと一致させるために、最初のファイルに加える必要がある変更のリストが生成されます。このことを念頭に置くと、 diff の出力を理解しやすくなることがわかります。 diff コマンドは、ソース コード ファイル間の相違点を検出し、 patch コマンドなどの他のプログラムで読み取って操作できる出力を生成するように設計されています。このチュートリアルでは、 diff を使用する最も便利で人間に優しい方法を見ていきます。

diff コマンドの使用方法

早速 2 つのファイルを分析してみましょう。コマンドラインでのファイルの順序によって、 diff どのファイルを「最初のファイル」と見なし、どのファイルを「2 番目のファイル」と見なすかが決まります。以下の例では、alpha1 が最初のファイルで、alpha2 が 2 番目のファイルです。どちらのファイルにも 表音文字が 含まれていますが、2 番目のファイル alpha2 にはさらに編集が加えられているため、2 つのファイルは同一ではありません。

このコマンドを使用してファイルを比較できます。 diff 、スペース、最初のファイルの名前、スペース、2 番目のファイルの名前を入力し、Enter キーを押します。

差分アルファ1アルファ2

その出力をどのように分析すればよいでしょうか?何を探すべきかさえ分かれば、それほど悪いことではありません。それぞれの相違点が 1 つの列に順番にリストされ、それぞれの相違点にラベルが付けられます。ラベルには、 4c4 のように、文字の両側に数字が含まれます。最初の数字は alpha1 の行番号、2 番目の数字は alpha2 の行番号です。真ん中の文字は次のとおりです。

  • c : 最初のファイルの行は、2 番目のファイルの行と一致するように変更する必要があります。
  • d : 2 番目のファイルと一致させるには、最初のファイルの行を削除する必要があります。
  • a : 2 番目のファイルと一致させるには、最初のファイルに追加のコンテンツを追加する必要があります。

この例の 4c4 、alpha1 の 4 行目を alpha2 の 4 行目に一致するように変更する必要があることを示しています。これは、 diff で見つかった 2 つのファイル間の最初の違いです。

< で始まる行は最初のファイル (この例では alpha1) を参照し、 > で始まる行は 2 番目のファイル alpha2 を参照します。 < Delta 行は、Delta という単語が alpha1 の 4 行目の内容であることを示しています。 > Dave 行は、Dave という単語が alpha2 の 4 行目の内容であることを示しています。要約すると、両方のファイルでその行が一致するように、alpha1 の 4 行目で Delta を Dave に置き換える必要があります。

次の変更は 12c12 によって示されます。同じロジックを適用すると、alpha1 の 12 行目には Lima という単語が含まれていますが、alpha2 の 12 行目には Linux という単語が含まれていることがわかります。

3 番目の変更は、alpha2 から削除された行を参照しています。ラベル 21d20 は、「両方のファイルを 20 行目以降で同期させるには、最初のファイルから 21 行目を削除する必要がある」と解読されます。 < Uniform 行は、alpha1 から削除する必要がある行の内容を示しています。

4 番目の違いには 26a26,28 ラベルが付けられます。この変更は、alpha2 に追加された 3 つの追加行を指します。ラベルの 26,28 に注目してください。カンマで区切られた 2 行の番号は、行番号の範囲を表します。この例では、範囲は 26 行目から 28 行目です。ラベルは「最初のファイルの 26 行目に、2 番目のファイルの 26 行目から 28 行目を追加」として解釈されます。 alpha1 に追加する必要がある alpha2 の 3 行が表示されています。これらには、「Quirk」、「Strange」、「Charm」という単語が含まれています。

Linux ターミナルで 2 つのテキスト ファイルを比較する方法

diff を使用した便利な単一行コマンド

2 つのファイルが同じかどうかだけを知りたい場合は、 -s (同一ファイルをレポート) オプションを使用します。

 diff -s アルファ1 アルファ3

-q (短い) オプションを使用すると、2 つのファイルが異なるという同様の簡潔なステートメントを取得できます。

 diff -q アルファ1 アルファ2

注意すべき点の 1 つは、2 つの同一のファイルの場合、 -q (brief) オプションが完全に機能不全に陥り、まったく何も報告しないことです。

Linux ターミナルで 2 つのテキスト ファイルを比較する方法

diff の別の見方

-y (並列) オプションは、ファイルの違いを説明するために異なるレイアウトを使用します。多くの場合、表示される列の数を制限するには、並列ビューで -W (幅) オプションを使用すると便利です。これにより、出力を読みにくくする醜い折り返し行を回避できます。ここでは、並べて表示を生成し、出力を 70 列に制限するように diff 指示しました。

 diff -y -W 70 アルファ 1 アルファ 2

コマンド ラインの最初のファイル alpha1 が左側に表示され、コマンド ラインの 2 番目のファイル alpha2 が右側に表示されます。各ファイルの行が並べて表示されます。 alpha2 の行の横には、変更、削除、または追加された標識文字があります。

  • | : 2 番目のファイルで変更された行。
  • < : 2 番目のファイルから削除された行。
  • > : 最初のファイルにはない、2 番目のファイルに追加された行。

ファイルの違いを並べて簡潔にまとめたい場合は、 --suppress-common-lines オプションを使用します。これにより、 diff 変更、追加、または削除された行のみをリストするように強制されます。

 diff -y -W 70 --suppress-common-lines alpha1 alpha2 

Linux ターミナルで 2 つのテキスト ファイルを比較する方法

出力の差分に色のスプラッシュを追加する

colordiff と呼ばれる別のユーティリティは、 diff 出力に色の強調表示を追加します。これにより、どの行に違いがあるのか​​が非常に簡単にわかります。

Ubuntu または別の Debian ベースのディストリビューションを使用している場合は、 apt-get 使用してこのパッケージをシステムにインストールします。他の Linux ディストリビューションでは、代わりに Linux ディストリビューションのパッケージ管理ツールを使用してください。

 sudo apt-get インストール colordiff

diff 使用するのと同じように colordiff 使用します。

実際、 colordiff diff のラッパーであり、 diff すべての作業を舞台裏で実行します。そのため、すべての diff オプションは colordiff で機能します。

Linux ターミナルで 2 つのテキスト ファイルを比較する方法

コンテキストの提供

ファイル内のすべての行を画面に表示する場合と、変更された行のみをリストする場合との間の中間点を見つけるために、 diff にコンテキストを提供するように要求できます。これを行うには 2 つの方法があります。どちらの方法でも、変更された各行の前後にいくつかの行を表示するという同じ目的を達成できます。違いが検出された場所でファイル内で何が起こっているかを確認できます。

最初の方法では、 -c (コピーされたコンテキスト) オプションを使用します。

 colordiff -c alpha1 alpha2

diff 出力にはヘッダーがあります。ヘッダーには 2 つのファイル名とその変更時刻がリストされます。最初のファイルの名前の前にはアスタリスク ( * ) があり、2 番目のファイルの名前の前にはダッシュ ( - ) があります。アスタリスクとダッシュは、出力内の行がどのファイルに属しているかを示すために使用されます。

中央に 1,7 が付いたアスタリスクの行は、alpha1 からの行を見ていることを示します。正確に言うと、1 行目から 7 行目までを見ていきます。 Delta という単語には変更済みのフラグが立てられます。横に感嘆符 ( ! ) があり、赤色です。その行の前後に変更されていないテキストが 3 行表示されているため、ファイル内のその行のコンテキストを確認できます。

中央に 1,7 がある破線は、現在 alpha2 からの線を見ていることを示しています。ここでも 1 行目から 7 行目を調べており、4 行目の Dave という単語には異なるものとしてフラグが立てられています。

各変更の上下に 3 行のコンテキストが表示されるのがデフォルト値です。 diff で提供するコンテキストの行数を指定できます。これを行うには、 -C (コンテキストのコピー) オプションを大文字の「C」で使用し、必要な行数を指定します。

 colordiff -C 2 alpha1 alpha2

コンテキストを提供する 2 番目の diff オプションは、 -u (統合コンテキスト) オプションです。

 colordiff -u alpha1 alpha2

前と同様に、出力にヘッダーがあります。 2 つのファイルには名前が付けられ、それらの変更時間が表示されます。 alpha1 の名前の前にはダッシュ ( - ) があり、alpha2 の名前の前にはプラス記号 ( + ) があります。これは、ダッシュが alpha1 を参照するために使用され、プラス記号が alpha2 を参照するために使用されることを示しています。リスト全体にアットマーク ( @ ) で始まる行が散在しています。これらの行は、それぞれの違いの始まりを示しています。また、各ファイルのどの行が表示されているかもわかります。

変更された行のコンテキストを確認できるように、異なるものとしてフラグが付けられた行の前後 3 行が表示されます。統合ビューでは、差異のある行が上下に表示されます。 alpha1 からの行の前にはダッシュが付き、alpha2 からの行の前にはプラス記号が付きます。この表示は、上記のコピーされたコンテキスト表示で 15 行かかった作業を 8 行で実現します。

ご想像のとおり、 diff 、必要な統一コンテキストの行数を正確に提供するように要求できます。これを行うには、 -U (統合コンテキスト) オプションを大文字の「U」で使用し、必要な行数を指定します。

 colordiff -U 2 alpha1 alpha2 

Linux ターミナルで 2 つのテキスト ファイルを比較する方法

空白と大文字小文字の無視

別の 2 つのファイル、test4 と test5 を分析してみましょう。これらには6人のスーパーヒーローの名前が入っています。

 colordiff -y -W 70 テスト4 テスト5

結果は、 diff ブラック ウィドウ、スパイダーマン、ソーのラインで何の違いも見つからないことを示しています。キャプテン・アメリカ、アイアンマン、ハルクのラインで変化を示しています。

それで、何が違うのでしょうか?さて、test5 では、ハルクは小文字の「h」で綴られており、キャプテン・アメリカは「Captain」と「America」の間に余分なスペースがあります。 OK、それは明らかですが、アイアンマンラインの何が問題なのでしょうか?目に見える違いはありません。ここに良い経験則があります。見えない場合、答えは空白です。その行の末尾には、ほぼ確実に 1 つまたは 2 つの空白スペース、またはタブ文字があります。

それらが重要でない場合は、次のような特定の種類の行の違いを無視するように diff 指示できます。

  • -i : 大文字と小文字の違いを無視します。
  • -Z : 末尾の空白を無視します。
  • -b : 空白の量の変化を無視します。
  • -w : すべての空白の変更を無視します。

diff にこれら 2 つのファイルを再度チェックしてもらいましょう。ただし、今回は大文字と小文字の違いを無視します。

 colordiff -i -y -W 70 テスト 4 テスト 5

「The Hulk」と「The hulk」を含む行は一致とみなされ、小文字の「h」については相違点がフラグ付けされません。 diff 末尾の空白も無視するように依頼しましょう。

 colordiff -i -Z -y -W 70 テスト 4 テスト 5

推測されているように、 diff その行の違いをフラグしなくなったため、末尾の空白が Ironman 行の違いであったに違いありません。これでキャプテン・アメリカは終わります。 diff 大文字と小文字を区別せず、すべての空白の問題を無視してもらいましょう。

 colordiff -i -w -y -W 70 テスト 4 テスト 5

diff 、関心のない差異を無視するように指示することで、 diff 、目的上、ファイルが一致していることを示します。

diff コマンドにはさらに多くのオプションがありますが、それらの大部分は機械可読出力の生成に関連しています。これらは Linux の マニュアル ページ で確認できます。上記の例で使用したオプションを使用すると、コマンド ラインと人間の目で、テキスト ファイルのバージョン間のすべての違いを追跡できるようになります。

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · パッチ · 変換 · rclone · シュレッド · srm · scp · gzip · chattr · カット · 検索 · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · グループ · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

「 Linux ターミナルで 2 つのテキスト ファイルを比較する方法」に関するベスト動画選定!

【Linuxコマンドの基本02】一行で書くプログラム ワンライナー (この動画で解説してあるコマンド:grep sort uniq awk tee ps)
Winmergeでファイル(Excel,Word,PowerPointなど)の新旧比較を行い差分を特定可能! 【元IT企業社員がおとどけします】