Комнада Diff в Linux
Комнада Diff в Linux
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
второго файла в начале файла1 (после строки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
свой терминал.
Комментарии
Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.