В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Средства обработки структурированных данных
Простейшие средства обработки текстовых файлов
Согласно определению, данному в стандарте 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 делят исходный файл "по-братски": первой достается первая строка, второй - все остальные.