diff
— это утилита командной строки, которая позволяет сравнивать два файла построчно. Он также может сравнивать содержимое каталогов.
Команда diff
обычно используется для создания патча, содержащего различия между одним или несколькими файлами, которые можно применить с помощью команды patch
.
Содержание
Как использовать команду diff
Синтаксис команды diff
следующий:
diff [OPTION]... FILES
Команда diff
может отображать вывод в нескольких форматах, наиболее распространенными из которых являются обычный, контекстный и унифицированный формат. Вывод включает информацию о том, какие строки в файлах необходимо изменить, чтобы они стали идентичными. Если файлы совпадают, вывод не производится.
Чтобы сохранить вывод команды в файл, используйте оператор перенаправления:
diff file1 file2 > patch
В этой статье мы будем использовать следующие два файла, чтобы объяснить, как работает команда diff
:
Ubuntu
Arch Linux
Debian
CentOS
Fedora
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
.
Если у вас есть вопросы, оставьте комментарий ниже.