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