Поиск по сайту:
Я не хочу иметь точку зрения. Я хочу иметь зрение (М.И. Цветаева).

Использование команды Diff для сравнения двух файлов в терминале Linux

05.11.2019
Использование команды Diff для сравнения двух файлов в терминале Linux

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

Использовать команду diff очень просто. Вот синтаксис:

diff [options] file1 file2

 

Но понимание его результатов – это совсем другое. Не волнуйтесь, мы объясним вывод, чтобы вы могли сравнить два файла и понять разницу между ними.

 

Понимание команды diff в Linux

Для начала вам понадобится пара файлов. Мы создали список, используя генератор случайных слов.

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

  • Изменение порядка списка
  • Добавление писем
  • Коммутационный шкаф

Сохранили эти похожие файлы как 1.txt и 2.txt.

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

 

Содержание 1.txt :

запись о расширении акустических
систем в паутине

 

Содержание 2.txt:

паутина
медальон
акустики
записей
расширения

 

Пример 1: Diff без опций

Посмотрим, что произойдет, когда вы запустите команду diff без каких-либо опций.

andreyex:~$ diff 1.txt 2.txt
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

 

Смущенны? Вы не одиноки. Вывод не совсем подходит для человека. Чтобы понять, что происходит, вам нужно больше узнать о том, как работает diff.

Может быть полезно знать, что когда анализ завершен, file2 [в синтаксисе] обрабатывается как справочный документ, с которым вы пытаетесь сопоставить. Итак, вы можете сказать, что diff работает следующим образом:

diff <file_to_edit> <file_as_reference>

 

Это также означает, что вы получите различный вывод в зависимости от порядка размещения имен файлов.

 

Порядок имеет значение

Пример того, как выходные данные различаются в зависимости от порядка файлов:

andreyex:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

andreyex:~$ diff 2.txt 1.txt 
2c2
< LOCKET
---
> locket
4d3
< records
5a5
> record

 

Важные символы в выводе команды diff

Используя приведенную ниже таблицу в качестве справки, вы сможете лучше понять, что происходит в вашем терминале.

Условное обозначениеСмысл
AДобавлять
С+ Изменить
DУдалять
#Номера строк
– – –Отдельные файлы в выводе
<Файл 1
>Файл 2

 

Давайте еще раз посмотрим на вывод команды diff:

andreyex:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

 

Пояснения к выводу команды diff

Давайте посмотрим на первое отличие в выводе:

Читать  Заявление if..else в Bash

2c2
<locket

> LOCKET

 

Строка 2 файла 1, изменить со строкой 2 файла 2.
(Измените «locket» на «LOCKET», чтобы соответствовать файлу 2.txt)

Давайте посмотрим на следующую часть вывода:

3a4
> records

После строки 3 файла 1 добавьте строку 4 файла 2. То есть добавьте «records», чтобы создать
четвертую строку в файле 1. (чтобы файл 1.txt совпадал с файлом 2.txt)

 

По аналогии:

5d5
<record

Удалить текст «record» из 5-й строки файла 1.
(чтобы файл 1.txt совпадал с файлом 2.txt)

 

В команде нет встроенной функции проверки орфографии или словаря. Он не распознает «record» и «records» как связанные. Его единственная цель – идеально сопоставить два файла.

Глядя на результат, его все еще довольно сложно перевести. Вряд ли вы бы сэкономили много времени

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

 

Пример 2. Различение в «Copied» контексте с -c

Опция context дает более наглядное представление о более программной информации, отображаемой по умолчанию. Давайте продолжим с нашим примером текста.

 

Более важные символы в выводе команды diff

Условное обозначениеСмысл
+Добавлять
!+ Изменить
Удалять
***Файл 1
– – –Файл 2
andreyex:~$ diff -c 1.txt 2.txt 
*** 1.txt    2019-11-05 20:05:09.244673327 -0400
--- 2.txt    2019-11-05 20:11More:31.382547316 -0400
***************
*** 1,5 ****
  cobweb
! locket
  acoustics
  expansion
- record
--- 1,5 ----
  cobweb
! LOCKET
  acoustics
+ records
  expansion

 

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

Выходные данные сначала отображают первый файл, т. е. 1.txt и его строку от 1 до 5. В нем говорится, что имеется небольшое изменение (часть) строки 2 файла 1.txt и (части) строки 2 файла 2 .текст.

Это также указывает на то, что строка № 5 файла 1 была удалена (-) во втором файле.

– 1,5 —- указывает начало второго файла и говорит, что строка 2 немного отличается от строки 2 файла 1. Это также указывает, что строка 4 была добавлена ​​(+) во второй файл, и нет соответствующей строка в файле 1.

 

Пример 3: Различаться в «Unified» контексте с -u

Эта опция обеспечивает вывод, похожий на скопированный контекстный формат. Вместо того, чтобы отображать два файла по отдельности, он объединяет их вместе.

