Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 6:

Средства обработки структурированных данных

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

diff [-c | -e | -f | -C число] [-br] 
     файл1 файл2

Утилита diff сравнивает содержимое исходных файлов и выдает на стандартный вывод список изменений, которые необходимо произвести, чтобы преобразовать файл1 в файл2. Она поддерживает следующие опции.

-b

Игнорировать пробельные символы в конце строк; остальные цепочки пробельных символов считать равными.

-c

Производить вывод в формате, обеспечивающем три строки контекста.

-C число

Производить вывод в формате, обеспечивающем заданное число строк контекста.

-e

Производить вывод в формате, пригодном для подачи на вход редактора ed и преобразования файла1 в файл2.

-f

Производить вывод в альтернативном формате, напоминающем -e, но в обратном порядке и не предназначенном для подачи на вход редактора ed.

-r

Если файл1 и файл2 представляют собой каталоги, применять утилиту diff рекурсивно к одноименным и однотипным обычным файлам и каталогам. Если только один из файлов является каталогом, в нем сравнивается "тезка" другого исходного файла.

В качестве примера использования служебной программы diff сравним две версии бинарных утилит (см. листинг 6.18). Начальный фрагмент результата показан в листинге 6.19. Видно, что различия, по сути, сводятся к добавлению новых файлов.

diff -r binutils-2_14 binutils-2_14-branch
Листинг 6.18. Пример использования служебной программы diff.
diff -r binutils-2_14/bfd/version.h binutils-2_14-branch/bfd/version.h
1c1
< #define BFD_VERSION_DATE 20030612
---
> #define BFD_VERSION_DATE 20031007
Only in binutils-2_14-branch/binutils: ChangeLog
Only in binutils-2_14-branch/binutils: arlex.c
Only in binutils-2_14-branch/binutils: deflex.c
Only in binutils-2_14-branch/binutils: rclex.c
Only in binutils-2_14-branch/binutils: syslex.c
Only in binutils-2_14-branch: config.guess
Only in binutils-2_14-branch/gas: ChangeLog
Only in binutils-2_14-branch/gas/config: tc-ns32k.c
Only in binutils-2_14-branch/gas: configure
Only in binutils-2_14-branch/gas: configure.in
Only in binutils-2_14-branch/gas: itbl-lex.c
. . .
Листинг 6.19. Фрагмент возможного результата работы служебной программы diff.

Если нужно проверить два файла на совпадение, предпочтительнее воспользоваться не утилитой diff, а более простой и быстрой служебной программой cmp:

cmp [-l | -s] файл1 файл2

По умолчанию cmp выдает на стандартный вывод номера байта и строки, где встретилось первое отличие. Опция -l предписывает выдавать все отличия в виде номеров и содержимого (восьмеричного) байт. По опции -s отличия не выдаются, возвращается лишь соответствующий код завершения (0 - файлы совпадают, 1 - файлы различаются, больше единицы - зафиксирована ошибка).

Если в продолжение примера с утилитой diff сравнить две версии файла version.h посредством cmp (см. листинг 6.20), результат будет выглядеть так, как показано в листинге 6.21.

cmp -l binutils-2_14/bfd/version.h\
  binutils-2_14-branch/bfd/version.h
Листинг 6.20. Пример использования служебной программы cmp.
30 60 61
31 66 60
32 61 60
33 62 67
Листинг 6.21. Возможный результат работы служебной программы cmp.

Еще одно средство выявления различий (и, кроме того, совпадений) текстовых файлов - служебная программа comm:

comm [-123] файл1 файл2

Она читает файл1 и файл2 (их содержимое должно быть отсортировано в лексикографическом порядке) и выводит результаты в три столбца:

  1. строки, входящие только в файл1;
  2. строки, входящие только в файл2;
  3. строки, входящие в оба файла.

Опции -1, -2 или -3 подавляют вывод соответствующих столбцов. Так, comm -12 выводит строки, общие для обоих файлов, comm -23 - имеющиеся только в файле1, comm -123 не выводит ничего.

В стандарте POSIX-2001 приведен следующий пример использования служебной программы comm. Пусть файл xcu содержит отсортированный список утилит, вошедших в данный стандарт, файл xpg3 - аналогичный список для спецификации X/Open Portability Guide, Issue 3, а файл svid89 представляет собой отсортированный список утилит из System V Interface Definition Third Edition. Тогда конвейер, показанный в листинге 6.22, выдаст список служебных программ, фигурирующих в спецификациях XPG3 и SVID, но не вошедших в стандарт IEEE Std1003.1-2001.

comm -12 xpg3 svid89 | comm -23 - xcu
Листинг 6.22. Пример использования служебной программы comm.

Для контроля целостности файлов (не являющегося, впрочем, криптостойким), предназначена служебная программа

cksum [файл ...]

Для каждого файла - аргумента она выдает на стандартный вывод подсчитанную по стандарту ISO/IEC 8802-3:1996 (Ethernet) контрольную сумму, количество байт и имя.

Применение утилиты cksum - полезный элемент оформления поставляемых приложений.

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?