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

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

Аннотация: Описываются служебные программы, осуществляющие обработку текстовых файлов. Приводятся примеры их комбинирования. Определяется понятие регулярного выражения. Рассматриваются средства обработки каталогов.
Ключевые слова: файл, вывод, CAT, опция, стандартный ввод, перенаправление вывода, shell, утилита, конкатенация файлов, просмотр файлов, страница, ПО, программа, команда, байт, аргумент опции, основание, именованный символ, head, tail, фильтр, заголовок, имя файла, длина, хвостовик, аргументы командной строки, столбец, аргумент, печать, слияние, нумерация, поле, отступ, терминал, список, каталог, слово, сортировка, ключ сортировки, разделитель полей, определение, ключ, автор, цепочка символов, код завершения, XPG3, portability, guide, issue, system, interface definition, edition, SVID, IEEE, контроль целостности, Ethernet, контрольная сумма, регулярное выражение, полное регулярное выражение, шаблон, конкатенация регулярных выражений, базовое регулярное выражение, расширенное регулярное выражение, очередь, односимвольное регулярное выражение, специальный символ, диапазон символов, класс символов, управляющие, элемент алфавитного сравнения, класс, многосимвольное регулярное выражение, подвыражение, обратная ссылка, сопоставление, интервальное выражение, подцепочка, фиксация границ, фиксатор начала, фиксатор конца, операции, повторитель, операция логического ИЛИ, место, действие, синтаксис, потоковый редактор, текстовые файлы, сценарий, функция, буфер, адрес, входной, контекстный адрес, командная строка, метка, ASCII, цикла, отрицание, управляющий комментарий, остаток, AWK, оператор, запись, перевод строки, разделитель записей, переменная, входная строка, фигурные скобки, выражение, встроенная функция, псевдослучайное число, замена вхождения, поиск, вычисление, группа, специальная переменная, число элементов в массиве, массив, пробел, формат вывода, значение, echo, список поиска, точка монтирования, компиляция регулярного выражения, структурный тип, память, указатель, константы, приложение, Дополнение, множества, сжатие последовательности символов, обратный, кратность, проекция, базы данных, paste, горизонтальное соединение, СУБД, соединение отношений, элемент списка, элемент каталога, позиционирование, потоки управления, чтение элемента каталога, шаблон имен файлов, генерация маршрутных имен, удовлетворяющих заданному шаблону, открытие каталога, экранирование, basename, маршрутное имя

Простейшие средства обработки текстовых файлов

Согласно определению, данному в стандарте POSIX-2001, текстовым называется файл, символы которого объединены в строки длиной не более {LINE_MAX}, не содержащие нулевого символа.

Вероятно, простейшей операцией с файлами (не обязательно текстовыми) является их выдача на стандартный вывод, что обеспечивается посредством утилиты

cat [-u] [файл ...]

Несмотря на внешнюю простоту, применение служебной программы cat сопряжено с рядом тонкостей. Во-первых, опция -u предписывает передавать на стандартный вывод байты из входных файлов без задержек, это означает, в частности, отмену буферизации стандартного вывода. Во-вторых, если не указаны исходные файлы или в качестве аргумента задан знак минус, используется стандартный ввод. Минус может фигурировать в командной строке несколько раз, стандартный ввод не закрывается и не переоткрывается. Например, допустимы команды, показанные в листинге 6.1, причем первая обеспечит ввод двух интерактивных вставок, а вторая эквивалентна третьей (читателю предлагается самостоятельно объяснить данный факт).

cat f1.txt - f2.txt - f3.txt
cat g1.txt - g2.txt - g3.txt < input.txt
cat g1.txt - g2.txt /dev/null g3.txt < input.txt
cat f1.txt f2.txt > f1.txt
Листинг 6.1. Пример использования утилиты cat.

В-третьих, нужно учитывать особенности перенаправления вывода командным интерпретатором shell. В общем случае утилита cat выдает результат конкатенации содержимого файлов -аргументов, но выполнение четвертой команды, показанной в листинге 6.1, приведет к утрате содержимого файла f1.txt.

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

more [опция ...] [файл ...]

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

Программа more - довольно мощный просмотрщик файлов со своей системой команд, которую мы, однако, описывать не будем. Отметим лишь возможности поиска и перемещения по файлам. Трактовка аргументов аналогична cat, а из опций выделим три.

-n число

Задает число строк, выдаваемых на экран.

-p команды more

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

-s

Сжимать последовательные пустые строки в одну.

Утилита more часто используется как заключительное звено конвейеров для удобного просмотра результатов.

Для просмотра нетекстовых файлов рекомендуется служебная программа

od [опция ...] [файл ...]

Она выдает на стандартный вывод содержимое исходных файлов в формате, заданном пользователем, а также в виде блоков, каждый из которых в простейшем (и наиболее употребительном) случае состоит из шестнадцати байт и занимает при выводе одну строку. В начале подобной строки располагается смещение блока от начала файла, затем следует содержимое блока. С помощью аргумента опции -A можно задать основание системы счисления для смещений ( d - десятичное, o - восьмеричное, x - шестнадцатеричное, n - не выдавать смещение). Формат выдачи содержимого определяется аргументом опции -t. Помимо перечисленных типов могут быть заданы a ( именованные символы ), c (символы), f (вещественные числа), u (беззнаковые десятичные). За спецификациями d, f, o, u и x может следовать десятичное число - количество байт в одном значении заданного типа; за спецификацией f - символы F, D или L, указывающие тип вещественных чисел ( float, double или long double, соответственно), а за спецификациями d, o, u, x - спецификаторы целочисленного типа C ( char ), S ( short ), I ( int ) или L ( long ).

Рассмотрим пример. Пусть файл ascii.tab содержит байты от

od -A x -t a ascii.tab
Листинг 6.2. Пример использования утилиты od.
000000 nul soh stx etx eot enq ack bel  bs  ht  nl  vt  ff  cr  so  si
000010 dle dc1 dc2 dc3 dc4 nak syn etb can  em sub esc  fs  gs  rs  us
000020  sp   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /
000030   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?
000040   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
000050   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _
000060   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
000070   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ del
000080
Листинг 6.3. Возможный результат использования утилиты od.

Полезная возможность - взглянуть на начало файла, чтобы понять, нуждается ли он в более детальном изучении. Эта возможность реализуется служебной программой head:

head [-n число] [файл ...]

Утилита head копирует на стандартный вывод указанное число (по умолчанию - 10) начальных строк исходных файлов (или весь файл, если он слишком короткий).

"Симметричная" служебная программа - tail

tail [-f] [-c число | -n число] [файл]

выдает на стандартный вывод конец исходного файла, начиная с указанного места. Если задана опция -c, единицей измерения является байт, если -n - строка. Числовой аргумент опции может быть задан со знаком; знак + означает, что отсчет байт (строк) идет от начала файла.

Опция -f полезна для слежения за растущими файлами, в которые пишет какой-либо другой процесс. При наличии этой опции утилита tail не завершается по достижении конца файла, но ждет появления новых данных и выводит их.

Рассмотрим примеры. Команда

tail -f f1

выдаст последние десять строк файла f1, за которыми последуют строки, добавленные к файлу f1 в промежуток времени между запуском и терминированием утилиты tail.

В качестве примера совместного использования служебных программ head и tail приведем фрагмент одного из командных файлов ОС Linux (см. листинг 6.4).

echo "Reloading automounter: checking\
for changes ... "
TMP=/var/run/autofs.tmp
getmounts > $TMP
for i in /var/run/autofs.*.pid
do
 pid=`head -n 1 $i 2>/dev/null`
 [ "$pid" = "" ] && continue
 command=`tail -n +2 $i`
 if ! grep -q "^$command" $TMP
 then
   echo "Stopping automounter: $command"
   kill -USR2 $pid
 fi
done
rm -f $TMP
Листинг 6.4. Пример использования служебных программ head и tail.

Отметим, что здесь утилиты head и tail делят исходный файл "по-братски": первой достается первая строка, второй - все остальные.

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

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