По-английски слово кот пишется так же как и одна из первых команд, которые приходится осваивать человеку, только что столкнувшемуся с ОС UNIX - cat (сокращение слова concatenation — объединение). Действительно, изначально команда cat предназначалась для объединения содержимого нескольких файлов в один, однако, может использоваться и для выполнения ряда других функций.

Дэниэл Гилли в книге «UNIX POWER TOOLS» предлагает четыре способа «ободрать шкуру с кота» — четыре способа использования команды cat (см. врезку). Однако, с точки зрения традиций русского языка, это не порядок — у нас дерут либо только «три шкуры», либо надо дотягивать до семи.

Шкура №5

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

%cat book >null

Если после нажатия клавиши Enter система вывела сообщение «Cannot open book: No such file or directory», значит, что файл не существует, все нормально и можно продолжать объединять файлы. Если же команда отработала молча, будьте осторожны: файл book уже имеется. Переадресация экранного вывода на устройство null полезна в том случае, если вас интересует не содержимое файла, а только сам факт его существования. Способ проверки существования файла с помощью команды cat, возможно надуманный, но, тем не менее, он работает.

Шкура №6

Шестая шкурка также валяется недалеко от пятой. Команду cat можно использовать для простого копирования файлов:

%cat original>copy

В результате выполнения этой команды содержимое файла original будет переписано в файл с именем copy.

Если ваш UNIX «понимает» иcполняемые файлы, начинающиеся с комбинации #! , то можно использовать cat для создания самопечатающихся файлов, например, для своей собственной системы HELP. Введите последовательность строк:

%cat > help
#!/bin/cat
Read the User Guides and Manuals!
Ctrl-c
%chmod +x help

В результате будет создан исполняемый файл help, печатающий при обращении к нему «полезный» совет:

%help
Read the User Guides and Manuals!
%

Изюминка использования #! в том, что для выполнения скрипта help никакой shell вообще не требуется — он выполняется ядром ОС.

Большинство приведенных примеров демонстрируют не столько возможности самой команды cat, сколько гибкость использования оболочки shell. Поскольку оболочек для UNIX существует достаточно много, то и конкретные детали вариантов использования команды cat могут быть различными. Может быть различным и мнение по применению команды cat,.например, типа «Если вы используете команду cat всего с одним аргументом, то значит вы занимаетесь не совсем тем, чем вам следовало бы заниматься».

Шкура №7

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

cat -v list

позволяет делать видимыми при выводе на экран непечатные символы, содержащиеся в файле list (кроме символов табуляции, новой строки и новой страницы). Управляющие ASCII-символы восьмеричного диапазона 000-037 выводятся в формате ^n, где n — соответствующий печатный ASCII- символ из восьмеричного диапазона 100-137(@, A, B, C,…, X, Y,.Z, [, , ], ^ и _). Символ DEL выводится как ^?. Другие непечатные символы выводятся как M-x, где х — ASCII символ, определяемый младшими семи битами кода соответствующего непечатного символа. Дополнительно с опцией -v могут быть использованы следующие:

-t показывает символы табуляции в виде ^I, а символы конца страницы в виде ^L;
-e вызывает печать дополнительного символа $ в конце каждой строки.

Если обычный вариант

cat my_file

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

cat -v -t my_file

Из жизни кота

Несколько примеров из жизни опций команды cat.

  • Порой и печатные символы могут доставлять определенные хлопоты. Представим, что в ответ на ваши команды система вывела следующие сообщения:

%ls Bobik     Tobik     Polcan
%cat Polcan
Cannot open polcan:
No such file or directory

Что с файлом Polcan? Вы своими глазами видите, что он находится в текущем каталоге, но в то же время его там как бы и нет — команда ls его «видит», а вот cat нет.

Попробуем разобраться в данном недоразумении с помощью все той же команды cat.

%ls -l |cat -v -t -v
total 23$
-rw 1 dog 28 7 Jun 19:46 Bobik$
-rw 1 dog 112 7 Jun 19:47 Tobik$
-rw 1 dog 37 7 Jun 20:11       Polcan$

Теперь все ясно. Оказывается, в имени третьего файла присутствует пробел.

  • Вывод на экран текста с большим количеством пустых строк приводит к потере экранного пространства, а иногда и сильно затрудняет целостное восприятие. Чаще всего с этим сталкиваешся при чтении инструкций по самой системе UNIX с помощью команды man на 14-дюймовом мониторе, когда приходится перелистывать полностью пустые экраны.

Версия cat для BSD имеет опцию -s, по которой вместо подряд стоящих пустых строк выводится только одна. Однако, проблема несколько усложняется тем, что пустые видимые строки могут порождаться не только символами конца строки, но и пробелами, знаками табуляции и т.п.Следующая командная строка с использованием cat будет заменять множественные видимые пустые строки в файле myfile на одинарные:

%sed ?s/^[ SPACETABCTRL-vCTRL-m ]*$//? myfile |cat -s

Если команда cat не имеет опции -s, или она означает что-то другое (например, cat -s в ОС IRIX не выдает сообщений о несуществующих файлах), то можно написать скрипт, который будет делать то же самое:

%sed ?s/^[SPACETABCTRL-vCTRL-m]*$/d? ${1+»$@»}

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

  • n В некоторых клонах UNIX команда cat имеет опцию -n, позволяющую последовательно нумеровать выводимые на экран строки файлов. Если имеющаяся у вас версия cat не имеет этой опции, а вам непременно хочется вывести пронумерованные строки, не отчаивайтесь. Такого же эффекта можно достичь с помощью команды pr:

рr -n имя_файла

Помните, ОС UNIX так же неисчерпаема, как и атом.


Шкура №1

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

%cat файл1 или

%cat файл1 файл2 файл3…

Команда cat не вставляет каких-либо разделителей между файлами, поэтому если результирующий вывод превысит один полный экран, вы вряд ли успеете прочитать первые строки до того, как они «убегут». Поэтому для вывода больших файлов на экран лучше пользоваться другими командами типа more, less, page и т.п.

Второй способ — использовать комбинацию cat с другими командами UNIX. В качестве простейшего (хотя и абсурдного с точки зрения использования команды more) может быть следующий пример:

%cat имя_файла | more

Можно привести и более содержательный пример. Представим, что необходимо выполнять некоторые процедуры редактирования в различном сочетании, каждая из которых оформлена в виде отдельного скрипта, содержащего командные строки для редактора ed. Если необходимо применить несколько скриптов к вашему файлу myfile, то совсем необязательно их предварительно объединять в один общий. Дополнительную гибкость можно получить комбинируя их непосредственно в командной строке с помощью команды cat:

%cat script1 script17 script3 | ex - myfile

Шкура №2

Вторая форма использования команды cat:

%cat файлы > новый_файл

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

%cat chapter1 chapter2
chapter3 > book

будет создан или перезаписан файл book, состоящий из содержимого трех файлов chapter1, chapter2 и chapter3. Содержимое файлов объединяется в порядке перечисления их имен в командной строке, а сами объединяемые файлы chapter1, chapter2 и chapter3 в результате выполнения команды не изменяются.

Типичная ошибка заключается в ожидании, что команда

%cat book chapter4 > book

добавит файл chapter4 в конец файла book. На самом деле после выполнения команды файлы book и chapter4 окажутся идентичными. Решение упомянутой задачи приведено в пункте 3.

Шкура №3

%cat файл >>
существующий_файл
%cat файлы >>
существующий_файл

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

%cat chapter4 >> book
%cat note1 note2 note3 >> note_list
%cat signature >> letter

Последний пример может быть иллюстрацией, как добавить вашу электронную подпись в конец письма. Не забудьте напечатать в командной строке двойной знак «больше», иначе все письмо окажется состоящим из одной подписи.

Шкура №4

Четвертая шкура может быть представлена следующей формой команды cat:

%cat > новый_файл

После ввода этой команды все, что вы напечатаете на клавиатуре, станет содержимым нового файла. Закончить ввод можно с помощью комбинаций клавиш Ctrl-d или Ctrl-c. К сожалению, данный способ ввода текста в файл не позволяет вернуться к предыдущей строке, но в пределах одной строки можно вносить исправления (клавиши Delete и BackSpace).

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