Команда Diff в Linux

Команда diff

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

Контекст Формат

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

Опция -c указывает 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 в терминале.

Если у вас есть вопросы, пожалуйста, оставьте комментарий ниже.

дифференциальный терминал

Связанные руководства

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *