Введение
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