Комнада Diff в Linux

Комнада Diff в Linux

Diff Command in Linux

24 Января 2020 | Терминал

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

Комнада Diff в Linux

Команда 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второго файла в начале файла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 свой терминал.


    Комментарии

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

Загрузка комментариев...