Команда Diff в Linux

diff — это утилита командной строки, которая позволяет сравнивать два файла построчно. Он также может сравнивать содержимое каталогов.

Команда diff обычно используется для создания патча, содержащего различия между одним или несколькими файлами, которые можно применить с помощью команды patch .

Как использовать команду diff

Синтаксис команды diff следующий:

diff [OPTION]... FILES

Команда diff может отображать вывод в нескольких форматах, наиболее распространенными из которых являются обычный, контекстный и унифицированный формат. Вывод включает информацию о том, какие строки в файлах необходимо изменить, чтобы они стали идентичными. Если файлы совпадают, вывод не производится.

Чтобы сохранить вывод команды в файл, используйте оператор перенаправления:

diff file1 file2 > patch

В этой статье мы будем использовать следующие два файла, чтобы объяснить, как работает команда diff :

file1
Ubuntu
Arch Linux
Debian
CentOS
Fedora
file2
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 .

Если у вас есть вопросы, оставьте комментарий ниже.

Оставьте комментарий