Как сравнить два файла с помощью команды diff из командной строки в Linux

12 set 2022 4 min di lettura
Как сравнить два файла с помощью команды diff из командной строки в Linux
Indice dei contenuti

Введение

diff — это утилита командной строки, которая позволяет сравнивать два файла построчно. Он также может сравнивать содержимое каталогов.

Команда diff чаще всего используется для создания исправления, содержащего различия между одним или несколькими файлами, которые можно применить с помощью команды patch.

Как использовать команду diff

Синтаксис команды diff следующий:

diff [OPTION]... FILES

Команда diff может отображать вывод в нескольких форматах; обычные, контекстные и унифицированные, которые встречаются чаще всего. Вывод включает информацию о том, какие строки в файлах нужно изменить, чтобы они стали идентичными. Если файлы совпадают, вывод не производится.

Чтобы сохранить вывод команды в файл, используйте оператор перенаправления:

diff file1 file2 > patch

В этой статье мы будем использовать следующие два файла, чтобы объяснить, как работает команда diff:

Файл 1:

Ubuntu
 Arch Linux
 Debian
 CentOS
 Fedora

Файл 2:

Kubuntu
 Ubuntu
 Debian
 Arch Linux
 Centos
 Fedora

Нормальный размер

В своей простейшей форме, когда команда diff запускается для двух текстовых файлов без параметров, она выводит результат в обычном формате:

diff file1 file2

Вывод будет выглядеть следующим образом:

0a1
 > Kubuntu
 2d2
 < Arch Linux
 4c4,5
 < CentOS
 ---
 > Arch Linux
 > Centos

Обычный выходной формат состоит из одного или нескольких разделов, описывающих различия. Каждый раздел выглядит так:

change-command
 < from-file-line...
 ---
 > to-file-line...

0a1, 2d2 и 4c4,5 — команды сдвига. Каждая команда редактирования содержит следующее слева направо:

  • Номер строки или диапазон строк в первом файле.
  • Особый характер перемен.
  • Номер строки или диапазон строк во втором файле.

Символ изменения может быть одним из следующих:

  • a - добавить строки.
  • c - Изменить строки.
  • d - удалить строки.

За командой изменения следуют полные строки, удаленные с помощью оператора ( < ) и добавленные в файл с помощью оператора ( > ).

Мы объясняем вывод:

  • 0a1 — Добавить строку 1 второго файла в начало файла 1 (после строки 0 ).
  • > Kubuntu - Строка второй строки, которая добавляется к первому файлу, как описано выше.
  • 2d2 - Удалить строку 2 в первом файле. Символ 2 после d указывает, что если строка не удалена, она будет отображаться в строке 2 во втором файле.
  • < Arch Linux - удаленная строка.
  • 4c4,5 - Заменить (изменить) строку 5 в первом файле строками 4-5 во втором файле.
  • < CentOS — строка в первом файле для замены.
  • --- - Сепаратор.
  • > Arch Linux и > Centos - Строки из второго файла, заменяющие строчку в первом файле.

Контекстный формат

Когда используется формат вывода контекста, команда diff отображает несколько строк контекста вокруг строк, которые различаются между файлами.

Опция -c dice позволяет утилите diff выводить выходные данные в формате контекста:

diff -c file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
 --- file2 2019-11-25 21:00:36.342231668 +0100
 ***************
 *** 1,6 ****
 Ubuntu
 - Arch Linux
 Debian! CentOS
 Fedora

 --- 1,7 ----
 + Kubuntu
 Ubuntu
 Debian! Arch Linux! Centos
 Fedora

Вывод начинается с имен и временных меток сравниваемых файлов, а также с одного или нескольких разделов, описывающих различия. Каждый раздел выглядит так:

***************
 *** from-file-line-numbers ****
 from-file-line...
 --- to-file-line-numbers ----
 to-file-line...
  • from-file-line-numbers и to-file-line-numbers — номера строк или диапазон строк, разделенных запятыми, в первом и втором файлах соответственно.
  • from-file-line и to-file-line — разные строки и строки контекста:
  • Строки, начинающиеся с двух пробелов, являются строками контекста, строками, одинаковыми в обоих файлах.
  • Строки, начинающиеся со знака минус ( - ), — это строки, которые ничему не соответствуют во втором файле. Пропущенные строки во втором файле.
  • Строки, начинающиеся со знака плюса ( + ), — это строки, которые ничему не соответствуют в первом файле. Пропущенные строки в первом файле.
  • Строки, начинающиеся с восклицательного знака ( ! ), являются измененными строками между двумя файлами. Каждая группа строк, начинающаяся с ! в первом файле есть совпадение во втором файле.

Мы объясняем наиболее важные части вывода:

  • В этом примере у нас есть только один раздел, описывающий различия.
  • *** 1,6 **** и --- 1,7 ---- сообщает нам диапазон строк из первого и второго файлов, которые включены в этот раздел.
  • Ubuntu, Debian, Fedora и последние пустые строки одинаковы в обоих файлах. Эти строки начинаются с двойных пробелов.
  • Строка - Arch Linux из первого файла ничему не соответствует во втором файле. Хотя эта строка также существует во втором файле, ее расположение отличается.
  • Строка + Kubuntu второго файла ничему не соответствует в первом файле.
  • Линия ! CentOS с первого файла и строк ! Arch Linux и ! CentOS из второго файла меняются между файлами.

По умолчанию количество строк контекста равно трем. Чтобы указать другой номер, используйте параметр -C ( --contexts ):

diff -C 1 file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
 --- file2 2019-11-25 21:00:36.342231668 +0100
 ***************
 *** 1,5 ****
 Ubuntu
 - Arch Linux
 Debian! CentOS
 Fedora
 --- 1,6 ----
 + Kubuntu
 Ubuntu
 Debian! Arch Linux! Centos
 Fedora

Единый формат

Унифицированный выходной формат — это улучшенная версия контекстного формата, обеспечивающая меньший объем выходных данных.

Используйте параметр -u, чтобы указать команде diff печатать вывод в унифицированном формате:

diff -u file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
 +++ file2 2019-11-25 21:00:36.342231668 +0100
 @@ -1,6 +1,7 @@
 +Kubuntu
 Ubuntu
 -Arch Linux
 Debian
 -CentOS
 +Arch Linux
 +Centos
 Fedora

Вывод начинается с имен файлов и меток времени, а также с одного или нескольких разделов, описывающих различия. Каждый раздел имеет следующий вид:

***************
 @@ from-file-line-numbers to-file-line-numbers @@
 line-from-files...
  • @@ from-file-line-numbers to-file-line-numbers @@ - Количество или диапазон строк из первого и второго файлов, включенных в этот раздел.
  • line-from-files — Отличающиеся строки и строки контекста:
  • Строки, начинающиеся с двух пробелов, являются строками контекста, строками, одинаковыми в обоих файлах.
  • Строки, начинающиеся со знака минус ( - ), удаляются из первого файла.
  • Строки, начинающиеся со знака плюса ( + ), являются строками, добавленными из первого файла.

Игнорировать случай

Как видно из предыдущих примеров, команда diff по умолчанию чувствительна к регистру.

Используйте параметр -i, чтобы указать команде diff игнорировать регистр:

diff -ui file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
 +++ file2 2019-11-25 21:00:36.342231668 +0100
 @@ -1,6 +1,7 @@
 +Kubuntu
 Ubuntu
 -Arch Linux
 Debian
 +Arch Linux
 CentOS
 Fedora

Вывод

Сравнение текстовых файлов на наличие различий — одна из наиболее распространенных задач системных администраторов Linux.

Команда diff сравнивает файлы построчно. Для получения дополнительной информации введите в терминале следующую команду:

man diff
Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.