
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 в терминале.
Если у вас есть вопросы, пожалуйста, оставьте комментарий ниже.
Связанные руководства