Android

Команда Diff в Linux

Linux diff command summary with examples

Linux diff command summary with examples

Оглавление:

Anonim

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

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

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

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

diff… 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 и последняя пустая строка одинакова в обоих файлах. Эти строки начинаются с двойного пробела. Line - Arch Linux из первого файла ничего не соответствует во втором файле. Хотя эта строка также существует во втором файле, позиции отличаются. Line + Kubuntu из второго файла ничего не соответствует в первом файле. Line ! CentOS ! CentOS из первого файла и строк ! Arch Linux ! Arch Linux и ! CentOS ! 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 в вашем терминале.

diff терминал