andreyex:~$ diff 1.txt 2.txt -u
--- 1.txt    2019-11-05 20:05:09.244673327 -0400
+++ 2.txt    2019-11-05 20:11:31.382547316 -0400
@@ -1,5 +1,5 @@
 cobweb
-locket
+LOCKET
 acoustics
+records
 expansion
-record

 

Читать  Команда Sed для удаления строки

Как вы можете видеть, он использует те же символы, что и раньше, но вместо символа изменения он предлагает внести изменения с использованием легко читаемых + или – символов. Здесь рекомендуется удалить строку 2 из 1.txt и заменить ее строкой 2 из 2.txt.

В дальнейшем также предлагается добавить записи после строки, содержащей акустику, и удалить запись строки после строки, содержащей расширение.

Все эти изменения предлагаются для первого файла в команде diff. Это еще один сценарий, в котором полезно помнить, что программа diff использует второй файл, указанный в качестве «оригинала» или основы для исправлений.

Для сравнения такого списка считаем этот метод наиболее простым в использовании. Это дает вам четкую визуализацию текста, который необходимо изменить, чтобы сделать файлы идентичными.

 

Пример 4. Сравнение, но игнорирование случаев с -i

Поиск с учетом регистра по умолчанию используется для diff, но вы можете отключить его. Давайте посмотрим, что происходит, когда вы это делаете.

andreyex:~$ diff 1.txt 2.txt -i
3a4
> records
5d5
< record

 

Как видите, «locket» и «LOCKET» больше не перечислены в качестве предлагаемых изменений.

 

Пример 5: Diff с –color

Вы можете использовать –color для выделения изменений в выводе команды diff. Когда команда запущена, разделы вывода будут напечатаны разными цветами из палитры терминала.

 

Пример 6: Быстрый анализ файлов с опциями команды diff -s и -q

Есть несколько простых способов проверить, идентичны ли файлы. Если вы используете -s, он скажет вам, что файлы идентичны, или он будет работать как обычно.

Использование -q только скажет вам, что файлы «отличаются». Если они этого не сделают, вы не получите никакого выхода.

andreyex:~$ diff 1.txt 1.txt -s
Files 1.txt and 1.txt are identical
andreyex:~$ diff 1.txt 2.txt -q
Files 1.txt and 2.txt differ

 

Дополнительный совет: использование команды diff в Linux с большими текстовыми файлами

Возможно, вы не всегда сравниваете такую ​​простую информацию. У вас могут быть большие текстовые файлы для сканирования и поиска различий. Мы опишем несколько методов для решения этого типа проблемы.

Для этого примера мы создали два файла с большими кусками текста (lorem ipsum). Каждая строка имеет сотни столбцов. Это явно затрудняло сравнение строк.

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

Читать  Как вывести список только каталогов в Linux

Вы можете использовать одни и те же понятия для анализа файлов такого типа. Они не будут работать хорошо, если файл не отформатирован должным образом. Некоторые большие блоки текста не имеют разрывов строк. Вероятно, вы столкнулись с таким файлом, где вам нужно было включить «перенос слов», чтобы весь текст отображался в выделенном пространстве без использования полосы прокрутки. Причина в том, что некоторые текстовые форматы не создают разрывы строк автоматически. Вот так вы получите большие куски текста всего в 2-3 строки. Это довольно легко исправить.

 

Используйте fold, чтобы обернуть текст в строки

Команда fold  используется для разбиения строк по количеству столбцов. Это может быть настроено, чтобы дать вам варианты того, как эти новые разрывы строк реализованы.

В приведенном здесь примере вы собираетесь разделить файл на стандартизированную ширину и использовать опцию -s. Это говорит программе прерывать ТОЛЬКО там, где есть пробел, а не в середине текста.

 

Используйте wrap, чтобы быстро вставить разрывы строк

fold -w 80 -s lorem.txt > lorem.txt
fold -w 80 -s lorem2.txt > lorem2.txt

 

Когда оба файла разбиты на 31 строку вместо 3, вы можете сравнивать их гораздо эффективнее.

 

Используйте diff с –minimal

Вы можете сделать это немного легче читать с помощью тега –minimal. Это делает большие текстовые файлы немного легче для чтения. Давайте посмотрим на вывод.

andreyex:~$ diff lorem.txt 2lorem.txt --minimal
4c4
< eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
---
> eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
7c7
< Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
---
> Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
24c24
< a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
---
> a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at

 

Вы можете комбинировать любые из этих советов или использовать некоторые другие опции, перечисленные на страницах справки diff. Это мощная и простая в использовании программная утилита.

Мы надеемся, что вы нашли эту статью полезной. Если у вас есть совет, не забудьте оставить нам комментарий и рассказать нам об этом.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Александра

Отличная статья

Владимир

спасибо!

Это может быть вам интересно


Рекомендуемое
Описание: в этой статье вы узнаете о функции RANK() в…

Спасибо!

Теперь редакторы в курсе.