Операционная система UNIX (руководство пользователя)

 

1. Общие сведения о системе Unix

2.Основные сведения для пользователей Unix

3. Файловая система

4. Обзор программных средств

5. Руководство по командной среде FACE

6. Редактор текстов ed

7. Экранный редактор vi

8. Shell - интерпретатор командного языка

9. Средства программирования shell

10. awk - язык сканирования и обработки текста

Приложение 1. Файловая система UNIX

Приложение 2. Основные команды системы UNIX

     

1. Общие сведения о системе Unix

1.1. Основные функции и компоненты системы UNIX

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

  • основная цель системы - это выполнять широкий спектр заданий и программ;
  • интерактивное окружение, которое позволяет вам связываться напрямую с компьютером и получать немедленно ответы на ваши запросы и сообщения;
  • многопользовательское окружение, которое позволяет вам разделять ресурсы компьютера с другими пользователями без уменьшения производительности. Этот метод называется разделением времени. Система UNIX взаимодействует с пользователями поочередно, но так быстро, что кажется, что взаимодействует со всеми пользователями одновременно;
  • многозадачное окружение, которое позволяет вам выполнять более одного задания в одно и тоже время.

Система UNIX имеет 4 основных компонента:

ядро -
это программа, которая образует ядро операционной системы; она координирует внутренние функции компьютера ( такие как размещение системных ресурсов). Ядро работает невидимо для вас;
shell -
это программа, которая осуществляет связь между вами и ядром, интерпретируя и выполняя ваши команды. Так как она читает ваш ввод и посылает вам сообщения, то описывается как интерактивная;
commands -
это имена программ, которые компьютер должен выполнить. Пакеты программ называются инструментальными средствами. Система UNIX обеспечивает инструментальными средствами для таких заданий как создание и изменение текста, написание программ, развитие инструментария программного обеспечения, обмен информацией с другими посредством компьютера;
file system -
файловая система - это набор всех файлов, возможных для вашего компьютера. Она помогает вам легко сохранять и отыскивать информацию.

1.2. Ядро

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

	                    Ядро

	             \     Распределение  /
	               \     ресурсов   /
	                 \   системы  /
	                   \        /
	        Управление   \    /   Обслуживание
	         памятью       \/     файловой
	                      /  \    системы
	                    /      \
	                  / Контроль \
	                /   доступа    \
	              /   к компьютеру   \

Рис. 1

1.3. shell

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

1.4. Команды

Программа - это набор инструкций для компьютера. Программы, которые могут быть выполнены компьютером без предварительной трансляции, называются исполняемыми программами или командами. Как обычному пользователю системы UNIX вам доступно множество стандартных программ и инструментальных средств. Если вы используете систему UNIX для написания программ и развития программного обеспечения, то вы также можете задействовать системные вызовы, подпрограммы и другие инструментальные средства. И, конечно, любая написанная вами программа будет в вашем распоряжении.

Этот раздел знакомит вас со многими программами и инструментальными средствами системы UNIX, которые вы будете использовать достаточно часто. Если вам будет необходима более полная информация по каким-либо стандартным программам, обратитесь к "Руководству программиста".

1.4.1. Что делают команды

Внешний круг системы UNIX образуют программы и инструментальные средства системы, разделенные на категории функционально. Эти функции включают:

программное окружение -
несколько программ системы UNIX, устанавливающих дружественное программное окружение, обеспечивающее интерфейсы между системой и языками программирования и использование обслуживающих программ;
обработка текстов -
система обеспечивает программы, такие как строковый и экранный редакторы, для создания и изменения текстов, орфографическую программу проверки для обнаружения ошибок орфографии, и необязательный форматер текста для создания высококачественных копий, которые подходят для публикаций;
организация информации -
система предоставляет много программ, которые позволяют вам создавать, организовывать и удалять файлы и каталоги;
обслуживающие программы -
инструментальные средства, создающие графику и выполняющие вычисления;
электронная связь -
несколько программ (например, mail) предоставляют вам возможность передавать информацию другим пользователям и в другие системы UNIX.

1.4.2. Как выполнять команды

Чтобы ваш запрос был понятен системе UNIX вы должны ввести каждую команду в корректном формате или синтаксисе командной строки. Этот синтаксис определяет порядок, в котором вы вводите компоненты командной строки. И вы должны расположить все составные части командной строки в требуемом синтаксисом порядке, иначе shell не сможет интерпретировать ваш запрос.

Пример синтаксиса командной строки:

	command option(s) argument(s) <CR>

Для каждой командной строки системы UNIX вы должны ввести как минимум два компонента: имя команды и клавишу <RETURN>. (Обозначение <CR> используется в документации как инструкция для нажатия клавиши RETURN). Командная строка может также содержать ключи и аргументы. В указанном примере синтаксиса командной строки:
command - это имя программы, которую вы хотите выполнить;
option - ключи, которые указывают как запустить команду;
argument - указывает на данные, которые эта команда обрабатывает, обычно это имя каталога или файла.

В командной строке, которая включает ключи и/или аргументы, каждый компонент отделяется друг от друга по крайней мере одним пробелом. Если аргумент содержит пробел, его надо заключить в двойные кавычки. Например, если аргумент sample 1, то вы должны указать его в командной строке как "sample 1". Если вы позабудете поставить двойные кавычки, то shell будет интерпретировать sample и 1 как два отдельных аргумента.

Некоторые команды позволяют вам указывать несколько и/или аргументов в одной командной строке. Например:

 Пример.
	  ls     -l -i     file1 file2 file3
	команда   ключи        аргументы

В этом примере команда ls использует два ключа -l и -i и три аргумента file1, file2 и file3. Ключ -l обеспечивает информацию в длинном формате, включая режим, владельца и размер, а ключ -i печатает номер inode. Система UNIX обычно позволяет вам группировать ключи, например -li, и выводить их в любом порядке. Этого нельзя делать с аргументами.

Невзирая на разное количество компонентов, не забудьте в конце командной строки нажать клавишу <RETURN>.

Чтобы выполнить команду, введите командную строку, когда на экране появится подсказка (например, символ #). Shell рассмотрит вашу команду как ввод, найдет один или более каталогов, чтобы вызвать программу, которую вы указали, и перенаправит ваш запрос вместе с затребованными программами ядру. Ядро последует инструкциям в программе и выполнит команду, которую вы запрашивали.

После завершения выполнения программы, shell сигнализирует, что готов выполнить следующую команду, напечатав подсказку.

1.5. Файловая система

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

Файл, который является основной единицей системы UNIX, может быть: обыкновенным файлом, справочником, специальным файлом или символическим каналом связи.

1.5.1. Обыкновенные файлы

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

1.5.2. Справочники

Справочники являются супер-файлами, которые могут содержать файлы или другие справочники. Обычно файлы, содержащиеся в них, устанавливают отношения каким-либо способом. Например, справочник, названный sales может хранить файлы, содержащие цифры ежемесячных продаж, названные jan, feb, mar, и т.д. Вы можете создать каталоги, добавить или удалить файлы из них или удалить каталоги.

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

Система UNIX также содержит несколько справочников для собственного использования. Структура этих справочников аналогична во всех системах UNIX. Этот справочник, включающий в себя несколько системных справочников, размещается непосредственно под справочником root. Справочник root (обозначенный /) является исходным в файловой структуре UNIX. Все справочники и файлы иерархически располагаются ниже.

1.5.3. Специальные файлы

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

1.5.4. Символические каналы связи

Символические каналы связи - это файлы, которые указывают на другие файлы.

1.6. Расположение системы

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

Для системы UNIX все файлы одинаковы. Это делает файловую структуру UNIX легкой в использовании. Например, вам нет необходимости указывать требования к памяти для ваших файлов, т.к. система автоматически это сделает для вас. Или если вам или написанной вами программе необходим доступ к определенному устройству (например, принтеру) вы указываете устройство также как любой из ваших файлов. В системе UNIX существует только один интерейс для всего вашего ввода и вывода для вас; это упрощает ваше взаимодействие с системой.

Справочник root содержит несколько важных системных справочников:

/stand -
содержит загрузочные программы и файлы данных, используемые в процессе загрузки;
/sbin -
содержит основные исполняемые программы, используемые в процессе загрузки и при восстановлении системы;
/dev -
содержит специальные файлы, которые представляют периферийные устройства (например, консоль, построчно-печатное устройство, терминалы пользователя и диски);
/etc -
содержит машинно-зависимые файлы конфигурации и базы данных организации системы;
/home -
корневой справочник поддерева для справочника пользователя;
/tmp -
содержит временные файлы;
/var -
корневой справочник поддерева для изменяющихся файлов (например, файлы log);
/usr -
содержит другие справочники, включая lib и bin.

Справочники и файлы, созданные вами, охватывают часть файловой системы, которая контролируется вами. Другая часть файловой системы обслуживается операционной системой: /sbin, /dev, /tmp и /usr.

В этом разделе вы познакомились с основными принципами операционной системы UNIX. Следующие разделы помогут применить эти принципы.

1.7. Принятые соглашения

Следующие соглашения используются в данном руководстве:

< > -
ввод, который не появляется на экране (например, пароль, табуляция, RETURN) в тексте приводится в угловых скобках;
<^char> -
управляющие символы приводятся тоже в угловых скобках, т.к. они не появляются на экране во время ввода. Символ ^ означает управляющую клавишу (обычно она называется CTRL). Управляющую клавишу и символ char необходимо нажимать одновременно;
[] -
ключи и аргументы команды, которые являются необязательными, заключаются в квадратные скобки;
| -
вертикальная черта разделяет необязательные аргументы, из которых вы должны выбрать один. Например, когда командная строка имеет следующий формат:
	command [arg1|arg2]

вы можете выбрать либо arg1 либо arg2, когда выдаете команду;

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

В примерах команд знак $ используется как подсказка интерпретатора команд shell. Какой бы символ не использовался в качестве подсказки, имейте в виду, что этот символ выдается на экран системой и его выводить не надо. В документации этот символ иногда будет присутствовать в начале командной строки.

Во всех разделах приведены примеры, в которых показано, как выглядят экраны терминалов, когда вы взаимодействуете с системой UNIX. Эти примеры показывают как пользоваться редакторами системы UNIX, писать короткие программы и выполнять команды. Ввод (символы, вводимые вами) и вывод (символы печатаемые системой UNIX) приведены на этих экранах в соответствии с соглашениями, приведенными выше.

2. Основные сведения для пользователей Unix

В этом разделе описывается как использовать систему UNIX. Уделено особое внимание установке требуемых характеристик терминала, объясняется как использовать клавиатуру, получить регистрационное имя, войти в систему и выйти из нее, ввести команды.

Чтобы установить контакт с системой UNIX вам необходимо иметь:

  • терминал;
  • регистрационное имя, которое идентифицирует вас как полномочного пользователя;
  • пароль, который проверяет вас на идентичность;
  • инструкции для диалога и доступа с системе UNIX, если ваш терминал напрямую не связан с компьютером.

2.1. Терминал

Терминал является устройством ввода/вывода: вы используете его для ввода запросов системе UNIX, а система - для выдачи ответов вам. Существует два основных вида терминалов: видеотерминал и печатающий терминал.

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

2.6. Исправление ошибок ввода

Существует несколько способов исправления ошибок ввода. Символ @ стирает текущую строку, а клавиша <BACKSPACE> и <^h> стирает последний введенный символ. Эти клавиши и знаки являются значениями по умолчанию. Функции, которые они выполняют, могут быть переназначены другим клавишам.

2.6.1. Стереть текущую строку: знак @

Когда вы нажимаете клавишу @, то знак @ добавляется в конец строки и курсор перемещается на новую строку. Строка, содержащая ошибку, не стирается с экрана, но она игнорируется.

Знак @ работает только на текущей строке. В следующем примере сделана орфографическая ошибка при вводе командной строки.

Пример.
	whooo@

тогда введите символ @ и затем введите правильно команду:

	who<CR>

2.6.2. Стереть последний введенный символ: <^h> и <BACKSPACE>

<^h> и <BACKSPACE> стирают последний введенный символ в текущей строке. Когда вы нажимаете одну из этих клавиш, то курсор возвратится на последний символ и предоставит вам возможность заново его ввести. Этот способ является самым легким для исправления ошибки ввода.

Таким способом вы можете удалить несколько символов. Например, в следующем примере стираются два символа с помощью клавиши <BACKSPACE>:

Пример.
	dattw<BACKSPACE><BACKSPACE>e<CR>

Система UNIX будет интерпретировать эту строку, как правильно введенную команду date.

2.6.3. Переназначение функции удаления

Вы можете заменить клавиши, которые удаляют строку и стирают символы. Если вы хотите сделать эту замену для одной рабочей сессии, то вы можете выдать команду для shell: сделать переназначение. После того как вы выйдете из системы, значение этих величин по умолчанию станет прежним. Если вы хотите использовать новые клавиши постоянно, то вы должны указать это переназначение в файле, называемом .profile.

Прежде чем начать переназначение функций удаления, вы должны учесть 3 момента. Первое, когда вы переназначаете на клавишу, используемую по умолчанию, тем самым вы можете лишиться функции, используемой клавишей по умолчанию. Например, если вы переназначили функцию стирания с клавиши <BACKSPACE> на клавишу #, то вы не сможете воспользоваться клавишей <BACKSPACE> для стирания символа. Но также вы можете иметь две клавиши, которые выполняют одну функцию.

Второе, такие переназначения наследуются любой другой программой системы UNIX, которая позволяет вам выполнить функцию, которую вы переназначили. Например, интерактивный редактор текста, названный ed, позволяет вам удалять текст той же клавишей, которую вы используете для исправления ошибок в командной строке shell. Таким образом, если вы переназначили функцию стирания на знак #, то вы также будете использовать этот знак для стирания символов, когда будете работать в редакторе ed. И при этом переназначении клавиша <BACKSPACE> не будет работать.

И третье, помните, что любое переназначение, которое вы выполните в вашем файле .profile не станет действенным, пока вы заново не войдете в систему. И кроме того, если сделаете ошибку при вводе вашего регистрационного имени или пароля, вы должны использовать прежнюю клавишу <BACKSPACE> для ее исправления.

Какую бы клавишу вы ни использовали помните, что она работает только на текущей строке. Убедитесь, что корректируете вашу ошибку до нажатия клавиши <RETURN>.

2.7. Использование специальных символов как буквенных

Что получится, если вы захотите использовать буквенное значение специальных символов? Так как по умолчанию система UNIX интерпретирует специальные символы как команды, то вы должны сказать системе, что нужно игнорировать специальные значения символов, если хотите использовать их как буквенные символы. Обратная косая черта (\) позволяет вам сделать это. Введите \ перед любым специальным символом, с которым вы хотите обращаться в его неизменном виде. Например, вы хотите добавить следующее предложение в файл:

	He bought three pounds @ $.05 cents each

Чтобы предотвратить интерпретацию системой UNIX знака @ как запрос на удаление символа, поставьте обратную косую черту перед знаком @. Если вы этого не сделаете, то система удалит все слова перед знаком @ и вы получите следующее предложение:

	$.05 cents each 

Чтобы избежать это, введите предложение в следующем виде:

	He bought three pounds \@ $.05 cents each 

2.8. Скорость

После того, как на экране терминала появится подсказка, вы можете осуществлять ввод с любой удобной вам скоростью, даже когда система UNIX выполняет команду или отвечает на нее. Так как ваш ввод и системный вывод появляются на экране одновременно, то появляющаяся на экране информация будет искажаться. Хотя для вас это будет неудобно, для работы системы INIX это не помеха, потому что система UNIX имеет возможность чтения вперед (?). Эта возможность позволяет системе управлять раздельно вводом и выводом. Система принимает и сохраняет ввод (ваш следующий запрос), на то время, пока посылает вывод (ответ на ваш последний запрос) на экран.

2.9. Останов команд

Чтобы остановить выполнение большинства команд, просто нажмите клавишу <BREAK> или <DELETE>. Система UNIX остановит выполнение программы и напечатает подсказку на экране. Это подсказка служит сигналом, что последняя запущенная на выполнение команда остановлена и система готова к приему следующей команды.

2.10. Использование символов управления

Найдите на клавиатуре клавишу управления. Обычно она помечается CONTROL или CTRL, и возможно находится либо левее буквы A или ниже буквы Z. Клавиша управления используется в комбинации с другими символами для выполнения некоторых действий над вводимой строкой. Вводимые таким образом команды называются символами управления. Некоторые управляющие символы выполняют те же действия, что и клавиши <BACKSPACE> и <TAB>. Другие определяют команды, которые являются специфичными для системы UNIX. Например, только управляющий символ (по умолчанию ^s) временно останавливает вывод, который печатался на экране терминала.

Чтобы ввести управляющий символ, нажмите одновременно сооответствующую буквенную клавишу и клавишу управления. Так как большинство управляющих символов не появляются на экране терминала при вводе, то они в документации приводятся в угловых скобках. Клавиша управления представляется в виде знака ^, стоящего перед буквой. Например, <^s> означает, что нужно одновременно нажать клавишу с буквой s и управляющую клавишу.

Для двух функций наиболее часто используются управляющие символы: вывод на экран и выход из системы. Чтобы приостановить вывод нинформации на экран видеотерминала, нажмите <^s>. Когда вы будете готовы прочитать следующую порцию информации, нажмите <^g> и вывод возобновится.

Чтобы завершить работу с системой UNIX, нажмите <^d>.

В дополнение, система UNIX использует управляющие символы для обеспечения тех возможностей, которые некоторые терминалы не могут выполнить посредством специальных клавиш. Если ваша клавиатура не имеет клавиши <BACKSPACE>, вы можете вместо нее воспользоваться клавишами <^h>. Вы можете вместо отсутствующей клавиши <TAB> воспользоваться клавишами <^i>.

Теперь, когда вы настроили терминал и изучили клавиатуру, вам осталось сделать еще один шаг, чтобы связаться с системой UNIX: вы должны получить регистрационное имя.

2.11. Получение регистрационного имени

Регистрационное имя - это имя, с помощью которого система UNIX проверяет, являетесь ли вы полномочным пользователем системы, во время запроса доступа к ней. Регистрационное имя вы должны вводить каждый раз, когда вы хотите войти в систему.

Чтобы получить регистрационное имя, обратитесь к администратору системы UNIX. Существует несколько правил выбора регистрационного имени. Обычно длина имени составляет от 3 до 8 символов. Оно может состоять из больших или маленьких букв, цифр, символа подчеркивания, но не может начинаться с цифры.

Однако ваше регистрационное имя, возможно, будет определяться конкретным применением. Примеры допустимых имен:

	startship
	mary2
	jmrs 

2.12. Связь с системой UNIX

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

Включите терминал. Если он напрямую связан с компьютером, то в верхнем левом углу немедленно появится подсказка:

	login:

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

  1. Введите телефонный номер, чтобы связаться с системой UNIX. Вы увидите на экране одно из следующих сообщений:
    BUSY -
    это означает, что канал занят. Повторите набор.
    NO ANSWER -
    это обычно означает, что система в нерабочем состоянии, потому что произошел технический сбой. Проверьте связь между терминалом, модемом и телефонной линией и попытайтесь набрать снова номер.
    ONLINE -
    это означает, что система доступна.
  2. Нажмите клавишу <RETURN>. На экране появится подсказка:
    	login:
  3. Множество бессмысленных символов может появиться на экране. Это означает, что телефонный номер, вызванный вами, настроен на другую скорость. Система UNIX пытается соединиться с вашим терминалом, но использует другую скорость. Нажмите клавишу <BREAK> или <RETURN>. Это сигнализирует системе, что нужно установить другую скорость. Если через несколько секунд система UNIX не отобразит подсказку login:, то вновь нажмите клавишу <BREAK> или <RETURN>.

2.13. Процедура регистрации

Когда появится подсказка login:, введите регистрационное имя и нажмите клавишу <RETURN>. Например, если ваше регистрационное имя startship, то строка регистрации будет выглядеть следующим образом:

	login: startship<CR>

Если вы сделаете ошибку при вводе вашего регистрационного имени, то вы можете исправить ее с помощью символа @ или клавиши <BACKSPACE>.

Примечание. Помните, что вы должны вводить маленькими буквами. Если при вводе будете использовать большие буквы, то система UNIX будет ожидать при приеме только большие буквы и посылать сообщения будет только большими буквами.

2.14. Пароль

Теперь система выдает вам подсказку для ввода пароля. Введите пароль и нажмите клавишу <RETURN>. Если при вводе вы сделаете ошибку, то можете исправить ее с помощью клавиши <BACKSPACE> или символа @. Система UNIX не отображает ваш пароль на экране с целью безопасности.

Если регистрационное имя и пароль допустимы в системе UNIX, то система может напечатать текущую информацию и затем подсказку команды.

Когда вы войдете в систему, то экран терминала будет выглядеть следующим образом:

	login:startship
        password:
        UNIX system news
        $

Если вы сделаете ошибку при входе в систему, UNIX напечатает сообщение:

	login incorrect 

Затем предоставит вам второй шанс войти в систему, выдав подсказку login: Экран будет выглядеть следующим образом:

	login:startship<CR>
        password:
        login incorrect
        login:

Если вы никогда не были зарегистрированы в системе UNIX, то ваша процедура регистрации может отличаться от описанной выше. Это может произойти в том случае, если администратор системы предусмотрел процедуру назначения временных паролей новым пользователям. Если вы имеете временный пароль, то система заставит выбрать новый пароль прежде, чем позволит зарегистрироваться.

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

В общем процедура входа в систему будет подобна следующей:

  1. Вы устанавливаете контакт; система UNIX отображает подсказку login:. Введите ваше регистрационное имя и нажмите клавишу <RETURN>.
  2. Система UNIX напечатает подсказку password:. Введите ваш временный пароль и нажмите клавишу <RETURN>.
  3. Система сообщит, что ваш временный пароль больше не действителен и предложит выбрать новый пароль.
  4. Система предложит ввести ваш старый пароль. Введите временный пароль.
  5. Система предложит ввести ваш новый пароль. Введите выбранный вами пароль.

    Пароль должен соответствовать следующим требованиям:

    • каждый пароль должен иметь по крайней мере 6 символов. Только первые 8 символов являются значимыми;
    • каждый пароль должен содержать по крайней мере 2 буквенных символа и одну цифру или специальный символ. Буквенный символ может быть набран либо на регистре больших символов либо малых;
    • каждый пароль должен отличаться от вашего регистрационного имени. Большие буквы и соответствующие им маленькие буквы эквивалентны;
    • новый пароль должен отличаться от старого по крайней мере на три символа.

    Примеры допустимых паролей:

    	mar84ch
            Jonath0n
            BRAV3S 
  6. Для проверки система просит вас заново ввести пароль. Введите снова пароль.
  7. Если вы введете новый пароль второй раз не так как в первый раз, то система сообщит вам, что пароль не совпадает и предложит повторить процедуру регистрации снова. Когда пароли совпадут, система отобразит подсказку.

    Следующий экран отображает описанную процедуру:

    	login:startship<CR>
            password:<CR>
            Your password has expired
            Choose a new one
            Old password:<CR>
            New password:<CR>
            Re-enter new password:<CR>
            $

2.15. Возможные проблемы при регистрации

Поведение терминала предсказуемо, если вы правильно настроили его. Однако иногда он может функционировать странно. Например, неправильно работает функция возврат каретки.

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

клавиатуру -
клавиши, помеченные CAPS, LOCAL, BLOCK должны находиться в состоянии блокировки. Обычно это делается простым нажатием этих клавиш;
модем -
если ваш терминал связан с компьютером через телефонную линию, убедитесь, что правильно установлены скорость передачи и дуплексная передача;
переключатели -
некоторые терминалы имеют несколько переключателей, которые должны быть установлены так, чтобы обеспечить совместимость с системой UNIX.

Теперь снова зарегистрируйтесь с системе UNIX.

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

Таблица 2
Локализация проблем при регистрации

Проблема Возможная причина Ваши действия
Бессмысленные символы Неверно установлена скорость в системе UNIX Нажмите клавишу <RETURN> или <BREAK>
Ввод/вывод производится большими буквами Терминал настроен на большие буквы Выйдите из системы и установите режим малых букв
Ввод осуществляется большими буквами, вывод - маленькими Клавиша CAPS (или CAPS LOCK) разблокирована Нажмите клавишу CAPS (или CAPS LOCK) для разблокировки
Ввод печатается дважды Терминал настроен на полудуплексный режим Установите дуплексный режим терминала
Неправильно работает клавиша TAB Табуляция установлена неверно Введите: stty -tabs
Канал связи не может быть установлен Терминал находится в режиме LOCAL или OFF-LINE Установите режим ON-LINE и попытайтесь зарегистрироваться снова
Канал связи (связь с системой UNIX) неоднократно прерывается Неверная телефонная линия или неверный порт Обратитесь к системному программисту

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

Некоторые проблемы могут быть специфичны для вашего терминала или модема. В этом случае обратитесь к документации по вашему конкретному устройству.

Ввод строки

	stty -tabs 

устанавливает табуляцию только для вашей текущей сессии. Чтобы установить табуляцию для всех сессий, добавьте эту строку в .profile.

3. Файловая система

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

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

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

3.1. Структура файловой системы

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

Обыкновенные файлы - это набор символов, хранящихся на диске. Они могут хранить тексты или программы или коды программ.

Специальные файлы соответствуют физическим устройствам (например, терминал или диск).

Символическая связь - это файл, который указывает на другой файл.

Справочник содержит имена других справочников (называемых подсправочниками) или файлов. Файлы вы можете группировать в справочники по своему выбору.

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

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

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

3.2. Ваш собственный справочник

После того как вы успешно завершили процедуру регистрации, система UNIX помещает вас в определенное место в структуре файловой системы, называемое вашим собственным справочником. Регистрационное имя, назначенное вам системой UNIX, обычно является именем этого справочника. Каждый пользователь с полномочным регистрационным именем имеет уникальный собственный справочник в файловой системе.

Система UNIX способна держать связь со всеми собственными справочниками, поддерживая один или более системных справочников для их организации. Например, собственные справочники с регистрационными именами startship, mary2 и jmrs содержатся в системном каталоге, называемом home.

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

3.3. Текущий справочник

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

Команда pwd печатает имя справочника, в котором вы сейчас работаете. Например, если ваше регистрационное имя startship и вы задаете команду pwd в ответ на первую после регистрации подсказку, то система UNIX ответит следующим образом:

	$ pwd<CR>
	/home/startship
	$

В ответ система назовет вам имя справочника, в котором вы работаете (startship) и местоположение этого справочника в файловой системе. Имя пути /home/startship говорит, что справочник root (обозначен косой чертой в строке) содержит справочник home, который в свою очередь содержит справочник startship. Все другие косые черты в имени пути используются для разделения имен справочников и файлов, и показывают положение каждого справочника по отношению к root. Имя справочника, которое показывает местоположение справочника в этом пути, называется полным именем справочника или именем пути.

Запомните, что вы можете определить ваше местоположение в файловой системе в любой момент времени, задав команду pwd. Это особенно полезно, если вы хотите прочитать или скопировать файл, а система UNIX говорит вам что файл, к которому хотите получить доступ, не существует. Этот файл может оказаться не в том справочнике, в котором вы ищете. Итак, команда pwd печатает полное имя пути справочника, в котором вы работаете в текущий момент времени.

3.4. Имя пути

Каждый файл и справочник системы UNIX идентифицируется уникальным именем пути. Имя пути показывает местоположение файла или справочника и обеспечивает направление поиска его. Существует 2 типа имени пути: полное и родственное.

3.4.1. Полное имя пути

Полное имя пути (иногда называемое абсолютным именем пути) дает направление, которое начинается в справочнике root и показывает путь далее по уникальной последовательности справочников к конкретному справочнику или файлу. Вы можете использовать полное имя пути для поиска любого файла или справочника в системе UNIX.

Так как полное имя пути всегда начинается со справочника root, то это имя начинается с символа косая черта (/). Последнее имя в полном имени пути может быть либо именем файла либо именем справочника. Все другие имена пути должны быть справочниками.

Чтобы понять как полное имя пути строится, обратитесь к следующему примеру. Предположим, что вы работаете в справочнике startship, расположенном в /home. Вы задаете команду pwd и система печатает полное имя пути вашего рабочего справочника:

	/home/startship 

где

/ -
это корневой справочник (root);
home -
системный справочник, расположенный на один уровень ниже справочника root;
/ -
разделяет имена справочников root и startship;
startship -
текущий рабочий справочник.

3.4.2. Родственное имя пути

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

Родственное имя пути начинается с имени справочника или файла.

Одна точка (.) означает текущий справочник, две точки (..) - справочник, непосредственно находящийся выше текущего справочника в иерархии файловой системы. Справочник, представленный двумя точками, называется родительским для справочника, обозначенного одной точкой (вашего текущего справочника).

Например, вы находитесь в справочнике startship, который содержит справочники draft, letters и bin и файл mbox. Родственным именем пути для каждого из них является просто его имя.

Справочник draft, принадлежащий справочнику startship, содержит файлы outline и table. Родственное имя пути от startship к файлу outline:

	draft/outline 

Обратите внимание, что косая черта в этом имени пути разделяет имя справочника draft и имя файла outline. Здесь наклонная черта показывает, что outline является подчиненным справочнику draft, т.е. draft является родителем outline.

Чтобы подняться к родителю вашего текущего справочника, вы можете ввести две точки (..). Это означает, что если вы находитесь в справочнике draft, то .. является именем пути к startship, и ../.. является именем пути к родительскому справочнику для startship, т.е. к home.

Из справочника draft вы также можете проследить путь к файлу sanders, указав имя пути ../letters/sanders. Две точки (..) приводит вас к starship. Затем имена letters и sanders ведут вас вниз через справочник letters к файлу sanders.

Табл. 3 приводит примеры полного и родственного имени пути.

Таблица 3
Примеры имен пути

Имя пути Значение
/ Полное имя пути справочника root
/usr/bin Полное имя пути справочника bin, который принадлежит справочнику usr, и который в свою очередь принадлежит справочнику root
/home/startship/bin/tools Полное имя пути справочника tools, принадлежащего справочнику bin, который принадлежит справочнику startship, а он в свою очередь - справочнику home, а home - справочнику root
bin/tools Родственное имя пути к файлу или справочнику tools в справочнике bin. Если текущим справочником является root (/), то система UNIX ищет /usr/bin/tools Если текущим справочником является startship, то система ищет полный путь: /home/startship/bin/tools
tools Родственное имя пути файла или справочника tools в текущем справочнике

3.5. Правила именования справочников и файлов

Вы можете давать справочникам или файлам любые имена в соответствии со следующими правилами:

  • допустимы все символы, за исключением /;
  • некоторые имена лучше не использовать, такие как пробел, табуляция и следующие: ? " # $ ^ ( ) ; < > [ ] | \ * @ ' ~ &. Если вы воспользуетесь символами пробел или табуляция в имени файла или справочника, то вы должны заключить имя в двойные кавычки в командной строке;
  • избегайте использования знаков + - или . в качестве первого символа в имени файла;
  • система UNIX различает большие и маленькие буквы. Например, система предполагает, что справочник (или файл) названный draft отличается от DRATF.

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

Пример.
	memo      MEMO       section2     raf:list
	file.d    chap3+4    item1_10     outline 

3.6. Организация справочника

В этом разделе описываются 4 системные команды, позволяющие вам организовывать и использовать структуру справочника:

mkdir -
создать новый справочник или подсправочник в вашем текущем справочнике;
ls -
напечатать список имен всех подсправочников и файлов в справочнике;
cd -
изменить ваше местоположение в файловой системе, т.е. перейти из одного справочника в другой;
rmdir -
удалить пустой справочник. Эти команды могут использовать либо полное имя пути, либо родственное. Две команды могут применяться без имени пути.

3.6.1. Команда mkdir - создать справочник

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

Синтаксис команды:

	$ mkdir имя справочника(ов)<CR>

Например, подсправочник draft создается при помощи следующей команды, выдаваемой из справочника home (/home/startship):

	$ mkdir draft<CR>
	$

Вторая подсказка говорит, что команда выполнилась успешно и подсправочник draft создался.

Также, находясь в справочнике home, можно создать другие подсправочники, такие как letters и bin, таким же способом:

	$ mkdir letters<CR>
	$ mkdir bin<CR>
	$

Пользователь может создать все три подсправочника (draft, letters и bin) одновременно, перечислив их всех в одной командной строке:

	$ mkdir draft letters bin<CR>
	$

Вы можете перейти к подсправочнику и в нем построить дополнительные подсправочники

3.6.2. Команда ls - напечатать содержимое справочника

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

Команда ls перечисляет имена всех файлов и подсправочников в указанном справочнике. Если вы не укажете справочник, то команда ls напечатает информацию о файлах и справочниках в вашем текущем справочнике.

Обратимся к примеру. Предположим, что вы зарегистрировались в системе UNIX под именем startship и задали команду pwd. Система напечатает имя пути /home/startship. Чтобы отобразить имена файлов и справочников в этом текущем справочнике, введите команду ls и нажмите клавишу <RETURN>. После того, как вы выполните последовательность этих команд, экран будет выглядеть следующим образом:

	$ pwd<CR>
	/home/startship
	$ ls<CR>
	bin
	draft
	letters
	list
	mbox
	$

Обратите внимание, что система выдает перечень справочников в алфавитном порядке. Если первым символом имени файла или справочника будет цифра или большая буква, то оно будет напечатано первым.

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

Синтаксис команды:

	ls имя пути <CR>

Имя пути может быть либо полным именем пути требуемого справочника, либо родственным. Например, вы можете получить содержание справочника draft, когда вы работаете в справочнике startship, если введете команду ls draft. Экран терминала будет выглядеть следующим образом:

	$ ls draft<CR>
	outline
	table
	$

В этом примере draft является родственным именем пути от родителя (starship) к подчиненному справочнику (draft).

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

	$ ls ..<CR>
	jmrs
	mary2
	startship
	$

Вы получите тот же результат, если зададите полное имя пути от root к home:

	ls /home<CR>

Вы можете распечатать содержимое любого системного справочника, к которому имеете право доступа, выполнив команду ls с полным или родственным именем пути.

Команда ls особенно полезна, если вы имеете много файлов и пытаетесь определить, существует ли определенный файл в вашем текущем справочнике. Например, вы находитесь в справочнике draft и хотите определить, есть ли в нем файлы outline и notes. Задайте команду ls следующим образом:

	$ ls outline notes<CR>
	outline
	notes: No such file or directory
	$

Система сообщит, что файл outline существует в этом справочнике, а вот файл notes не найден.

Команда ls не распечатывает содержимое файла. Для этих целей воспользуйтесь командами cat, pg, pr.

3.6.2.1. Часто используемые ключи команды ls

Команда ls может содержать ключи, которые перечисляют специфичные атрибуты файла или подсправочника. Чаще всего используются ключи -a и -l.

  1. Перечислить все файлы в справочнике.

    Имена некоторых файлов в вашем собственном справочнике начинаются с точки (например, .profile). Когда имя файла начинается с точки, он не включается в список, распечатываемый командой ls. Чтобы распечатать такие файлы, введите команду ls с ключом -a.

    Например, чтобы распечатать информацию о всех файлах в вашем текущем справочнике (starship), включая и файлы, имя которых начинается с точки, введите команду ls -a и нажмите клавишу <RETURN>. Экран будет выглядеть следующим образом:

    	$ ls -a<CR>
    	.
    	..
    	.profile
    	bin
    	draft
    	letters
    	list
    	mbox
    	$
  2. Распечатать содержание в укороченном формате.

    Ключи -C и -F команды ls используются достаточно часто. Вместе эти ключи распечатывают подсправочники и файлы справочников и помечают исполняемые файлы символом *, справочники - символом /, символическую связь(каналы) - символом @.

    Например, вы можете распечатать информацию о всех файлах вашего рабочего справочника startship, выполнив команду:

    	$ ls -CF<CR>
    	bin/    letters/        mbox
    	draft/  list*
    	$
  3. Распечатать содержание в расширенном формате.

    Возможно, более информативным ключом команды ls является ключ -l, который отображает содержание справочника в расширенном формате. Этот формат включает в себя: режим, число связей, владелец, группа, размер в байтах и время последней модификации каждого файла. Предположим, вы задали команду ls -l, находясь в справочнике startship:

    $ ls -l<CR>
    total 30
    drwx-xr-x  3 startship  project    96  Oct 27 08:16 bin
    drwx-xr-x  2 startship  project    64  Nov  1 14:19 draft
    drwx-xr-x  2 startship  project    80  Nov  8 08:41 letters
    -rwx-----  2 startship  project 12301  Nov  2 10:15 list
    -rw------  1 startship  project    40  Oct 27 10:00 mbox 

    Первая выводная строка (total 30) показывает объем дискового пространства в байтах. Последующие строки дают представление о справочниках и файлах в справочнике startship. Первый символ в каждой строке (d, -, l, b или c) говорит о типе файла:

    	d = справочник
    	- = обыкновенный файл
    	l = символическая связь(канал)
    	b = специальный блочный файл
    	c = специальный символьный файл 

    Таким образом на экране вы можете видеть, что справочник startship содержит три справочника и два обычных файла.

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

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

    Следующим является регистрационное имя владельца файла (в данном случае startship), и за ним - групповое имя файла или справочника (project).

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

3.7. Команда cd - изменить текущий справочник

Сразу же после регистрации в системе UNIX, вы попадаете в ваш собственный справочник. Пока вы будете работать в нем, он будет вашим текущим справочником. С помощью команды cd вы сможете работать в другом справочнике.

Сиснтаксис команды:

	cd имя-пути-нового-справочника<CR>

Любое допустимое имя пути (полное или родственное) может использоваться в качестве аргумента команды cd. Если вы не укажете имя пути, то команда переместит вас в ваш собственный справочник. Справочник, в который вы перешли, становится вашим текущим справочником.

Например, чтобы перейти из справочника startship в подчиненный draft, введите команду cd draft и нажмите клавишу RETURN. После получения подсказки вы можете проверить ваше новое местоположение, введя команду pwd. Экран терминала будет выглядеть следующим образом:

	$ cd draft<CR>
	$ pwd<CR>
	/home/startship/draft
	$

Теперь, находясь в справочнике draft, вы можете создать подсправочники в нем, задав команду mkdir, и новые файлы, используя редактор ed или vi.

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

Вы также можете использовать полное имя пути в команде cd. Например, чтобы перейти из справочника draft в справочник letters, введите:

	cd /home/startship/letters<CR>

Так как letters и draft являются подчиненными справочнику srartship, то вы можете использовать родственное имя пути ../letters в команде cd. Две точки (..) перемещают вас в справочник startship и /letters перемещает вас в letters.

Итак, команда cd изменяет ваш рабочий справочник. Аргументом команды cd является новое имя справочника. Если аргумент отсутствует, команда cd помещает вас в ваш собственный справочник.

Когда shell помещает вас в указанный справочник, то возвращается подсказка $. Чтобы получить доступ к справочнику, который не является вашим рабочим справочником, вы должны указать полное или родственное имя пути в командной строке.

3.8. Команда rmdir - удалить справочник

Если вам больше не нужен справочник, вы можете удалить его с помощью команды rmdir.

Синтаксис команды:

	rmdir имя(имена) справочника(ов)<CR>

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

Командой rmdir вы не можете удалить справочник, если вы не яаляетесь его владельцем или он не пустой. Если вы хотите удалить файл из справочника другого пользователя, то владелец должен дать вам право на запись для родительского справочника этого файла.

Если вы попытаетесь удалить справочник, в котором содержатся подсправочники и файлы, то команда rmdir напечатает сообщение:

	имя-справочника not empty 

Например, предположим, что вы имеете справочник memos, который содержит один подсправочник: tech и два файла june.30 и july.31. Если вы попытаетесь удалить справочник memos, то получите сообщение:

	$ rmdir memos<CR>
	rmdir: memos not empty
	$

Чтобы удалить справочник memos, вы должны сначала удалить его содержимое: подсправочник tech и файлы june.30 и july.31. Удалив содержимое справочника memos, можете удалить и его. Однако сначала переместитесь в родительский справочник (ваш собственный). Команда rmdir не отработает, если вы будете находиться в том же справочнике, который удаляете. Из своего собственного справочника задайте команду:

	rmdir memos<CR>

Если справочник memos пуст, то эта команда его удалит и возвратит вам подсказку.

3.9. Доступ к файлу и работа с ним

В этом подразделе описываются несколько команд системы UNIX, которые осуществляют доступ к файлу и производят обработку его в структуре файловой системы. Команды разделены на две группы: основные и advanced(?).

Основные команды являются фундаментальными в использовании файловой системы; advanced команды предполагают сложную технику обработки информации при работе с файлами.

3.10. Основные команды

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

Таблица 4
Основные команды

Команда Функция
cat Печатает содержимое указанного файла на терминал
pg Печатает содержимое указанного файла на терминал порциями или страницами
pr Печатает частично отформатированную версию указанного файла на терминал
cp Создает копию существующего файла
mv Перемещает или удаляет файлы
rm Удаляет файл
wc Распечатывает информацию о числе строк, слов и символов в файле
chmod Изменяет режим доступа к файлу (или справочнику)

3.10.1. Команды cat, pg, pr - распечатать содержимое файла

В системе UNIX существует три команды для распечатки содержимого файлов: cat, pg, pr. Команда cat выводит содержимое файла на экран терминала или, если вы укажете, в другой файл или новую команду.

Команда pg особенно полезна, если вы хотите прочитать содержимое большого файла, т.к. она отображает текст файла постранично.

Команда pr форматирует указанные файлы и отображает на терминал или направляет вывод на печать.

3.10.1.1. Команда cat

Команда cat отображает содержимое файла или файлов. Например, предположим, вы находитесь в справочнике letters и вы хотите отобразить содержимое файла johnson. Введите команду cat johnson и на экране появится следующая информация:

	$ cat johnson<CR>
	March 5, 1986

	Mr. Ron Johnson
	Layton Printing
	52 Hudson Street
	New York, N.Y.

	Dear Mr. Johnson:

	I enjoyed with you this morning
	about your company's plans to
	your business.
	Enclosed please find
	the material you requested
	about AB&C's line of computers
	and office automation software.

	If I can be of furtther assistance to you,
	please don't besitate to call.

	Yours truly,

	John Home
	$

Чтобы отобразить содержимое двух или более файлов, перечислите имена этих файлов в командной строке. Например, чтобы распечатать содержимое файлов johnson и sanders, введите команду:

	$ cat johnson sanders<CR>

Команда cat прочитает файлы johnson и sanders и распечатает их содержимое на терминале.

Синтаксис команды:

	cat ключи имя-файла(ов)<CR>

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

	cannot open имя-файла 

3.10.1.2. Команда pg

Команда pg позволяет вам распечатывать содержимое файла(ов) на терминал. После того, как pg отобразит страницу текста, она напечатает подсказку "двоеточие" (:), которая служит сигналом ввода вашей инструкции. Возможной инструкцией может быть запрос вывода следующей страницы содержимого файла, либо запрос на поиск указанного символа по образцу. В табл. 5 приведены допустимые инструкции команды pg.

Таблица 5
Инструкции команды pg

Команда Функция
h Помощь. Распечатывает список допустимых инструкций команды pg
q или Q Прекращает режим команды pg
<CR> Отображает следующую страницу текста
l Отображает следующую строку текста
d или ^d Отображает дополнительную половину страницы текста
. или ^l Вновь отображает текущую страницу текста
f Пропускает одну страницу текста и распечатывает следующую за ней
n Начинает распечатывать следующий указанный в командной строке файл
p Отображает предыдущий указанный в командной строке файл
s Отображает последнюю страницу текста текущего файла
/pattern Осуществляет поиск вперед указанного шаблона символов
?pattern Осуществляет поиск назад указанного шаблона символов

Примечание. Некоторые команды могут быть введены с цифрой впереди. Например:

	+1<CR> - отображает следующую страницу;
	-1<CR> - отображает предыдущую страницу;
	 1<CR> - отображает первую страницу текста.

Команда pg особенно полезна, если вы читаете большой файл или серию файлов, т.к. пауза после каждой страницы дает возможность для анализа информации. Размер отображаемой страницы зависит от типа терминала. Например, терминал способен отображать 24 строки; значит страница текста определяется 23 строки плюс одна строка для двоеточия.

Если файл имеет менее 23 строки, то длина страницы будет равна числу строк в файле плюс одна строка (для двоеточия).

Синтаксис команды:

	pg имя-файла(ов)<CR>

Например, чтобы отобразить содержимое файла outline из справочника draft, введите комнаду:

	pg outline<CR>

Первая страница текста появится на экране. Так как в файле больше строк, чем поместилось на одной странице, то внизу экрана появится двоеточие. Когда вы будете готовы читать текст дальше, нажмите клавишу <RETURN> и pg напечатает следующую страницу текста.

Экран будет выглядеть следующим образом:

	$ pg outline<CR>
	Aftar you analyze the subject for your
	report, you must consider organizing and
	arranging the material you want to use in
	writing it.
	.
	.
	An outline is an effective method of
	organizing the material. The outline
	is a type of blueprint or skaleton,
	a framework for you the buildar-writer
	of the report, in a sense it is a recipe
	:<CR>

Когда весь файл будет прочитан, в последней строке появится:

	(EOF):

Подсказка : (двоеточие) предлагает вам ввести новую команду.

Если вы в ответ на подсказку : нажмете клавишу <RETURN>, то вновь появится подсказка. Вы можете воспользоваться одной из ранее перечисленных допустимых команд.

Успешное выполнение команды pg зависит от типа терминала, который вы используете. Это связано с тем, что программа pg достаточно гибкая и может быть запущена на различных терминалах; то, как она запускается, зависит от конкретного типа терминала. Указав тип терминала, вы говорите команде:

  • сколько строк печатать;
  • сколько колонок печатать;
  • как очистить экран;
  • как высветить подсказку или другие слова;
  • как стереть текущую строку.

Чтобы определить тип терминала, присвойте код вашего терминала переменной TERM в файле .profile (см. разд. 9).

В команде pg могут применяться все допустимые ключи.

3.10.1.3. Команда pr

Команда pr используется для форматирования и печати содержимого файла. Она формарует заголовки, количество страниц и печатает файл на экране терминала.

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

Если вы не выберете ни один из допустимых ключей, то команда pr сформирует вывод в одну колонку, страница будет содержать 66 строк и тексту будет предшествовать короткий заголовок. Заголовок состоит из 5 строк: две пустые строки, строка, содержащая дату, время, имя файла и номер строницы и далее две пустые строки.

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

Например, чтобы проанализировать содержимое файла johnson, введите команду:

	$ pr johnson<CR>

На экране будет следующая информация:

	$ cat johnson<CR>
	March 5, 1986

	Mr. Ron Johnson
	Layton Printing
	52 Hudson Street
	New York, N.Y.

	Dear Mr. Johnson:

	I enjoyed with you this morning
	about your company's plans to
	your business.
	Enclosed please find
	the material you requested
	about AB&C's line of computers
	and office automation software.

	If I can be of furtther assistance to you,
	please don't besitate to call.

	Yours truly,

	John Home
	$

Пустые строки после последней строки символов в файле pr добавляет к выводу, так что каждая страница содержит в общем 66 строк. Если вы работаете с видеотерминалом, который имеет 24 строки, то все 66 строк отформатированного текста без пауз распечатаются на экране. Это означает, что первые 42 строки невозможно будет прочитать, т.к. вы не можете вернуть экран или два назад.

В этом случае воспользуйтесь:
^s - для прерывания потока выводимого на терминал
и
^q - для продолжения вывода на экран.

3.10.2. Команда cp - сделать копию файла

При работе с системой UNIX у вас может появиться необходимость сделать копию файла. Команда cp полностью копирует содержимое одного файла в другой. Также она позволяет вам скопировать один или более файлов из одного справочника в другой, оставив оригинал файла на прежнем месте.

Чтобы скопировать файл outline в файл new.outline в справочнике draft, введите команду: cp outline new.outline. Когда система скопирует файл, то вернет подсказку. Чтобы проверить существование нового файла, введите команду:

	ls<CR>

Эта команда перечислит имена всех файлов и справочников в текущем справочнике (в данном случае в справочнике draft). Экран будет выглядеть следующим образом:

	$ cp outline new.outline<CR>
	$ ls<CR>
	new.outline
	outline
	table
	$

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

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

Если вы затем проверите содержание справочника, чтобы определить сколько копий файла outline существует, то вы получите следующий экран:

	$ cp outline new.outline<CR>
	cp: outline and outline are identical
	$ ls<CR>
	outline
	table
	$

Система UNIX разрешает иметь файлы с одинаковыми именами в разных справочниках. Например, вы можете скопировать файл outline из справочника draft в файл outline в справочнике letters. Если вы находитесь в справочнике draft, то сможете воспользоваться одной из перечисленных ниже 4-х командных строк. В первых двух строках вы указываете имя нового файла при выполнении копирования.

	cp outline /home/startship/letters/outline<CR>
	(указано полное имя пути)
	cp outline ../letters/outline<CR>
	(указано родственное имя пути)

Однако система UNIX не требует, чтобы указывали новое имя файла. Если вы не укажите имя нового файла в командной строке, то cp даст новому файлу то же имя, которое имеет оригинальный файл. В этом случае можете задать команду в одном из следующих видов:

	cp outline /home/startship/letters<CR>
	(указано полное имя пути)
	cp outline ../letters<CR>
	(указано родственное имя пути)

Если вы хотите дать другое имя новому файлу, то обязательно укажите это имя. Например, чтобы скопировать файл outline (справочник draft) в файл с именем outlin.vers2 в справочник letters, нужно задать одну из сдедующих команд:

	cp outline /home/startship/letters/outlin.vers2<CR>
	(указано полное имя пути)
	cp outline ../letters/outlin.vers2<CR>
	(указано родственное имя пути)

Синтаксис команды:

	cp ключи имя-файла1 имя-файла2<CR>
	cp ключи имя-файла(ов) справочник<CR>

3.10.3. Команда mv - переименование файла

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

Синтаксис команды:

	mv имя-файла1 имя-файла2<CR>

Команда mv изменяет имя-файла1 на имя-файла2 и удаляет файл1. Имя-файла1 и имя-файла2 могут быть любыми допустимыми именами, включая имя пути. Имя-файла2 может быть справочником.

Например, если вы находитесь в справочнике draft и хотите переименовать файл table на new.table, введите команду:

	mv table new.table<CR>

Если команда выполнится успешно, то на экране появится подсказка. Проверьте, что файл new.table существует. Экран будет выглядеть следующим образом:

	$ mv table new.table<CR>
	$ ls<CR>
	outline
	new.table
	$

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

	mv имя-файла(ов) справочник<CR>

Например, вы хотите переписать файл table из текущего справочника draft (который имеет полное имя пути /home/startship/draft) в файл с тем же именем в справочник letters (который имеет родственное имя пути из draft ../letters и полное имя пути /home/startship/letters). Для этого можете воспользоваться одной из следующих командных строк:

  mv table /home/startship/letters<CR>
  mv table /home/startship/letters/table<CR>
  mv table ../letters<CR>
  mv table ../letters/table<CR>
  mv /home/startship/draft/table /home/startship/letters<CR>

Теперь, предположим вы хотите переименовать файл table в table2 и переписать в справочник letters. Для этого воспользуйтесь одной из следующих командных строк:

  mv table /home/startship/letters/table2<CR>
  mv table ../letters/table2<CR>

Когда вы переписываете файл с именем имя-файла1 в имя-файла2 и файл с именем имя-файла2 уже существует, команда mv перезапишет новую версию файла. Старая версия файла удаляется.

3.10.4. Команда rm - удалить файл

Чтобы удалить файл, введите следующую команду:

	rm файл(ы)<CR>

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

	rm файл1 файл2 файл3 ... <CR>

Чтобы проверить, успешно ли выполилась команда, выполните команду ls. Например, предположим, что в вашем справочнике находятся файлы outline и table. Вы хотите удалить оба файла. Если команда rm выполнится успешно, то справочник будет пустой. Проверьте, задав команду ls. Экран будет выглядеть следующим образом:

	$ rm outline table<CR>
	$ ls
	$

Подсказка говорит о том, что файлы outline и table удалены.

3.10.5. Команда wc - подсчет строк, слов и символов

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

Синтаксис команды:

	wc имя-файла<CR>

Система отвечает строкой в следующем формате:

	l       w       c       файл 

где l - число строк в файле;
w - число слов в файле;
c - число символов в файле.

Например, чтобы подсчитать число строк, слов и символов в файле johnson, находящегося в текущем справочнике, введите команду:

	$ wc johnson<CR>
	24 66 406 johnson
	$

Система отвечает, что в файле johnson 24 строки, 66 слов и 406 символов.

Чтобы подсчитать число строк, слов и символов в нескольких файлах, используйте следующий формат:

	wc файл1 файл2<CR>

Система отвечает следующим образом:

	l       w       c       файл1
	l       w       c       файл2
	l       w       c       total 

Число строк, слов и символов для файл1 и файл2 отображается на отдельных строках. На последней строке отображается общее число строк, слов и символов в двух файлах.

Например, подсчитаем число строк, слов и символов в файлах johnson и sanders в текущем справочнике. Экран будет выглядеть следующим образом:

	$ wc johnson sanders<CR>
	24   66  406  johnson
	28   92  559  sanders
	52  158  965  total
	$

Последняя строка показывает, что файлы johnson и sanders вместе имеют 52 строки, 158 слов и 965 символов.

Чтобы получить только число строк, или число слов, или число символов, выберите один из соответствующих форматов командной строки:

	wc -l файл<CR> (число строк)
	wc -w файл<CR> (число слов)
	wc -c файл<CR> (число символов)

Например, если вы используете ключ -l, то система напечатает только число строк в файле sanders:

	$ wc -l sanders<CR>
	     28 sanders
	$

3.10.6. Команда chmod - изменить статус файла

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

Если вы являететсь владельцем файла, то можете решить, кто имеет право на чтение файла, запись в него и, если это программа, то выполнить ее. Вы также можете ограничить права доступа к справочнику. Когда вы предоставляете право доступа к справочнику, это значит, что позволяете указывать пользователю команду cd и распечатывать содержимое справочника с помощью команды ls. Чтобы указать право доступа, используются следующие символы:

r - разрешает пользователям системы читать файл или копировать его содержимое;
w - разрешает пользователям системы вносить изменения в файл или копировать его содержимое;
x - позволяет пользователям системы запускать файл на выполнение.

Чтобы указать, кто из пользователей имеет эти права на доступ, используются следующие символы:

u - владелец файла и справочника;
g - член вашей группы;
o - все пользователи системы.

Когда вы создаете файл или справочник, система автоматически предоставляет или не предоставляет право доступа вам, члену вашей группы или всем пользователям системы. Вы можете изменить это автоматическое действие по предоставлению права (см. разд. 9). Кроме того, вне зависимости от того, какие права вам предоставляются при создании файла, вы как владелец файла или справочника можете воспользоваться ключом внесения изменений.

3.10.6.1. Как определить права

Вы можете определить права доступа к файлу или справочнику, воспользовавшись командой ls -l. Например, если вы находитесь в справочнике startship/bin, и введете команду ls -l, то получите следующую информацию:

   $ ls -l<CR>
   total 35
   -rwxr-xr-x 1 startship  project  9346 Nov 1 08:06 display
   -rw-r--r-- 1 startship  project  6428 Dec 2 10:26 list
   drwxr-x--x 2 startship  project    32 Nov 8 15:32 tools
   $

В левой части экрана отображены права доступа для файлов display и list и справочника tools:

   -rwxr-xr-x  для файла display
   -rw-r--r--  для файла list
   drwxr-x--x  для справочника tools 

Первый символ описывает тип файла (например, символ "-" говорит, что это обыкновенный файл, символ "d" - справочник). Дальнейшие девять символов описывают права доступа. Первые три символа из девяти устанавливают права доступа для владельца, вторые три - для группы, третьи - для всех пользователей. Каждый набор символов r,w,x показывает текущие установленные права доступа для каждой категории пользователей. Если вместо символа стоит "-", то соответствующее право отсутствует.

Существует два ограничения. Случайно могут появиться буквы l или s в строке вместо r, w или x. Буква s представляет специальное право на выполнение файла. Она появляется на том месте, где обычно стоит буква r в наборах для владельца или для группы пользователей и это означает специальное право на выполнение файла. Она имеет значение только для программистов и системных программистов. Буква l указывает, что блокировка будет появляться при обращении к файлу. Это не означает, что файл защищен.

3.10.6.2. Как изменить существующие права

Изменить существующие права можно с помощью команды chmod.

Синтаксис команды:

	chmod кто+права файл(ы)<CR>

или

chmod кто-права файл(ы)<CR>

где

chmod - имя программы;
кто - одна их трех групп пользователей:
u - владелец;
g - группа;
o - все пользователи;
"+" или "-" - наличие или отсутствие права;
право - одно из трех прав:
r - право на чтение;
w - право на запись;
x - право на выполнение;
файл(ы) - имя файла(ов) (справочника); предполагается, что файл находится в текущем справочнике или вы должны указать полное имя пути.

Примечание. Команда chmod не будет выполняться, если вы поставите пробел между "кто", символами "+", "-" и "право".

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

	chmod u-w display<CR>

После того как получите подсказку, введите команду:

	ls -l<CR>

чтобы проверить, как изменились права. Экран будет выглядеть следующим образом:

   $ chmod u-w display<CR>
   $ ls -l<CR>
   total 35
   -r-xr-xr-x 1 startship  project  9346 Nov 1 08:06 display
   -rw-r--r-- 1 startship  project  6428 Dec 2 10:26 list
   drwxr-x--x 2 startship  project    32 Nov 8 15:32 tools
   $

Как видите, изменилось право на внесение изменений в файл. Вы не сможете изменить этот файл, пока существует это право записи.

Теперь обратимся к другому примеру. Право на запись в файл display не разрешено вашей группе и всем пользователям системы. Однако им предоставлено право на чтение. Это означает, что они могут копировать файл в свой собственный справочник и затем вносить в него изменения. Чтобы предотвратить эти действия, вы должны отменить право на чтение. Для этого введите команду:

	chmod go-r display<CR>

где g и o обозначают права для группы и для всех пользователей системы;
-r - запрещает читать или копировать файл.

Проверьте результат и введите команду ls -l. Экран будет выглядеть следующим образом:

   $ chmod go-r display<CR>
   $ ls -l<CR>
   total 35
   -rwx--x--x 1 startship  project  9346 Nov 1 08:06 display
   -rw-r--r-- 1 startship  project  6428 Dec 2 10:26 list
   drwxr-x--x 2 startship  project    32 Nov 8 15:32 tools
   $

Вы можете использовать команду chmod для предоставления или отрицания права для справочников как и для файлов.

Например, вы предоставили право на чтение справочника себе (u), членам вашей группы (g) и всем пользователям системы. Каждый пользователь, имеющий доступ к системе, будет иметь право читать имена файлов, содержащихся в этом справочнике, задав команду ls -l. Аналогично, предоставление права на запись позволяет пользователям создавать новые файлы в справочнике и удалять в нем существующие файлы. Предоставленное право на выполнение в справочнике позволяет обозначенным пользователям перемещаться в этот справочник (и делать его своим текущим справочником) с помощью команды cd.

3.10.6.3. Альтернативный метод

Существует два метода, с помощью которых может быть выполнена команда chmod. Способ, описанный выше, в котором символы r, w и x используются для указания права, называется символическим методом.

Альтернативным методом является восьмиричный метод. Его формат требует от вас указать права с использованием трех восьмиричных цифр (от 0 до 7).

3.10.7. Дополнительные команды

В этом пункте описаны три команды, которые могут вам пригодиться при работе с файлами: chown, id, groups. Если вы владелец файла, ваше регистрационное имя размещается в категории owner. Команда chown позволяет владельцу файла изменить собственный ID на любой другой. Например, если вы введете команду:

	ls -l display<CR>

на экране появится информация:

	-r-xr-xr-x  1  owner  group  9346  Nov 1 08:06 display 

Чтобы изменить ваш ID на чей-либо другой (например, sara) вы должны ввести:

	chown sara display<CR>

Если вы введете:

	ls -l display<CR>

на экране появится сообщение:

	-r-xr-xr-x  1  sara   group  9346  Nov 1 08:06 display 

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

	id<CR>

то система отобразит ID пользователей и ваш действительный групповой ID (gid). В зависимости от начальной установки системы вы можете принадлежать более чем к одной группе. Чтобы определить, членом какой группы вы являетесь, введите:

	groups<CR>

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

Так как вы хорошо знакомы с этими командами, вам необходимо получить более углубленные знания по технике обработки информации. В этом пункте представим три команды:
diff - найти различия между двумя файлами;
grep - поиск в файле по шаблону;
sort - сортировка и слияние файлов.

3.10.7.1. Команда diff

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

Синтаксис команды:

	diff файл_1 файл_2<CR>

Если файл_1 и файл_2 идентичны, то система возвращает подсказку. Если есть различия между ними, то команда diff инструктирует вас, как изменить первый файл (с помощью редактора ed), чтобы он соответствовал второму файлу. Система UNIX помечает строки в файл_1 (которые будут изменены) символом < (меньше), и строки в файл_2 (шаблон текста) символом > (больше).

Например, вы хотите найти различия между файлами johnson и mcdonough. Файл mcdonough содержит тот же текст письма, что и johnson, но с соответствующими изменениями для различных получателей. Команда diff идентифицирует эти изменения следующим образом:

	3, 6c3, 6
	< Mr. Ron Johnson
	< Layton Printing
	< 52 Hudson Street
	< New York, N.Y.
	---
	> Mr. J.J.McDonough
	> Ubu Press
	> 37 Chico Place
	> Springfield, N.J.
	9c9
	< Dear Mr. Johnson:
	---
	> Dear Mr. McDonough:

Первая строка команды diff:

	3, 6c3, 6

Это означает, что если вы хотите, чтобы johnson соответствовал mcdonough, вы должны изменить (c) строки с 3-й по 6-ю в файле johnson на строки с 3-й по 6-ю из файла mcdonough. Команда diff затем отобразит оба набора строк. Если вы выполните эти изменения (с помощью таких редакторов как ed или vi), файл johnson будет идентичен файлу mcdonough. Помните, что команда diff ищет различия только между двумя указанными файлами.

В первой выводной строке команды diff могут появиться следующие буквы:

	a - добавить;
	c - изменить;
	d - удалить.

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

3.10.7.2. Команда grep

Вы можете выдать системе UNIX инструкцию поиска в файле указанного слова, фразы, группы символов с помощью команды grep. Поиск осуществляется по шаблону.

Синтаксис комнды:

	grep шаблон файл(ы)<CR>

Например, чтобы отыскать любую строку, содержащую слово automation в файле johnson, введите:

grep automation johnson<CR>

Система ответит:

	$ grep automation johnson<CR>
	and office automation software
	$

Вывод состоит из всех строк в файле johnson, которые содержат шаблон, указанный вами.

Если шаблон содержит много слов или любых символов, которые имеют специальное значение для системы UNIX (например, $, |, *, ? и т.д.) вводимый шаблон должен быть заключен в кавычки (более подробное описание см. разд. 9). Например, вы хотите найти строки, содержащие шаблон office automation. Ваша командная строка и ответ системы будут выглядеть следующим образом;

	$ grep 'office automation' johnson<CR>
	and office automation software
	$

Но если вы не знаете, какое письмо содержит шаблон office automation, письмо johnson или sanders, можете ввести команду в следующем виде:

	$ grep 'office automation' johnson sanders<CR>
	johnson:and office automation software
	$

Выводная строка говорит вам, что шаблон office automation найден только в файле johnson.

Дополнительно к команде grep система UNIX обеспечивает разновидности этой команды - это команды egrep и fgerp с несколькими ключами, облегчающими поиск.

3.10.7.3. Команда sort

Система обеспечивает эффективное средство для сортировки и слияния файлов.

Синтаксис команды:

	sort файл(ы)<CR>

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

  • строки, начинающиеся с цифры, будут отсортированы по цифрам и перечислены после строк, начинающихся с буквы;
  • строки, начинающиеся с большой буквы, перечисляются до строк, начинающихся с маленькой буквы;
  • строки, начинающиеся с таких символов, как "%", "*" сортируются на основе символьного представления ASCII.

Например, вы имеете 2 файла group1 и group2, каждый из которых содержит перечень имен. Вы хотите отсортировать каждый список по алфавиту и затем объединить два списка в один. Вначале отобразите содержание файлов, выполнив команду cat для каждого файла. Экран будет выглядеть следующим образом:

	$ cat group1<CR>
	Smith, Allyn
	Jones, Barbara
	Cook, Karen
	Moore, Peter
	Wolf, Robert
	$ cat group2<CR>
	Frank, H. Jay
	Nelson, James
	West, Donna
	Hill, Chales
	Morgan Kristina
	$

Вместо того, чтобы печатать эти два файла индивидуально, вы можете сделать это в одной командной строке. Если вы введете команду:

	$ cat group1 group2<CR>

результат будет такой же.

Теперь отсортируйте и слейте эти два файла, выполнив команду sort. Результат выполнения команды sort будет распечатан на экране терминала, если вы не укажете иначе.

	$ cat group1 group2<CR>
	Cook, Karen
	Frank, H. Jay
	Hill, Chales
	Jones, Barbara
	Moore, Peter
	Morgan, Kristina
	Nelson, James
	Smith, Allyn
	West, Donna
	Wolf, Robert
	$

Дополнительно к комбинированию списков (как в примере), команда sort может перестанавливать строки и части строк (называемые полями) в соответствии с другими спецификациями, которые вы назначили в командной строке. Возможными спецификациями являются complex и beyond.

4. Обзор программных средств

4.1. Управление офисом системы

"Офис" системы UNIX подобен бизнес-офису и состоит из файлов, записей, копий, блоков для хранения этих данных и значения хранения, перемещения, дублирования таких данных. FACE (Framed Access Command Environment) позволяет организовывать ваш "офис" для эффективного и легкого использования. При помощи FACE вы можете манипулировать не только со своими собственными файлами, но и получать доступ к файлам других пользователей. FACE предлагает сделать вам выбор в форме меню.

4.2. Редактирования текста

В этом подразделе описывается, как с помощью редакторов создавать и редактировать текстовые файлы. В начале подраздела дается объяснение, что такое редактор текста и как он работает. Затем приводится описание двух редакторов: строчный редактор ed и экранный редактор vi ( см. разд. 6 и 7).

4.2.1. Что такое редактор текста

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

Редакторы текста системы UNIX являются интерактивными программами: они принимают от вас команды и выполняют требуемые функции.

4.2.2. Как работает текстовый редактор

4.2.2.1. Буфера редактора текста

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

Так как буфер является временным рабочим пространством, то любой введенный текст и любые изменения также являются временными. Буфер и его содержимое будут существовать только во время процесса редактирования. Если вы хотите сохранить файл, то должны дать текстовому редактору команду записать содержимое буфера в файл. Файл сохраняется в памяти компьютера. Чтобы предотвратить потерю содержимого буфера, редактор посылает вам напоминание о том, чтобы не забыть записать его в файл, при попытке завершить работу с редактором.

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

4.2.3. Режимы

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

4.2.4. Построчный редактор

Построчный редактор становится доступным при помощи команды ed и является разновидностью программ для подготовки текстовых файлов. Он называется построчным, т.к. манипулирует с текстом по принципу "строка-за-строкой". Это означает, что вы должны указать номер строки, текст которой вы хотите изменить. Затем ed печатает эту строку на экране и вы можете ее модифицировать.

Этот текстовый редактор предоставляет команды, с помощью которых вы можете изменить строки, напечатать строки, читать и записывать в файл и вводить текст. Кроме того, вы можете вызвать редактор ed из shell программы.

Построчный редактор ed работает с видеотерминалом и с печатающим терминалом. Он также может работать по малоскоростным телефонным линиям. Редактор vi может быть использован только с видеотерминалом.

4.2.5. Экранный редактор

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

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

Экранный редактор предлагает вам набор команд. Например, команда number позволяет вам перемещать курсор внутри файла. Другие команды прокручивают вперед и назад файл на экране, помогают изменить существующий текст или создать новый текст. Дополнительно к своему набору команд экранный редактор может иметь доступ к командам построчного редактора. В табл. 6 приведены характеристики редакторов ed и vi.

Таблица 6
Характеристики редакторов

Характеристика ed vi
Рекомендуенмый тип терминала Видеотерминал или печатающий терминал Видеотерминал
Скорость Настраивается на низкоскоростные и высокоскоростные линии передачи данных Наиболее эффективно работает с высокоскоростными линиями передачи данных (1200 бод и выше)
Эксплуатационная гибкость Может быть указан для запуска из командного языка shell, также как используется во время редактирования Может быть использован интерактивно во время редактирования
Сложность Изменяет текст быстро; занимает сравнительно мало времени на обработку Изменяет текст легко, однако может занять достаточно много ресурсов компьютера
Производительность Обеспечивает полный набор команд редактирования. Стандартный текстовый редактор системы UNIX Обеспечивает собственные команды редактирования и также распознает команды построчного редактора
Преимущества Чтобы использовать редактор ed вы должны изучить несколько команд vi позволяет вам увидеть результаты редактирования текста немедленно. (Когда вы используете ed, то выполнение изменений и просмотр результатов являются отдельными шагами)

4.2.6. Использование shell

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

shell подобна другим программам, за исключением того, что вместо выполнения одного задания, как cat или ls, она является основой при вашем взаимодействии с системой UNIX. Первой функцией shell является действие как команды интерпретатора между вами и системой. Как интерпретатор, shell транслирует ваши запросы на язык, понятный компьютеру и выполняет их.

4.2.7. Применение средств системы

Используя shell различными способами, вы увеличиваете используемые системные средства. Кроме применения shell для запуска отдельных программ, вы также можете:

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

Дополнительно к функциям интерпретатора языка команд shell является языком программирования. Более подробно shell описан в разд. 9.

4.2.8. Окружение компьютера

shell может быть использован для управления вашим окружением. Когда вы регистрируетесь в системе UNIX, shell автоматически устанавливает окружение компьютера для вас. По умолчанию установленное окружение включает: HOME - ваш регистрационный справочник; LOGNAME - ваше регистрационное имя; PATH - путь, который shell принимает для поиска исполняемых файлов или команд (обычно PATH=:/usr/bin:/usr/usr/bin).

Переменная PATH говорит shell, где искать исполняемую программу, вызванную командой. Кроме того, она используется каждый раз, когда выдается команда.

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

Обычно .profile выполняет некоторые или все из следующих задач: проверка почты, установка параметров даты, установка характеристик терминала, назначение символа или строки символов в качестве вашей регистрационной подсказки, назначение функций стирания и удаления клавишам.

Вы можете определить задачи, которые хотите в .profile, либо изменить в любое время. За инструкциями по модификации .profile обратитесь к разд. 9.

Теперь проверьте, существует ли файл .profile. Если вы не находитесь в собственном справочнике, то воспользуйтесь командой cd. Затем проверьте файл .profile, задав команду:

	cat .profile 

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

4.2.9. Программирование в shell

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

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

Например, вы можете скомбинировать три команды системы UNIX (date, who, wc) в простой процедуре shell и назвать его users. Эта процедура отражает дату, время и количество пользователей, работающих в вашей системе. С помощью редактора vi создайте файл users:

	vi users<CR>

Редактор выведет пустую страницу на вашем экране и будет ждать ввода текста. Введите три команды на одной строке:

	date; who | wc -l 

Затем запишите текст в файл и выйдите из файла, задав команду:

	:wq 

Сделайте файл users исполняемым:

	chmod ug+x users<CR>

Теперь попытайтесь запустить этот файл. На экране появится информация, подобная:

	$ users<CR>
        Sat  Mar  11   16:40:32   EST   1989
              4
        $

Команда распечатывает дату и количество пользователей (4).

4.2.10. Программирование с помощью awk

awk предлагает вам управлять задачами обработки данных и восстановления информации. В разд. 7 приводится концепция языка и структура программы awk.

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

4.3. Электронная связь

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

4.4. Программирование в системе UNIX

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

5. Руководство по командной среде FACE

5.1. Что такое FACE?

Командная среда (КС) FACE (Framed Access Command Environment) является дружелюбным для пользователя интерфейсом к системе UNIX, отображающим на экран электронный "оффис", с помощью которого вы можете легко выбирать команды, выполняющие многие обычные служебные задачи, такие как организация ваших файлов, совместная разработка проектов и выполнение нескольких задач одновременно. Кроме того FACE дает возможность доступа к принтеру, установленным программам, оболочке системного администратора и к системе UNIX.

5.1.1. Организация этого раздела

Материал в данном разделе организован следующим образом:

  • подраздел "Что такое FACE", дает введение к КС FACE и объясняет как организован данный раздел;
  • подраздел "Введение" знакомит вас с вашим FACE оффисом. Регистрация в системе, выход из системы, именованные клавиши и их альтернативный ввод, работа с меню, формами и текстовыми окнами, перемещение и изменение окон, командное меню и получение помощи - вот вопросы, которые обсуждаются в данном подразделе;
  • подраздел "Использование вашего FACE оффиса", обсуждает файлы, наборы файлов и команды FACE для манипулирования ими. Также показано, как конфигурировать ваш FACE оффис, как повысить защиту ваших файлов и как использовать средство "Корзину для бумаг";
  • подраздел "Использование других возможностей FACE" объясняет как использовать принтер, как выполнять функции администратора FACE, как использовать другие программные средства (включая почтовую службу и контроль правописания), как использовать систему UNIX, глобально управлять другими программами из FACE, как использовать выполняемые файлы и выполнять командные файлы оболочки shell из FACE.

5.2. Введение

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

Вы узнаете как ориентироваться в окнах и меню на экране, а также как выполнять команды FACE: с помощью функциональных клавиш или альтернативных последовательностей, из командного меню или из командной строки.

5.2.1. Регистрация в системе

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

Примечание. Никогда не разделяйте свое регистрационное имя с другим лицом. Кроме того что это снижает защиту вашего оффиса, если два человека используют одно регистрационное имя одновременно, ваш FACE экран может оказаться несколько испорченым. (Окна могут быть искажены и вы не сможете правильно ориентироваться).

Перед тем как вы сможете зарегистрироваться в FACE вам необходимо узнать следующее:

  • как включить ваш терминал;
  • как запросить соединение с компьютером;
  • ваш регистрационный идентификатор (имя);
  • ваш пароль;
  • тип вашего терминала.

Когда вы узнали эту информацию, можно начинать.

  1. Если ваш терминал выключен включите его.
  2. При необходимости установите соединение с компьютером.
  3. Когда вы получите подсказку "Login:", введите ваш регистрационный идентификатор и нажмите ENTER. Если вы допустили ошибку при наборе регистрационного имени, компьютер начнет сначала предоставив вам подсказку "Login:" снова. Когда вы получите подсказку "Password:" введите ваш пароль и нажмите ENTER. Заметьте, что при наборе пароля он не отображается на экране. Это сделано для того, чтобы ваш пароль оставался в секрете.
  4. Если система запросит тип вашего терминала введите его и нажмите ENTER. Если вы используете терминал фирмы AT&T и не знаете тип вашего терминала просто нажмите ENTER. В этом случае FACE сам попытается определить тип вашего терминала.

FACE может определить не любой тип терминала. Если FACE не сможет определить тип терминала, вы опять получите подсказку "TERM=", и будет необходимо ввести тип терминала.

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

Если FACE не запускается автоматически при входе в систему, вы можете вызвать его командой "face" в ответ на подсказку системы UNIX.

5.2.2. Структура экрана FACE

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

	-----------------------------------------------------
	                  Заголовок
	-----------------------------------------------------
	
	               Рабочая  Область

	-----------------------------------------------------
	               Строка  Сообщения
	-----------------------------------------------------
	               Командная  Строка
	-----------------------------------------------------
	 F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8
	-----------------------------------------------------

Рис. 2

5.2.2.1. Заголовок

Строка заголовка показывает информацию о состоянии системы. Название "AT&T FACE" и текущая дата всегда появляются в центре этой строки. Если в вашей системе используется электронная почта и для вас есть новое сообщение, слово "MAIL" выводится в левой части строки. Когда FACE занят, слово "working ..." появляется в правой части этой строки. Если это сообщение выведено, вы не можете делать ничего в вашем FACE оффисе пока FACE не удалит это сообщение.

Чтобы прочитать вашу почту, выберите Programs из FACE меню, а затем выберите Mail Services. Это вызовет команду mailx.

5.2.2.2. Рабочая область

Рабочая область располагается в центральной части вашего экрана. Здесь выводятся формы, меню, файлы и наборы файлов с которыми вы работаете в отдельных окнах. Сразу после того как вы входите в FACE в этой области отображается FACE меню, которое является примером окна. Окна, которые вы открываете (выбираете) всегда появляются в рабочей области. Окно или часть окна может быть временно перекрыта другим окном, если несколько окон открыты одновременно.

5.2.2.3. Строка сообщения

Строка сообщения расположена на две строки выше меток функциональных клавиш. Здесь выводятся сообщения об ошибках и другая информация во время или после действия, которое вы выполняете. Также здесь у вас запрашивается дополнительная информация, если она требуется для действия, которое вы выполняете. Когда вы входите в FACE эта строка содержит сообщение "Move to an item with arrow keys and press the ENTER key to select the item" (используйте клавиши со стрелками для перемещения курсора и нажмите ENTER для выбора).

5.2.2.4. Командная строка

Командная строка отображает команды, которые вы выбираете. Переход к командной строке осуществляется вводом CTRL-j или CTRL-f c. (В начале работы с FACE командная строка обычно пуста). Вы узнаете как использовать командную строку в разделе "Ориентация в окнах".

5.2.2.5. Метки функциональных клавиш

Восемь меток функциональных клавиш занимают последнюю строку вашего FACE экрана. Они соответствуют областям с F1 до F8 на рис. 2. Если ваша клавиатура имеет функциональные клавиши этим меткам соответствуют клавиши с F1 по F8. Например, в начале работы с FACE меткой, соответствующей функциональной клавише F4, является PREV-FRM.

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

Если ваш терминал не имеет функциональных клавиш или они работают неправильно, вы можете выполнять функции, обозначенные соответствующими метками, используя альтернативные последовательности клавиш, которые приведены в табл. 7. Правильная работа функциональных клавиш может зависеть от того, какой тип терминала вы ввели на подсказку "TERM=" при регистрации в системе.

5.3. Что вы увидите после регистрации

После того как вы успешно зарегистрировались, экран очищается и появляется первое окно (FACE меню). Это окно всегда открыто и присутствует на экране. Открытые окна могут быть активными и неактивными, но после того как окно открыто вы можете выбрать его в рабочей области. Даже если открыты другие окна FACE меню всегда имеет номер 1 слева от заголовка, и заголовком всегда является AT&T FACE. Он служит базой, от которой вы имеете доступ к другим компонентам FACE. FACE меню показано на рис. 3. tes 25

	------------------------------------------------------------------
	               AT&T FACE - JUN 19, 1989

	    -------------------------
	   |    1      AT&T FACE     |
	    -------------------------
	   | Office of login         |
	   | Printer Operations      |
	   | Programs                |
	   | System Administration   |
	   | UNIX System             |
	   | Exit FACE               |
	    -------------------------


	Move to an item with arrow keys and press ENTER to select the item
	------ ---- ------- ---------- ---------- -------- ---------- ----
	|HELP| |  | |ENTER| |PREV-FRM| |NEXT-FRM| |CANCEL| |CMD-MENU| |  |
	------ ---- ------- ---------- ---------- -------- ---------- ----
	------------------------------------------------------------------

Рис. 3.

Главное меню FACE содержит следующее пункты:

  • Office of login (оффис регистрации). Когда вы выбираете этот пункт, в рабочей области открывается новое окно с заголовком "Office of login", отображающее меню оффис-функций, которые вы можете выполнить. Этот пункт идентифицирует ваш оффис. Например, если ваше регистрационное имя tom, когда вы регистрируетесь этот пункт будет читаться как Office of tom (оффис пользователя tom). Для простоты ссылок, мы будем использовать термин оффис регистрации, когда обсуждается этот пункт меню. Помните только, что ваше регистрационное имя будет присутствовать вместо слова login, когда вы используете FACE;
  • Printer operations (работа с принтером). Этот пункт дает вам информацию о принтерах, подключенных к вашей системе, а также позволяет вам настраивать команду print для удовлетворения ваших потребностей. Для детальной информации смотрите раздел "Работа с принтером";
  • Programs (программы). Этот пункт предоставляет список всех программ, установленных в вашей системе в виде меню. Выбирая программу по имени, вы можете выполнить эту программу. Если не установлено ни одной программы для использования из FACE, этот пункт не появится в вашем FACE меню. (Раздел "Использование других возможностей FACE" описывает использование этого пункта в деталях);
  • System Administration (Администрирование системы). Этот пункт дает лицу, которое имеет привилегии администратора, возможность администрировать FACE, добавлять пользователей, устанавливать программные обеспечения, добавлять принтеры или модемы, получать ирформацию о пользователях, о конфигурации системы, копировать дискеты и выполнять многие другие административные задачи. Если вам не даны привилегии системного администратора, вы не увидите этот пункт в вашем FACE меню. Для детальной информации смотрите раздел "Администрирование системы";
  • UNIX System (система UNIX). Этот пункт предоставляет вам непосредственный доступ к системе UNIX. Если вам не даны привилегии системы UNIX, вы не увидите этот пункт в вашем FACE меню. Для детальной информации смотрите раздел "Использование других возможностей FACE";
  • Exit FACE (Выход из FACE) Этот пункт служит для выхода из системы. Для детальной информации смотрите пункт "Выход из системы" в данном разделе.

На FACE экране могут появиться и другие информационные окна, которые вы назначили.

После того, как открыто FACE меню и, возможно, другие окна, может появиться подсказка в строке сообщения о том, что файлы или наборы файлов в вашей "корзине для бумаг" должны быть удалены. При этом также выводится меню файлов или наборов файлов, предназначенных для удаления. Вы можете использовать клавишу MARK для того чтобы пометить некоторые файлы или наборы файлов для сохранения, и затем удалите оставшиеся нажатием клавиши ENTER. Также вы можете вообще отказаться от удаления нажатием CANCEL или альтернативной последовательности CTRL-f 6. (Полная информация по ориентации в окнах и меню приведена в разделе "Как использовать меню.) Раздел "Использования вашего FACE оффиса" обсуждает средство "корзина для бумаг" детально.

5.3.1. Альтернативные последовательности

Не каждая клавиатура имеет все клавиши, на которые ссылается данное руководство. Например, многие клавиатуры не имеют клавиши BACKTAB или функциональных клавиш с F1 по F8. Если ваша клавиатура не имеет каких-либо клавиш, использованных в данном руководстве (или если ваша клавиатура их имеет, но они не работают правильно), вы можете использовать альтернативные последовательности клавиш.

В табл. 7 показаны эти альтернативные последовательности (две или три клавиши, ввод которых эквивалентен нажатию именованной клавиши). В этих последовательностях CTRL представляет управляющую клавишу. Управляющая клавиша используется также как вы нажимаете клавишу shift когда вы хотите ввести заглавную букву. Например, если вы не можете использовать функциональную клавишу F1, введите альтернативную последовательность CTRL-f 1. Для ввода данной последовательности, нажмите управляющую клавишу (CTRL) и не отпускайте ее пока набираете первый символ, который следует за тире (здесь это "f"), и отпустите управляющую клавишу перед тем как вы введете второй символ (здесь это "1").

Таблица 7

Именованная клавиша Альтерн. последов. Именованная клавиша Альтерн. последов.
BACKSPACE CTRL-h INSERT-CHAR CTRL-a
BACKTAB CTRL-t INSERT-LINE CTRL-o
BEG CTRL-b <- CTRL-l
CLEAR CTRL-y NEXT CTRL-n
CLEAR-EOL или CLEAR-LINE CTRL-f y NEXTPAGE или PAGE-DOWN CTRL-w
CMD LINE CTRL-f or CTRL-f c PAGE-UP или PREVPAGE CTRL-v
DEL или CTRL-x PREV CTRL-p
DEL-CHAR Стрелка вверх F1 по F8 CTRL-f 1 по CTRL-f 8
DEL-LINE CTRL-k RESET CTRL-u
Стрелка вниз CTRL-d -> CTRL-f r
END CTRL-e STROLL-DOWN CTRL-r
ENTER CTRL-m STROLL-UP CTRL-f d
CTRL-f u
HOME CTRL-f b SPACEBAR нет
HOME-DOWN CTRL-f a TAB CTRL-i

В зависимости от вашей клавиатуры, клавиша возврата каретки может называться ENTER или RETURN. В данной главе для обозначения клавиши возврата каретки используется клавиша ENTER. Метка ENTER может быть также присвоена функциональной клавише F3. Однако, если ваша клавиатура имеет только клавишу RETUN, используйте ее или CTRL-m взамен.

5.3.2. Как использовать меню

5.3.2.1. Метки функциональных клавиш в меню

Ряд меток на экране, которые появляются на нижней строке вашего FACE экрана, соответствуют восьми функциональным клавишам на вашей клавиатуре, с F1 по F8. Когда текущим активным окном является меню, как например сейчас, первый уровень функциональных клавиш появляется внизу экрана. Когда, однако, текущим активным окном является набор файлов, меткой для клавиши F8 становится CHG-KEYS, и вы имеете доступ ко второму уровню функциональных клавиш (рис.4).

Первый уровень Второй уровень
F1 HELP F1 HELP
F2 пусто F2 COPY
F3 ENTER F3 MOVE
F4 PREV-FRM F4 DELETE
F5 NEXT-FRM F5 RENAME
F6 CANCEL F6 CREATE
F7 CMD-MENU F7 SECURITY
F8 пусто* F8 пусто*

* Функциональная клавиша F8 имеет метку CHG-KEYS когда меню отображает содержимое набора файлов.

Рис. 4.

5.3.2.2. Перемещение в меню

Для отображения текущего выбранного пункта меню, FACE использует два метода. Первый метод - это отображение некоторого графического символа слева от пункта меню. Например, на некоторых терминалах в качестве этого символа используется знак больше (">"), на других - знак подчеркивания ("_").

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

В этом руководстве для отображения позиции курсора на рисунках используется знак больше (">").

Все меню FACE используют одни и те же клавиши для перемещения внутри окна.

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

Клавиши для перемещения в меню

Именованная клавиша Альтернатив. последов. Действие в меню
Стрелка
вниз
CTRL-d Перемещает курсор вниз на один пункт, переходя к первому пункту при достижении конца меню
Стрелка
вверх
CTRL-u Перемещает курсор вверх на один пункт, переходя к последнему пункту при достижении начала меню
-> или
SPACEBAR
CTRL-r Перемещает курсор вниз на один пункт в меню, состоящем из одной колонки, или вправо на один пункт в многоко- лоночном меню
<- или
BACKSPACE
CTRL-l Перемещает курсор на один пункт вверх в одноколоночном меню, или влево на один пункт в многоколоночном меню
NEXT CTRL-n Аналогично ->, но перемещает курсор к первому пункту ряда или колонки при достижении последнего пункта
PREV CTRL-p Аналогично <-, но перемещает курсор к последнему пункту ряда или колонки при достижении первого пункта
HOME CTRL-f b Перемещает курсор к первому пункту видимой части меню
HOME-DOWN CTRL-f a Перемещает курсор к последнему пункту первой колонки, или первой странице меню

Рис. 5.

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

Не все терминалы используют одинаковые графические символы для символов прокрутки. Некоторые терминалы используют символ "^" для показа возможной прокрутки вверх и "v" для прокрутки вниз.

Если меню может прокручиваться, также могут могут использоваться и следующие именованные клавиши.

Дополнительные клавиши для перемещения в прокручиваемом меню

Именованная клавиша Альтернатив. последов. Действие
PAGE-DOWN CTRL-w Перемещает курсор к первому пункту на следующей странице и отображает эту страницу
PAGE-UP CTRL-v Перемещает курсор к первому пункту на предыдущей странице и отображает эту страницу
BEG CTRL-b Перемещает курсор к первому пункту меню, независимо от того виден он в настоящее время или нет, и отображает первую страницу
END CTRL-a Перемещает курсор к последнему пункту меню, независимо от того виден он в настоящее время или нет, и отображает последнюю страницу
SCROLL-DOWN CTRL-f d Прокручивает содержимое меню на одну строчку вниз
SCROLL-UP CTRL-f u Прокручивает содержимое меню на одну строчку вверх

Рис. 6.

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

5.3.2.3. Выбор пункта меню

Следующие короткие примеры демонстрируют два метода выбора пункта меню. Попробуйте оба способа и тогда вы сможете продолжать работать с FACE, наиболее понравившимся способом.

Выберите пункт и нажмите ENTER.

Пункт меню может быть выбран простым переходом к нему и нажатием клавиши ENTER.

  1. Продолжайте нажимать клавишу "Стрелка вниз" (или CTRL-d) до тех пор пока курсор не встанет на пункте меню "Office of login" (вместо слова login будет ваше регистрационное имя).
  2. Нажмите ENTER для выбора этого пункта. Будет отображено окно "Office of login". tes 21
                   AT&T FACE - JUN 19, 1989
    
      -------------------------     -------------------------
     |    1      AT&T FACE     |    | 2 Office of login      |
      -------------------------     -------------------------
     | Office of login         |    |>Filecabinat/home/login |
     | Printer Operations      |    | Othar Users            |
     | Programs                |    | Preferences            |
     | System Administration   |    | Programs Administration|
     | UNIX System             |    | Wastebasket            |
     | Exit FACE               |    |                        |
      -------------------------      ------------------------
    
    Move to an item with arrow keys and press ENTER to select the item
    ------ ---- ------- ---------- ---------- -------- ---------- ----
    |HELP| |  | |ENTER| |PREV-FRM| |NEXT-FRM| |CANCEL| |CMD-MENU| |  |
    ------ ---- ------- ---------- ---------- -------- ---------- ----
    ------------------------------------------------------------------
    

    Рис. 7.

    Вместо имени "/home" может появиться что-то другое, если ваш системный администратор изменил стандартное положение пользовательских регистрационных каталогов.

  3. Нажимайте клавишу "Стрелка вниз" или CTRL-d пока курсор не установится на пункте "Filecabinet", и нажмите ENTER для его выбора. После выбора пункта "Filecabinet", окно "/home/login" появится в рабочей области.
  4. Нажмите CANCEL (или CTRL-f 6) для того, чтобы закрыть окно "/home/login". Оно исчезнет и вы вернетесь в меню "Office of login".

Введите первую букву пункта меню.

Второй способ выбора пункта меню заключается в простом наборе его названия.

  1. Введите букву О. (Регистр букв игнорируется). Заметьте, что курсор немедленно перемещается к пункту "Other users".
  2. Теперь введите букву W. FACE не знает, что вы изменили свое решение относительно выбора пункта меню. FACE помнит, что вы ввели букву О и пытается найти пункт меню, начинающийся с букв OW. Если пункт меню не найден, вы об этом узнаете через строку сообщений.
  3. Нажмите клавишу "Стрелка вниз" (или CTRL-d) или используйте любую другую клавишу перемещения курсора, чтобы сбросить введенные буквы. Если вы допустили ошибку при наборе или изменили решение о выборе пункта, вы должны нажать клавишу перемещения курсора, чтобы удалить введенные буквы, перед тем как вы сможете опять использовать этот способ для выбора другого пункта меню.
  4. Введите опять букву О и нажмите ENTER. В этот раз вы выбрали пункт "Other Users" из оффис меню, на экране отображается меню "Other Users" (Другие пользователи) и становится активным. Меню "Other Users" выводит список регистрационных идентификаторов других пользователей, имеющих доступ к вашей системе.
  5. Нажмите CANCEL для того, чтобы закрыть меню "Other Users".

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

5.3.3. Как работать с формой

Вторым типом окна в FACE является форма. Форма выглядит подобно бланку, который надо заполнить. На рис. 8 показано, как выглядит одна из форм в FACE (форма "Display Frames"). tes 23

Форма Display Frames

	------------------------------------------------------------

	             AT&T FACE - JUN 19, 1989

	  -----------------------
	 | 3 Diaplay Frames Form |
	  -----------------------
	 | Fist Frame  :________ |
	 | Second Frame:________ |
	 | Third Frame :________ |
	 | Fourth Frame:________ |
	  -----------------------

	------------------------------------------------------------------
	|HELP||CHOICES||SAVE||PREV-FRM||NEXT-FRM||CANCEL||CMD-MENU||RESET|
	------------------------------------------------------------------
	------------------------------------------------------------------

Рис. 8.

Информация, которую вы вводите в поля формы, используется оболочкой FACE для изменения внешнего вида вашего FACE оффиса, или для изменения того, что делает команда FACE. На рис. 8, вы можете вводить информацию в поля "First Frame", "Second Frame", "Third Frame" и "Fourth Frame" (Первое Окно, Второе Окно, Третье Окно и Четвертое Окно, соответственно). (Как заполнять эту форму описывается в разделе "Изменение других параметров оффиса).

Следует помнить, что формы часто появляются с некоторыми значениями по умолчанию в большинстве полей. (Значение по умолчанию - это значение, помещаемое в поле автоматически средой FACE и остающееся постоянным, если вы его не измените.)

5.3.3.1. Метки функциональных клавиш в формах

Формы имеют другой набор функциональных клавиш в отличие от меню. Они показаны на рис. 9. Заметьте, что так как в формах доступны только восемь функциональных клавиш, клавиша F8 не резервируется для переключения уровней, как в меню. Вы увидите, что метки функциональных клавиш меняются, когда вы будете практиковаться в перемещениях и редактировании в форме.

Функциональные клавиши, доступные в формах

	---------------------------------------------------
	                  Function Key
	                 ----------------
	                 F1    HELP
	                 F2    CHOICES
	                 F3    SAVE
	                 F4    PREV-FRM
	                 F5    NEXT-FRM
	                 F6    CANCEL
	                 F7    CMD-MENU
	                 F8    RESET
	---------------------------------------------------

Рис. 9.

Три функциональные клавиши (CHOICES, SAVE и RESET) отсутствуют в меню. Функциональная клавиша CHOICES покажет допустимые значения текущего поля. (Если появится сообщение "No choices available" - "Нет допустимых значений" в строке сообщения, это означает, что вы должны ввести допустимые значения для поля.) Функциональная клавиша RESET восстанавливает значение текущего поля, которое было до вашего редактирования. Функциональная клавиша SAVE сохраняет значение всех полей и закрывает форму.

5.3.3.2. Перемещение в форме и редактирование полей.

Так как вы вводите новую информацию в форму или меняете информацию в некоторых полях, а также перемещаетесь от поля к полю, вы нуждаетесь в средствах редактирования и перемещения. Для перемещения внутри формы и редактирования некоторые из именованных клавиш работают в формах по-другому, чем в меню. Клавиши используемые внутри форм приведены на рис. 10.

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

Клавиши перемещения, используемые в формах

Именованная клавиша Альтерн. послед. Действие
Стрелка вниз CTRL-d Перемещает курсор вниз к следующему полю. Если курсор - в последнем поле, текущим становится первое поле
Стрелка вверх CTRL-u Перемещает курсор вверх к предыдущему полю. Если курсор - в первом поле, то текущим становится последнее поле
-> CTRL-r Перемещает курсор вправо на один символ внутри поля без изменения содержимого поля. Перехода к следующему полю не осуществляется
<- CTRL-l Перемещает курсор влево на один символ внутри поля без изменения содержимого поля. Перехода к следующему полю не осуществляется
TAB CTRL-i Перемещает курсор к следующему полю в форме. Если курсор - в последнем поле, текущим становится первое поле
BACKTAB CTRL-t Перемещает курсор к предыдущему полю в форме. Если курсор - в первом поле, то текущим становится последнее поле
HOME
BEG
CTRL-f b
CTRL-b
Перемещает курсор в первую позицию текущего поля
HOME-DOWN
END
CTRL-f e
CTRL-e
Перемещает курсор в последнюю позицию текущего поля
BACKSPACE CTRL-h Перемещает курсор влево, удаляя символ слева
SPACEBAR нет Заменяет текущий символ на пробел и перемещает курсор на один символ вправо
DEL или
DELETE-CHAR
CTRL-x Удаляет символ над курсором сдвигая остаток строки
DELETE-LINE CTRL-k Удаляет текущую строку в поле, перемещая остаток текста вверх на одну строку. Если поле состоит из одной строки, клавиша действует также как CLEAR-LINE
RESET CTRL-f r Восстанавливает предыдущее значение поля
CLEAR-EOL CTRL-f y Чистит строку с текущей позиции до конца строки
CLEAR
CLEAR-LINE
CTRL-y Чистит текущую строку в текущем поле

Рис. 10.

В следующем примере вы научитесь перемещению в форме Office Functions (функции оффиса) и редактированию его полей. Помните, что в FACE "выбрать" означает, нужно перейти к пункту меню и нажать ENTER.

Если курсор выглядит в виде знака подчеркивания (_), его бывает трудно различить при использовании форм, так как поля по умолчанию подчеркнуты.

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

  1. Выберите "Preferences" из меню "Office of login".
  2. Выберите "Office Functions" из меню "Preferences". Форма "Office Functions" появится на экране. Эта форма имеет семь полей и курсор позиционируется на первое поле "Delete objects in my Wastebasket after (# of days)" ("Удалить обьекты из корзины для бумаг через # дней). Значением по умолчанию для данного поля является 1. Заметьте, что метки функциональных клавиш внизу экрана изменились. Строка сообщения указывает допустимые значения для данного поля.
  3. Введите 32 в это поле и нажмите ENTER. Обратите внимание что появилось сообщение "Input is not valid" ("недопустимое значение") и курсор не переместился к следующему полю. Если FACE обнаружит, что новое значение, которое вы пытаетесь ввести в поле, недопустимо (здесь 32), вы не сможете выйти из поля до тех пор, пока поле содержит недопустимое значение. Вы можете использовать это поле, чтобы проверить некоторые клавиши редактирования, приведенные на рис. 10, такие как BACKSPACE или DELETE-CHAR.
  4. Нажмите RESET (или CTRL-f 8) для восстановления предыдущего значения этого поля. RESET действует только на текущее поле
  5. Перейдите к полю "Prompt before deleting ..." ("Подтверждение перед удалением"). Значение по умолчанию в этом поле "yes". Нажмите CHOICES (или CTRL-f 2). Значение в поле изменится на "no".
  6. Нажмите CHOICES еще раз и значение в поле опять изменится на "yes".
  7. Нажмите клавишу "стрелка вниз" для перехода к полю "Display Folder Format:" ("Формат изображения набора:"). Значение по умолчанию в этом поле "Name only" ("Только имя").
  8. Нажмите CHOICES (или CTRL-f 2) еще раз. На этот раз на экране появится меню "Choices" ("Выбор"). Клавиша CHOICES (или CTRL-f 2) будет показывать допустимые значения для поля сменой значений в самом поле если есть менее четырех допустимых значений. Если допустимых значений - четыре или больше, они выводятся в меню "Choices". Меню "Choices" несколько отличается от других меню. Во-первых, доступны только две функциональные клавиши: ENTER и CANCEL. Во-вторых, выбор пункта в меню "Choices" не открывает другое окно. Выбраный пункт просто вводится в поле формы.
  9. Нажмите функциональную клавишу с меткой ENTER (или CTRL-f 3), для выбора любого значения из меню "Choices". (Вы можете также нажать RETURN или CTRL-m чтобы выбрать пункт меню "Choices".) Меню "Choices" исчезает и выбранное значение помещается в поле "Folder Display Format:".
  10. Нажмите CANCEL (или CTRL-f 6), которая аннулирует любые изменения, которые вы могли сделать во всех полях формы "Office Functions" и закрывает ее, возвращая вас в меню "Preferences".
  11. Нажмите CTRL-j, для доступа к командной строке, введите "cancel" и нажмите ENTER. Меню "Preferences" закроется и вы вернетесь в "Office" меню. Когда вы вводите "cancel" в командной строке, FACE делает то же, что и при нажатии CANCEL (или CTRL-f 6). На самом деле, когда вы нажимаете CANCEL, FACE просто выполняет команду "cancel". То есть, закрывает текущее окно и удаляет его из рабочей области.
  12. Нажмите CANCEL (или CTRL-f 6), чтобы закрыть окно "Office" и вернуться в главное FACE меню.

5.3.4. Перемещение от окна к окну

Термин "перемещение", до настоящего момента, применялся только для описания движения внутри окна. Кроме того, вы можете передвигаться от окна к окну. Мы уже использовали для этого два метода:

  • выбор (открытие) пункта всегда вызывает переход к окну, в котором отображается этот пункт (кроме меню "Choices");
  • отказ (закрытие) окна приводит к перемещению в предыдущее активное окно (кроме меню "Choices").

Для того, чтобы попробовать перемещение от окна к окну без закрытия текущего окна, вам необходимо иметь открытыми несколько окон на вашем FACE экране. Например, чтобы открыть окна "Office of login", "/home/login" и "Корзина для бумаг", проделайте следующее:

  1. Выберите "Office of login" из главного FACE меню.
  2. Выберите "Filecabinet" из меню Office of login.
  3. Выберите "WASTEBASKET" из меню /home/login.

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

5.3.4.1. Переход к другому окну с помощью командной строки

Этот метод использует номера окон, которые появляются слева от названия каждого открытого окна. Заметьте, что каждое открытое окно имеет уникальный номер, начиная с главного FACE меню с номером 1.

  1. Нажмите CTRL-j для доступа к командной строке.
  2. Введите число 2 и нажмите ENTER для перехода назад к окну 2 (Office меню).
  3. Выберите "Other Users". Появляется меню Other Users и вы можете посмотреть список других пользователей, чтобы найти, например, требуемое регистрационное имя.
  4. По окончании работы с этим меню, нажмите CTRL-j, введите "cancel" и нажмите ENTER для закрытия меню. Курсор оказывается в предыдущем активном окне (в меню Office of login).

Для перемещения в окно по его номеру, также можно использовать команду "goto".

5.3.4.2. Перемещение от окна к окну с помощью функциональных клавиш

Большинство окон, которые появляются на FACE экране имеют метки PREV-FRM и NEXT-FRM, соответствующие функциональным клавишам F4 и F5. Эти функциональные клавиши приводят к перемещению курсора от окна к окну. Причем новое окно становится текущим, вместо предыдущего.

Сейчас, меню Office of login должно быть текущим,

  1. Нажмите PREV-FRM (или CTRL-f 4) для перехода курсора к окну, которое было активным до открытия меню Office of login. Курсор переходит в главное FACE меню.
  2. Нажмите NEXT-FRM (или CTRL-f 5) для перехода курсора обратно в меню Office of login.
  3. Нажмите CANCEL (или CTRL-f 6), чтобы закрыть меню Office of login. Главное FACE меню должно опять стать активным окном.

5.3.4.3. Перемещение от окна к окну с помощью команды frm-mgmt.

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

  1. Выберите "Office of login" в главном FACE меню.
  2. Нажмите CMD-MENU (или CTRL-f 7) для вызова командного меню. Вы можете выбирать пункты из командного меню так же, как и из любого другого. Однако в командном меню, пунктами являются не меню или формы, а команды FACE. Командой перехода от окна к окну является "frm-mgmt".
  3. Выберите "frm-mgmt" из командного меню. Командное меню исчезнет. Появится меню управления окнами, показывая пункт "list".
  4. Выберите "list". Появится меню Open frames (открытые окна), показывая список открытых окон на вашем экране.
  5. Выберите Office of login. Меню открытых окон исчезнет и окно Office of login станет активным.
  6. Нажмите CANCEL (или CTRL-f 6), чтобы закрыть окно Office of login. Главное FACE меню опять станет активным.

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

5.3.5. Управление внешним видом вашего оффиса

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

Команда "frm-mgmt" позволяет вам изменить размеры и положение открытого окна. Кроме того эту команду можно использовать для вывода списка всех открытых окон и активации одного из них.

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

5.3.5.1. Перемещение окна

Многим нравится когда окна располагаются в специальных местах на экране, например, окно "/home/login" в верхнем правом углу рабочей области. Другие, возможно, захотят переместить окна, чтобы несколько окон были видны одновременно.

В следующем примере мы будем использовать команду "frm-mgmt" из командного меню для перемещения окна "/home/login" в другое место вашей рабочей области.

  1. Выберите "Office of login" из главного FACE меню.
  2. Выберите "Filecabinet" из Office меню. Окно, которое мы хотим переместить, здесь окно /home/login, должно быть активным до выполнения команды "frm-mgmt".
  3. Нажмите CMD-MENU (или CTRL-f 7) для вызова командного меню.
  4. Выберите "frm-mgmt".
  5. Выберите "move" из меню управления окнами. Заметьте, что курсор находится в левом верхнем углу окна /home/login, а остальные три угла мигают и появляется сообщение, информирующее о том что угол окна можно перемещать.
  6. Используйте клавиши со стрелками для перемещения маркера верхнего левого угла: когда он окажется там, где вы хотите, нажмите ENTER. Окно /home/login на вашем экране переместилось.
  7. Перейдите назад в Office меню, но не закрывайте "/home/login" (используйте PREV-FRM или CTRL-f 4). Заметьте, что окно /home/login остается на новом месте.
  8. Перейдите обратно в окно /home/login, используя NEXT-FRM (или CTRL-f 5), и затем нажмите CANCEL (или CTRL-f 6) чтобы закрыть его.
  9. Выберите "Filecabinet" снова из Office меню . Окно /home/login вернулось в свое начальное положение. Помните, если вы перемещаете окно с помощью "frm-mgmt" и затем закрываете его, оно может вернуться в свое начальное положение при повторном открытие.

5.3.5.2. Изменение формы окна

В следующем примере вы измените форму окна /home/login, используя команду "frm-mgmt".

  1. Вы должны находиться в окне /home/login. Если вы не в этом окне перейдите в него.
  2. Нажмите CTRL-j для доступа к командной строке, введите "frm-mgmt" и нажмите ENTER.
  3. Выберите "Reshape" из меню управления окном.
  4. В ответ на подсказку о перемещении верхнего левого угла, используйте клавиши со стрелками для позиционирования в требуемое место.
  5. Нажмите ENTER. Появится подсказка о перемещении правого нижнего угла.
  6. Используйте стрелочные клавиши для увеличения окна и нажмите ENTER. Помните, после того как вы закроете окно, которое вы изменили, или выйдете из FACE, окно вернется в то место, которое FACE присваивает ему автоматически. Если окно содержит меню из набора файлов, любая команда, вызывающая обновление меню, такая как создание нового файла, также вызовет и восстановление начальной формы и положения окна.

Можно изменить форму только текстовых окон и меню. Изменить окно, являющееся формой, нельзя.

5.3.6. Командное меню

Командное меню, показанное на рис. 11, является полным списком команд FACE, из которого вы можете выбирать команды, точно также как вы выбираете пункты любого другого меню FACE. Командное меню вызывается нажатием CMD-MENU (или CTRL-f 7). (Все команды этого меню можно выполнить непосредственно с помощью командной строки. Для этого введите CTRL-j, затем имя команды и нажмите ENTER. Командное меню является своего рода помощью.)

Командное меню

	-----------------------------------------------------------
	              AT&T FACE - Jun 19, 1989

	 -----------------------------------
	 |                                 |
	 -----------------------------------
	 |>cancel   goto       rename      |
	 | cleanup  help       run         |
	 | copy     move       security    |
	 | create   next-frm   show-path   |
	 | delete   organize   time        |
	 | display  prev-frm   undelete    |
	 | exit     print      unix-system |
	 | find     redescribe update      |
	 | frm-mgmt refresh                |
	 |----------------------------------

	-----------------------------------------------------------
	|HELP||  ||ENTER||PREV-FRM||NEXT-FRM||CANCEL||CMD-MENU||  |
	-----------------------------------------------------------
	-----------------------------------------------------------

Рис. 11.

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

  1. Выберите "Office of login" из главного FACE меню.
  2. Нажмите CMD-MENU (или CTRL-f 7) для вызова командного меню. В этой точке вы можете проверить действие клавиш перемещения, которые работают с многоколоночными меню. Заметьте, что клавиши типа -> (или CTRL-r) и <- (или CTRL-l) работают иначе, чем в меню с одной колонкой. Вы уже знаете, что можете выбрать команду, перемещаясь к ней и нажав ENTER. Если выбранная команда требует от вас дополнительной информации, появится соответствующая подсказка. Также вы помните, что нажатие CTRL-j переводит курсор в командную строку. Если вы нажмете CTRL-j в командном меню пункт, на котором установлен курсор, появится в командной строке после подсказки.
  3. Перейдите к команде time и введите CTRL-j. Заметьте, что эта команда появилась в командной строке сразу после подсказки "-->". Командное меню исчезает, и метки функциональных клавиш показывают только CANCEL и HELP. Это функциональные клавиши, которые работают в командной строке.
  4. Нажмите CANCEL (или CTRL-f 6). Подсказка в командной строке исчезает. Вы отказались от команды time и окно, которое было активным до командной строки (Оффис меню) становится снова активным.
  5. Нажмите CMD-MENU (или CTRL-f 7) снова, перейдите к cancel и нажмите CTRL-j для доступа к командной строке. Командное меню исчезает (закрывается), и "cancel" появляется в командной строке.
  6. Нажмите ENTER. Нажав эту клавишу вы выполнили команду cancel. В этот раз cancel работает с активным окном (меню Office of login). Меню Office of login исчезает и активным окном становится главное FACE меню.

5.3.7. Получение помощи

Средство help является встроеной помощью для пользователя, предоставляя справочную информацию на каждый аспект использования FACE. Данный раздел обсуждает, как получить помощь по конкретным командам, меню и полям форм. Следующий раздел обсуждает как получить помощь о FACE.

5.3.7.1. Помощь по командам, меню и полям форм FACE

Помощь по активной команде, меню или полю формы получить очень просто, т.к. команда help всегда вызывается по функциональной клавише F1 (или CTRL-f 1) если помощь в данной точке доступна.

Когда активным окном является командное меню, нажатие HELP выводит окно с информацией о том как использовать команду на которую указывает курсор.

Когда активным окном является меню, нажатие HELP выведет окно с информацией, описывающей каждый пункт данного меню.

Когда активным окном является форма, нажатием HELP выводит окно с информацией о том как заполнять текущее поле.

Если вы в командной строке, нажатие HELP выводит меню команд, и дает помощь о команде, которую вы выберете.

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

  1. Перейдите к меню Office of login.
  2. Нажмите CMD-MENU или CTRL-f 7, чтобы открыть командное меню. Курсор устанавливается на команду cancel. Допустим вы хотите вспомнить о том, что делает эта команда, до того как ее использовать.
  3. Нажмите HELP (или CTRL-f 1), чтобы получить окно помощи по команде cancel. Командное меню исчезает и появляется новое окно (Help on cancel), выдающее краткую информацию о том, что делает эта команда и как ее использовать. Функциональные клавиши F2 и F3, теперь имеющие метки PREVPAGE и NEXTPAGE, показывают вам предыдущую и следующую полные страницы текста в окне помощи. В зоне прокрутки, на правой границе окна, отображается символ "v", показывающий, что имются еще страницы текста.
  4. Нажмите NEXTPAGE (или CTRL-f 3). В зоне прокрутки появится еще один символ "^", который означает, что имеется предществующая страница текста, перейти к которой можно по PREVPAGE (или CTRL-f 2).
  5. Нажмите CANCEL (или CTRL-f 6) , чтобы закрыть окно помощи.

5.3.7.2. Получение помощи о FACE

Помощь о FACE вы можете получить после нажатия клавиши HELP. Эту помощь можно получить из меню "Обзор содержания" ("Overview of Contents"), к которому можно перейти нажатием функциональной клавиши CONTENTS (или CTRL-f 8), отображаемой когда на экране открыто окно помощи. Общая помощь не доступна из первого уровня функциональных клавиш, т.к. она используется менее часто, чем помощь по конкретным командам и окнам.

Вы можете попробовать следующий пример из любого окна (если вы толькo что завершили предыдущий пример, будет активным меню "Office of login").

  1. Нажмите HELP (или CTRL-f 1) и информационное окно отобразит текст о текущем активном окне. Заметьте, что меткой функциональной клавиши F8 стало "CONTENTS".
  2. Нажмите CONTENTS или CTRL-f 8. Функциональная клавиша F8 имеет такую метку в любом окне помощи. Появляется меню "Содержание помощи", выводящее список разделов о использовании FACE.
  3. Выберите "Окна и функциональные клавиши" ("Frames and Functional Keys") из меню содержания. Появляется соответствующее окно помощи. Символ в зоне прокрутки показывает, что есть еще страницы текста.
  4. Нажмите NEXTPAGE (или CTRL-f 3). Другой символ прокрутки покажет, что текущей странице предшествует еще одна. Клавиша PREVPAGE (или CTRL-f 2) покажет вам предыдущую страницу.
  5. Нажмите CMD-MENU (или CTRL-f 7), и выберите команду cleanup. Команда cleanup закрывает текущее окно, а также все другие окна кроме главного FACE меню.

В окне помощи или другом текстовом окне следующие клавиши позволяют вам перемещаться по тексту. Эти клавиши являются добавлением к PREVPAGE и NEXTPAGE. Помните, что если ваша клавиатура не имеет каких-либо именованных клавиш (или они не работают), вы можете использовать альтернативные последовательности.

Клавиши перемещения в окне помощи и других текстовых окнах

Именованная клавиша Альтернатив. последов. Действие в текстовом окне
Стрелка вверх CTRL-u Перемещает курсор вверх на одну строку
Стрелка вниз CTRL-d Перемещает курсор вниз на одну строку
SCROLL-DOWN CTRL-f d Прокручивает текст на одну строчку вниз
SCROLL-UP CTRL-f u Прокручивает текст на одну строчку вверх
PAGE-DOWN CTRL-w Отображает следующую полную страницу текста, оставляя две строки текущей страницы
PAGE-UP CTRL-v Отображает предыдущую полную страницу текста, оставляя две строки текущей страницы
BEG CTRL-b Отображает первую полную страницу текста.
END CTRL-a Отображает последнюю полную страницу текста.

Рис. 12.

5.3.8. Выход из FACE

Вы завершили курс начинающего по оболочке FACE. Если вы хотите выйти из FACE используйте пункт "Выход из FACE" ("Exit FACE") главного FACE меню. Проделайте следующее:

  1. Для того, чтобы выйти из FACE необязательно закрывать все открытые окна. Перейдите к главному FACE меню любым способом, который вам нравится.
  2. Выберите Exit FACE. Чтобы убедиться, что вы действительно хотите выйти появляется следующее сообщение:
    	------------------------------------------------------------
    	             AT&T FACE - JUN 19, 1989
    
    	  ----------------------------------
    	 | 4          Confirm exit          |
    	  ----------------------------------
    	 |                                  |
    	 | You are about to exit AT&T FACE. |
    	 |                                  |
    	 |                                  |
    	 |                                  |
    	  ----------------------------------
    
    	Press CONT to exit or CANCEL to cancel the exit.
    
    	------ ------ ------ ------ ------ -------- ---------- ------
    	|    | |    | |CONT| |    | |    | |CANCEL| |CMD-MENU| |    |
    	------ ------ ------ ------ ------ -------- ---------- ------
    	-------------------------------------------------------------
    
  3. Нажмите CONT для подтверждения выхода, или нажмите CANCEL для того, чтобы отказаться от процедуры выхода, если вы изменили свое решение и хотите продолжить работу с FACE.

Если FACE запустился автоматически, когда вы зарегистрировались в системе, вы выйдете из системы по выходу из FACE. В противном случае вы вернетесь на подсказку системы UNIX. Вы можете изменить этот режим с помощью пункта "Office Functions" из меню "Preferences".

Помните всегда о необходимости выхода из FACE и из вашей системы перед тем как оставить свой терминал. Это предохраняет и ваши файлы и всю компьютерную систему.

6. Редактор текстов ed

6.1. Введение

Редактор текстов ed является диалоговой (интерактивной) программой, которая позволяет добавлять, перемещать, удалять текст и извлекать его из других файлов. Имеется возможность замены слова или части слова в тексте как для одной указанной строки, так и для части файла или всего файла. Кроме того, можно просмотреть текстовый файл, напечатать его частично или целиком, напечатать строки, содержащие определенное слово и т.д.

ed работает с копией обрабатываемого файла, которая создается в буфере редактора и хранится там в течение всей обработки. Это предохраняет исходный файл от возможных разрушений при совершении грубых ошибок. Сделанные в копии изменения не влияют на исходный файл до тех пор, пока не будет выдана команда записи.

Редактор запоминает имя обрабатываемого файла (первоначально - имя исходного загруженного файла). По желанию пользователя это имя можно заменять для получения новых вариантов файла.

Если размер файла превышает размер буфера редактора, файл приходится делить на части с помощью команды split, редактировать его по частям, а затем снова объединять с помощью команды cat.

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

Все вводимые командные строки должны заканчиваться символом <CR>.

6.2. Вызов редактора

Синтаксис команды:

	ed [файл]<CR>

где файл - имя файла.

Если файл с указанным именем существует, в ответ будет выдано число символов в файле. В противном случае редактор выдает строку "?file".

6.2.1. Дозапись текста

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

	a 

в ответ система переведет курсор на новую строку.

Для отмены режима дозаписи в первой позиции строки вводится команда "." (точка) , за которой следует символ "конец строки" (<CR>).

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

6.3. Запись файла

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

Формат команды:

	w[файл]<CR>

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

Если имя файла опущено, запись производится в текущий файл. В результате работы команды содержимое буфера будет скопировано в файл (предыдущая информация в файле будет уничтожена) и выдано сообщение о количестве символов в файле. Если в ответ на попытку записи появляется сообщение "?имя_файла", это означает, что запись в данный файл или справочник закрыта.

При записи файла создается копия текста - содержимое буфера не изменяется, так что можно продолжить работу. Рекомендуется время от времени записывать содержимое буфера, т.к. в случае сбоя системы или совершения какой-либо ошибки весь находящийся в буфере текст может быть потерян.

6.4. Выход из редактора

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

завершения редактирования текста и выхода из редактора.

Формат команды:

	q<CR>

Так как буфер редактора при выполнении команды "q" уничтожается, для сохранения результатов редактирования буфер должен быть предварительно скопирован командой записи "w".

Если после изменения информации не была выполнена команда записи, в ответ на первую команду "q" выдается подсказка "?" и никаких действий не производится. При повторном наборе команды осуществляется выход с уничтожением накопленной в буфере информации.

6.5. Чтение файла

6.5.1. Команда редактирования файла (e)

Формат команды:

	e имя_файла<CR>

По данной команде файл с именем "имя_файла" копируется в буфер редактора. Предыдущее содержимое буфера при этом теряется.

Редактор сохраняет имя скопированного в буфер файла, благодаря чему после завершения редактирования файла нет необходимости задавать его имя в команде записи "w". Команда "w" произведет запись именно в этот файл.

Команда языка shell:

	ed имя_файла<CR>

эквивалентна командам

	ed<CR>
	e имя_файла<CR>

По завершению чтения файла выдается размер считанного файла (в байтах).

6.5.2. Команда чтения файла (r)

Формат команды:

	[n]r имя_файла<CR>

где n - номер строки в буфере, после которой помещается файл.

Команда "r" читает содержимое файла в буфер редактора, причем содержимое файла добавляется к тому, что уже хранится в буфере.

Если "n" отсутствует, то читаемая информация дописывается после последней строки, хранящейся в буфере, в противном случае, считываемый файл помещается после строки с номером "n".

Если имя файла отсутствует в команде, то считывается файл, имя которого является текущим.

По завершению чтения редактор выдает размер считанного файла (в байтах).

6.6. Печать текста

6.6.1. Команда печати (p)

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

Формат команды:

	[n[, k]]p<CR>

где n, k - номера начальной и конечной печатаемых строк.

Команде "p" может предшествовать один или два номера строки. Если номер не задан, то редактор печатает текущую строку.

Если задан номер только одной строки (с последующей буквой "p" или без нее), то печатается одна заданная строка (и она становится текущей).

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

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

	     Примеры.
	1,2p - печать первых двух строк буфера;
	1,$p - печать всех строк буфера; символ $  используется  для
		 обозначения последней строки буфера;
	$-1, $p - печать двух последних строк буфера; dfn  .-3,  -1p
		 печать трех предыдущих строк.

В сущности, команде "p" могут предшествовать 0, 1 или 2 номеров строк. Если номера строк не указаны, печатается текущая строка. Однократное нажатие клавиши <CR> вызывает печать следующей строки: оно эквивалентно команде ".+1p". Команда "-" эквивалентна команде ".-1p".

6.6.2. Команда печати (l)

Команда "l" аналогична команде "p", но предоставляет больше информации. Ее главным свойством является то, что она печатает управляющие символы, такие как символы табуляции (tab) и возврата на позицию (backspace). Кроме того, команда "l" переносит строки при печати. Например, любая строка, длина которой превышает 72 символа, печатается на нескольких строках. Чтобы указать, что строка была перенесена и где она была перенесена, в конце каждой части переносимой строки вставляется обратная дробная черта (\).

Некоторые управляющие символы:

  • символ табуляции - печатается как ">";
  • код возврата на позицию - печается как "<";
  • код перехода на новый лист - печатается как "\14";
  • код вертикальной табуляции - печатается как "\13";
  • "звуковой сигнал" - печатается как "\07";
  • код "новая строка" - печатается как "\n".

6.7. Просмотр файла

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

Точка обозначает номер текущей строки. Ее можно использовать различными способами. В частности, можно ввести:

	., $p 

это приведет к распечатке всех строк от текущей строки до конца буфера включительно.

Точка наиболее полезна при использовании в комбинациях следующего вида:

	.+1 (или, что то же самое .+1p)

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

	.-1 (или .-1p)

что означает "распечатать строку перед текущей строкой". Это позволяет, при желании, двигаться назад.

Еще одной полезной командой является команда вида:

	.-3, .-1p 

которая распечатывает три предшествующие строки.

Необходимо помнить о том, что обе команды печати "p" и "l" изменяют номер текущей строки. Можно в любое время узнать ее значение, введя:

	.=

редактор ответит печатью значения номера текущей строки.

6.7.1. Команда печати (n)

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

Формат команды:

	[n[, k]]n<CR>

где n, k - номера начальной и конечной печатаемых строк.

Пример использования клманды "n":

Пример.

        1, $n<CR>
        1         This is the first line of test.
        2         This is the second line.
        3         This is the third line.
        4         This is the fourth line.
        5         five
        6         six
        7         seven
        8         eight
        9         nine
        10        ten 

6.8. Команда удаления строк (d)

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

Формат команды:

	[n[, k]]d<CR>

где n, k - номера начальной и конечной удаляемых строк.

Команде "d" может предшествовать один или два номера строки. Если номер не задан, то редактор удаляет текущую строку.

Если задан номер только одной строки, то удаляется указанная строка, текущей становится строка, следующая за удаленной.

Если задано два номера строки, то удаляются все строки в указанном интервале от n до k включительно. Текущей строкой всегда становится строка, следующая за последней удаленной строкой, кроме случая, когда удаляется последняя строка буфера. В этом случае текущей станет последняя строка буфера.

Пример.

	4, $d 

удаление из буфера строк с 4-й по последнюю включительно. В буфере после выполнения команды останется 3 первых строки. Текущей строкой станет третья строка буфера.

6.9. Команда отмены редакции (u)

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

	u<CR>

Например, команда u полезна для восстановления текста, случайно вами удаленного. Если вы удалили все строки в файле и затем ввели команду "p", редактор ed ответит "?", что означает, что в файле нет ничего. Воспользуйтесь командой u для восстановления текста. Экран будет выглядеть следующим образом:

        1, $p<CR>
        This is the first line.
        This is the middle line.
        This is the last line.
        1, $d<CR>
        p<CR>
        ?
        u<CR>
        p<CR>
        This is the last line.

Примечание. Команда u не может быть использована с командой w или q.

6.10. Команда замены (s)

Команда замены "s" предназначена для изменения отдельных слов или символов в пределах одной строки или группы строк.

Общий формат команды:

	[n[, k]]s/x/y/[команда]<CR>

где x - группа символов или слов в строке, которые надо заменить (старый текст);
y - группа символов или слов, которые заменяют старое значение, указанное как "x" (новый текст);
n, k - номера начальной и конечной строк буфера, в пределах которых осуществляется замена;
/команда - одна из следующих 4-х команд:
g - заменить каждое появление группы символов (x) в каждой указанной строке;
l - отобразить последнюю строку замененного текста, включая непечатаемые символы;
n - отобразить последнюю строку замененного текста, вместе с номерами строк;
p - отобразить последнюю строку замененного текста.

Если номера строк не указаны, замена осуществляется в текущей строке.

Если указан номер только одной строки, то замена производится только в одной строке.

Для реализации замены в группе строк надо указать номера начальной (n) и конечной (k) строк, в пределах которых надо произвести замену.

При выполнении данной команды редактор просматривает строки, начиная с номера "n" и кончая номером "k" включительно. При обнаружении в какой-либо из них искомой группы "x" редактор заменяет ее на "y".

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

Если в командной строке указаны "n" и "k" и команда печати, то печатается только последняя измененная строка.

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

Пример.

        1, $s/a/a2/p 

замена символа "a" на "a2" производится в строках с 1-й по последнюю. Текущей станет последняя строка, она будет распечатана.

Используя команду "s", можно удалить группу символов (или один символ) в строке. Для этого команда замены должна быть задана следующим образом:

	s/x//

что фактически означает: заменить группу символов в текущей строке на "пусто", т.е. просто удалить заданные символы из строки.

Команда "s" заменяет лишь первую найденную искомую группу символов в строке. Если же надо заменить все случаи появления заданной комбинации символов в строке, используется команда "g":

	s/x/y/g 

Примеры.

	s/c/d/gp 

все появления символа "c" в текущей строке заменить символом "d" и распечатать строку;

	1, $s/c/d/gp 

замена всех символов "c" на символ "d" во всем буфере с печатью последней измененной строки.

В следующем примере содержится ошибка ввода. Пока строка, содержащая ошибку является текущей, произведите корректировку в ней. Старый текст: "ai" в слове "airor", новый текст - "er". Экран выглядит следующим образом:

Пример.

        a<CR>
        In the beginning, I made an airor.<CR>
        .<CR>
        .p<CR>
        In the beginning, I made an airor.<CR>
        s/ai/er/<CR>

Обратите внимание, что ed не дает ответа на команду замены. Чтобы проверить, что команда выполнилась успешно, выполните команду "p" или "n" как часть командной строки замены. .lin В следующем примере команда "n" используется для проверки того, что слово "file" заменит слово "toad".

Пример.

        .p<CR>
        This is a last toad
        s/toad/file/n<CR>
        1        This is a last file 

Чтобы заменить текст в строке, отличной от текущей, укажите номер строки.

Например, на следующем экране командная строка включает номер строки, которая будет изменена (строка 1), т.к. текущей является строка 3.

Пример.

        1, 3p<CR>
        This is a past toad
        testing testing
        come in toad
        .<CR>
        come in toad
        1s/past/test<CR>
        This is a test toad 

Как вы видите, ed напечатал последнюю строку автоматически после изменения, т.к. последний ограничитель опущен.

Наиболее универсальным средством ed является глобальная замена. Поместив команду "g" после последнего ограничителя в командной строке замены, вы сможете заменить каждое появление шаблона в каждой указанной строке. Заменим строку "es" на "ES":

        u<CR>
        1, $p<CR>
        This is a last toad
        testing testing
        come in toad
        testing 1, 2, 3
        1, $s/es/ES/g<CR>
        This is a last toad
        tESting tESting
        come in toad
        tESting 1, 2, 3

Другой способ - это использование глобального шаблона для поиска вместо указания границ строк:

        u<CR>
        1, $p<CR>
        This is a test toad
        testing testing
        come in toad
        testing 1, 2, 3
        g/test/s/es/ES/g<CR>
        1, 3p<CR>
        This is a tESt toad
        tESting tESting
        come in toad
        tESting 1, 2, 3

Рассмотрим следующие шаблоны:

     /шаблон<CR>
     ?шаблон<CR>
     v/шаблон<CR>

В следующем примере формат поиска v/шаблон используется для нахождения строк, которые не содержат шаблон "testing". Затем команда "s" используется для замены шаблона "in" на шаблон "out" в этих строках:

        v/testing/s/in/out<CR>
        This is a test toad
        come out toad 

6.11. Команда поиска контекста

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

6.11.1. Конструкция /.../

Формат команды:

	/текст/

где "текст" - искомый текст.

Редактор просматривает буфер, начиная со строки ".+1" (т.е. следующей за текущей), идет до конца буфера, затем продолжает поиск с первой строки буфера и до текущей строки включительно. При обнаружении строки с заданным текстом редактор распечатывает ее, и эта строка становится текущей.

В случае отсутствия в буфере искомого текста редактор возвращается к текущей строке и печатает символ "?".

Пример.

	/lop/

найти в буфере строку, содержащую последовательность символов "lop".

Команда поиска в комбинации с другими командами ("a", "i", "s", "t", "m") может успешно использоваться для указания необходимой строки.

Примеры.

	/lop/s//loop/p 

найти строку, содержащую слово "lop", и заменить его на "loop", затем распечатать эту строку;

	/текст/i 

поиск строки, содержащей указанный текст, и вставка перед найденной строкой.

В команде "s" искомый текст в левой части можно не указывать.

6.11.2. Конструкция ?...?

Редактор производит поиск не только в прямом, но и в обратном направлении. Для этого в команде поиска вместо символа "/" используется символ "?":

	?текст?

Это удобно в случае, если при редактировании текста необходимо вернуться назад.

6.11.3. Продолжение поиска

Если при поиске строки с искомым текстом оказалось, что это не та строка, то для продолжения поиска нужно задать команду в виде:
// - продолжить поиск в прямом направлении;
?? - продолжить поиск в обратном направлении.

6.12. Команда вставки строк (i)

Данная команда используется для вставки в текст строк, вводимых с терминала.

Формат команды:

	[n]i<CR>

где n - номер строки в буфере редактора, перед которой надо вставить новые строки.

Если "n" отсутствует, то строки вставляются перед текущей строкой.

Ввод новых строк с терминала завершается символом "." в первой позиции.

Текущей строкой после выполнения командыы "i" становится последняя вставленная строка.

Пример использования команды "i" для вставки 3-х строк перед 7-й строкой:

Пример.

        7i<CR>
        строка 1<CR>
        строка 2<CR>
        строка 3<CR>
        .<CR>

6.13. Команда замены строк (c)

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

Формат команды:

	[n[, k]]c<CR>

где n, k - номера начальной и конечной заменяемых строк.

По данной команде редактор удаляет строки с номерами от "n" до "k" включительно и заменяет их строками, вводимыми с терминала после команды "c".

Ввод новых строк завершается символом "." в первой позиции и <CR>.

Если в команде указан номер одной строки, заменяется одна строка.

Если номер строки не указан, то заменяется текущая строка.

Пример замены строк с ".+1" по последнюю.

Пример.

        .+1 $c<CR>
        ... строки текста ...
        .<CR>

Строки, которые вводятся между командами "c" и ".", займут место исходных строк между начальной строкой и конечной строкой. Это наиболее удобно при замене строки (или нескольких строк), содержащих ошибку.

6.14. Работа со строками

6.14.1. Разбиение строк

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

	текст xy текст 

может быть разбита на две между символами "x" и "y" следующим образом:

        s/xy/x\
        y/

команда:

        s/xy/x\
        zzz\
        y/

разобьет исходную строку на три, при этом будет добавлена строка "zzz".

6.14.2. Объединение строк (j)

Объединение строк осуществляется с помощью команды "j". Например, если имеются строки:

	текст x 
	y текст

то установив первую строку текущей и задав команду "j", получим:

	текст xy текст 

Можно объединить все строки в одну большую строку и распечатать ее.

6.14.3. Копирование строк (t)

Для копирования строк текста в буфере редактора используется команда "t".

Формат команды:

	[n[, k]]tl<CR>

где n, k - номера начальной и конечной заменяемых строк;
t - имя команды копирования;
l - номер строки, после которой размещаются копируемые строки с номерами от "n" до "k" включительно.

По данной команде строки с номерами от "n" до "k" включительно пересылаются на место после строки с номером "l".

Если в команде задан только номер одной строки, то пересылается строка с указанным номером.

Если номер строки не задан, то пересылается текущая строка.

Строки с номерами от "n" до "k" включительно сохраняются на своем прежнем месте.

Команду "t" удобно использовать для создания текстов с повторяющимися данными.

Пример.

        1, 7t15

группу строк с 1-й по 7-ю поместить после 15-й строки.

6.14.4. Перестройка строк

Предположим, что в начале каждой строки файла стоят имена вида:

        Петров П.К.
        Иванов С.Б 

и т.д., требуется переделать текст таким образом, чтобы инициалы стояли перед фамилиями, т.е.

        П.К. Петров
        С.Б. Иванов 

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

Альтернативный метод заключается в том, чтобы отметить элементы строки (в данном случае фамилию и инициалы), а затем переставить эти элементы. Если в левой части команды подстановки "s" какой-либо элемент образца заключен в "\(" и "\)", то он запоминается и может использоваться в правой части команды. В правой части команды обозначение "\1" относится к тому, что соответствало первой паре \(...\), "\2" - второй паре и т.д.

Следующая команда:

	1, $s/^\([^ ]*\) *\(.*\)/\2 \1/

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

6.14.5. Маркеры

Редактор ed позволяет пометить строку некоторым именем, чтобы впоследствии обращаться к ней по этому имени независимо от фактического номера строки. Это удобно при перемещении строк и отслеживании их по мере перемещения. Для маркировки используется команда назначения имени. Если ввести команду "kx", то текущая строка будет отмечена маркером с именем "x". Если перед "k" указывается номер строки, будет отмечена соответствующая строка. (Имя должно представлять собой одну строчную букву латинского алфавита). После этого можно ссылаться на отмеченную строку с помощью адреса "'x".

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

	a 
	   Первая строка вводимого текста
	   Вторая строка
	   Третья строка
	   Последняя строка
	   .
	   -3
	   ka
	   2
	   kb
	   $
	   'a, 'bm

в результате будет получена следующая последовательность строк:

   Третья строка
   Последняя строка
   Первая строка вводимого текста
   Вторая строка 

6.14.6. Адресация строк в редакторе

6.14.6.1. Адресная арифметика

Рассмотрим использование указателей строк вида ".", "$", "/.../" и "?...?" в сочетании с действиями "+" и "-". Так, команда:

	$-1

выдает предпоследнюю строку текущего файла.

Команда:

	$-5, $p 

распечатывает последние шесть строк. Если в файле нет шести строк, будет выдано сообщение об ошибке ("?").

Команда:

	.-3, .+3p 

распечатывает 7 строк, из них три строки до и три строки после текущей строки. Знак "+" может быть опущен. Знак "-" сам по себе представляет собой команду для возврата на одну строку в файле.

Команда:

	---

вызывает возврат на три строки, как и команда "-3".

Команда:

	-, .s/bad/good/

вызывает замену "bad" на "good" в текущей и пред- шествующей ей строках.

Знаки "+" и "-" могут использоваться при поиске с помощью "/.../", "?...?" и с "$". По команде:

	/текст/--

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

6.14.6.2. Номера строк и указатель текущей строки

Разрешается определять диапазон "n,m" (от строки с номером "n" до строки с номером "m"), где "n" - номер начальной строки, а "m" - номер конечной строки. Весь файл целиком с первой до последней строки задается диапазоном "1, $". Так, команда:

	1, $p 

вызывает выдачу всех строк файла.

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

Пример.

Команда:

	5p 

устанавливает указатель текущей записи на пятую строку.

В любой момент времени можно определить, каков текущий номер строки. Это делается с помощью команды ".=".

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

Можно указать несколько строк, задав диапазон "от, до". Указатель текущей строки "." можно использовать на месте начальной или конечной строки диапазона. Так, команда:

	., $p 

печатает все строки от текущей до конца файла.

6.14.6.3. Изменение указателя текущей строки

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

        .
        АБ
        .
        .
        БВ
        .

и, если текущая строка - первая, то команда:

	/А/, /Б/p 

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

При указании диапазона адресов вместо запятой используется точка с запятой. Символ ";" вызывает установку в то место, которое определяется при вычислении номеров строк. Фактически редактор "перемещает" указатель текущей строки. Команда:

	/А/; /Б/p 

распечатывает строки в диапазоне от "АБ" до "БВ", т.к. после нахождения строки с "А" эта строка становится текущей и поиск "Б" начинается после этой строки.

6.14.6.4. Прерывание работы редактора

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

Более определенно прерывается команда печати. Положение указателя текущей строки не изменяется до тех пор, пока печать не завершится. Таким образом, если запущена команда печати и она не напечатала нужную строку, при нажатии клавиши прерывания текущей строкой останется та строка, которая была в момент запуска команды "p".

6.14.7. Глобальные команды

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

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

6.14.7.1. Команда g

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

Общий вид командной строки (строк) с использованием команды "g" следующий:

	g/образец/ команда или перечень команд<CR>

Примеры.

	g/abdc/p 

печать всех строк буфера, содержащих последовательность "abdc";

	g/abcd/s//efjc/gp 

замена и печать всех строк буфера, в которых найдена последовательность "abcd";

	1, $s/abcd/efjc/gp 

замена во всех строках последовательности "abcd" на "efjc" и печать последней заменяемой строки;

	g/xxx/.-1s/abc/def/\
	.+2s/ghi/jkl/\
	.-2, .p 

замена в строках до и после каждой строки, содержащей "xxx", и печать всех трех строк.

6.14.7.2. Команда v

Команда "v" аналогична команде "g" за исключением того, что она работает с теми строками, которые не содержат заданный образец.

Общий вид командной строки (строк) при использовании команды "v":

	v/образец/ команда или перечень команд<CR>

Пример.

	v/xxx/s/aaa/bbb/

заменить во всех строках файла последовательность "aaa" на "bbb" кроме строк, в которых имеется последовательность "xxx".

6.15. Работа с файлами

6.15.1. Команда указания имени файла (f)

Данная команда предназначена для запроса или изменения сохраняемого редактором имени файла (текущего имени).

Формат команды:

	f [файл]<CR>

В ответ на команду "f" без агрумента редактор напечатает сохраненное им ранее имя файла (текущее).

Это имя запоминается редактором при вызове по команде shell:

	ed file 

или по команде редактора:

	e file 

Например, в результате выполнения команды:

	f file1

имя файла, хранимое редактором, будет заменено на новое имя "file1", и оно станет текущим.

Команда записи "w" без аргументов копирует буфер редактора в файл с текущим именем.

Пример создания двух вариантов файла "file1":

        ed file1
        f file2
          ...
        w
        w file3
        q

6.15.2. Объединение файлов

Предположим, что в файле "file1" сразу же после слов "текст..." требуется вставить "file2".

Для этого необходимо вызвать редактор для фала "file1", найти символы "текст..." и добавить в это место файл "file2":

        ed file1
        /текст.../
        текст...    (ответ редактора)
        .r file2

Команда "r" без адресов добавляет читаемые строки в конец, т.е. работает аналогично "$r".

6.15.3. Разбиение файла

Предположим, что нужно выделить в отдельный файл некоторую таблицу, чтобы ее можно было отдельно форматировать и проверять.

        .TS
        ... (содержимое)
        .TE 

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

        /^\.TS
        .TS  (редактор печатает найденную строку)
        .,/^\.TE/w table 

В результате этого поставленная цель будет достигнута. Можно выполнить все это и в одной команде:

	/^\.TS/;/^\.TE/w table 

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

6.15.4. Перекомпоновка файла

6.15.4.1. Перемещение строк (команда m)

Данная команда предназначена для перемещения строк в буфере редактора.

Формат команды:

	[n[, k]]ml<CR>

где n, k - номера начальной и конечной перемещаемых строк;
m - команда перемещения;
l - номер строки, после которой надо поместить строки с номерами от "n" до "k" включительно.

По данной команде строки с номерами от "n" до "k" включительно помещаются после строки с номером "l", причем на прежнем месте эти строки не сохраняются.

Пример.

	1, 3m$

группу строк с 1-й по 3-ю поместить после последней строки в буфере редактора.

Если указан один номер строки, то перемещается только эта строка.

Если номер отсутствует, то перемещается текущая строка.

Данная команда может успешно использоваться вместе с командой поиска.

Например, имеется следующий текст:

        ПЕРВЫЙ ПАРАГРАФ
        (текст)
        КОНЕЦ ПЕРВОГО ПАРАГРАФА
        ВТОРОЙ ПАРАГРАФ
        (текст)
        КОНЕЦ ВТОРОГО ПАРАГРАФА 

Если необходимо переставить параграфы местами, то это можно выполнить с помощью команды:

        /ВТОРОЙ/, /КОНЕЦ ВТОРОГО/m/ПЕРВЫЙ/-1

Строки, начиная со строки, содержащей слово "ВТОРОЙ", до строки, содержащей слова "КОНЕЦ ВТОРОГО" включительно, помещаются перед строкой, содержащей слово "ПЕРВЫЙ".

По завершинию операции перемещения текущей строкой становится последняя перемещенная строка (в последнем примере - это строка со словами "КОНЕЦ ВТОРОГО").

6.15.4.2. Копирование строк текста (t)

Команда копирования "t" аналогична команде "m", за исключением того, что блок текста не удаляется, а копия этого блока помещается после указанной строки текста.

Формат команды:

	[n[, k]]tl<CR>

где n, k - номера начальной и конечной копируемых строк; если указано только n, то копируется одна строка с номером n; если номер строки не указан, то копируется текущая строка;
t - команда копирования;
l - номер строки, после которой надо поместить строки с номерами от "n" до "k" включительно.

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

Пример.

        5, 8n<CR>
        5     Close the door of the room.
        6     Break glass of neareat alarm.
        7     Pull lever.
        8     Locate and use fire extinguishar.
        30n<CR>
        30    A chemical fire in the lab requires that you:
        6,8t30<CR>
        30, $n
        30    A chemical fire in the lab requires that you:
        31    Break glass of neareat alarm.
        32    Pull lever.
        33    Locate and use fire extinguishar.
        6, 8n<CR>
        6     Break glass of neareat alarm.
        7     Pull lever.
        8     Locate and use fire extinguishar.

Текст с 6-й по 8-ю строки остается на месте, копия этих трех строк помещается после 30-й строки.

6.16. Специальные символы

Некоторые символы имеют для редактора особое значение. К ним относятся: ".", "\", "$", "*", "[", "]", "^", "&". Эти символы обычно называются метасимволами.

6.16.1. Метасимвол . (точка)

В зависимости от контекста символ "." имеет несколько значений. lin В левой части команды подстановки и при поиске с помощью конструкции "/.../" символ "." означает любой одиночный символ. Таким образом, в результате поиска

	/x.y/

будут найдены строки текста, содержащие символы "x" и "y", между которыми находится любой символ, например:

        x+y
        x-y
        x y 

Символ ".", используемый для указания номера строки обозначает текущую строку.

Примеры.

	.+1s/a/,/

замена символа "a" на символ "," в строке, следующей за текущей. Символ ".", записанный в правой части команды замены "s", не имеет специального значения;

	1, 5s/,/./

замена символа "," на символ "." в строках с 1-й по 5-ю включительно.

Команда :

	.s/././

иллюстрирует все значения символа ".". Первая "." в команде - это номер текущей строки, вторая "." это метасимвол, который соответствует любому одному символу данной строки, третья "." - это настоящая точка в команде замены.

Такая команда, примененная, например к строке:

	ОШИБКА ЧТЕНИЯ.

дает результат:

	ОШИБКА ЧТЕНИЯ.

6.16.2. Метасимвол \ (обратная дробная черта)

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

	s/\./?/

замена символа "." на символ "?";

	/\.pp/

поиск строк, содержащих ".pp";

	/\/

поиск символа "\";

	/\//

поиск символа "/";

	s/\\\.//

удаление в текущей строке последовательности символов ".".

Для разделения полей в команде "s" может использоваться любой символ, а не только дробная черта (однако для контекстного поиска требуется использовать дробную черту). Например, если строка уже содержит много символов дробной черты, как в строке:

	//exec//sys.fort.go //etc ...

то можно использовать в качестве разделителей символ ":" (двоеточие). Удалить все символы дробной черты можно с помощью команды:

	s:/::g 

Если для стирания символов и удаления строк используются клавиши "#" и "@", их нужно вводить в виде "\#" и "\@" (это относится не только к работе с ed).

Если текст вводится с помощью одной из команд: "a", "i" или "c", то символ обратной дробной черты не является специальным, и требуется нажимать эту клавишу только один раз для каждой обратной дробной черты.

6.16.3. Метасимвол $ (денежный знак)

В зависимости от того, как используется знак денежной единицы ($), он может обозначать конец файла или конец строки. Когда указывается диапазон (от строки 1 до строки $), совершенно ясно, что речь идет о конце файла. "1, $p" вызовет распечатку всего файла. Но запись "s/$/./p" указывает, что точка будет помещена в конце текущей строки.

В команде:

	$s/$/$

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

6.16.4. Метасимвол ^ (отрицание)

Метасимвол "^" применяется так же, как метасимвол "$", за исключением того, что он указывает начало строки, а не конец.

Примеры.

	/^время/

поиск строки, начинающейся со слова "время";

	s/^/ /

поместить пробел в начало текущей строки.

Метасимволы можно объединять. Например, для того, чтобы найти строку, содержащую только символы "pp" можно использовать команду: /^.pp$/

6.16.5. Метасимвол * (звездочка)

Метасимвол "*" означает, что символ, за которым он следует, может повторяться произвольное число раз.

Если в тексте имеется большое количество пробелов, их можно сжать, например:

	Московское          время 18 часов 

В результате выполнения команды:

	s/e *время 1/e время 1/p 

получим:

	Московское время 18 часов 

Если скомбинировать точку и *, то можно сопоставить все символы. С помощью этой комбинации можно, например, заменить все символы в последней части строки:

        p<CR>
        Toads are alimy, cold creatures
        s/are.*/are wonderful and warm <CR>
        Toads are wonderful and warm 

ed автоматически запоминает последнюю строку символов в шаблоне поиска или замененный текст. Однако вы должны подсказать ed, что нужно повторить замену, используя знак "%". Знак "%" позволяет вам сделать одинаковую замену во многих строках, не используя глобальной замены. Например, заменим слово money на слово gold, повторим последнюю замену в строках от 1 до 3:

        1, $n<CR>
        1     I love money
        2     I need food
        3     I use money
        4     The IRS wants my money
        ls/money/gold<CR>
        I love gold
        3s//g<CR>
        I use gold
        1, $n<CR>
        1     I love gold
        2     I need food
        3     I use gold
        4     The IRS wants my money 

ed автоматически запоминает слово money, так что строка не будет повторена между первыми двумя ограничителями. Знак "%" говорит ed - использовать последний шаблон для замены (gold).

6.16.6. Метасимволы [] (квадратные скобки)

Метасимволы "[]" позволяют определить подмножество символов, которые необходимо распознавать при выполнении операции поиска или подстановки. Запись группы символов, заключенных в квадратные скобки, означает: "любой одиночный символ из указанных". Например, если "[0123456789]", это будет означать: "любая цифра". Можно записать и короче: "[0-9]". Запись двух символов, разделенных знаком минус, означает задание интервала в

лексикографической последовательности символов. Так, запись "[А-Я]" означает: "прописная русская буква", а запись: "[a-z] [a-z0-9]*" означает последовательность латинских букв и цифр, начинающуюся с буквы.

Указание в начале класса символа "^" означает "ни один из следующих символов". Например:

	^[0-9]

обозначает "любой символ, за исключением цифры".

Примеры.

	1, $s/^[0-9]*//

удаление всех цифр в начале каждой строки;

	/^[^(пробел)(табуляция)]/

поиск первой строки, не начинающейся символом пробела или табуляции.

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

	/[.[]/

Внутри "[...]" символ "[" не является специальным. Чтобы включить символ "]" в класс символов, нужно указать его первым.

6.16.7. Метасимвол & (амперсенд)

Символ "&" используется в первую очередь для сокращения вводимого текста.

Предположим, имеется строка:

	В ЭТО ВРЕМЯ 

и требуется преобразовать ее в строку:

	В ЭТО ВРЕМЯ СУТОК 

конечно, для этого можно воспользоваться командой:

	s/ВРЕМЯ/ВРЕМЯ СУТОК/

однако требование повторно указывать слово "ВРЕМЯ" кажется неразумным. Для того, чтобы избежать этого повторения, используется символ "&". В правой части команды подстановки амперсенд означает "найденный текст", так что можно ввести команду:

	s/ВРЕМЯ/& СУТОК/

где "&" будет означать "ВРЕМЯ". Конечно, в данном примере экономия будет незначительной, однако если количество символов велико или представляет собой нечто вроде ".*", которому соответствует большой кусок текста, экономится много вводимых символов. Снижается также вероятность совершения ошибки при вводе заменяющего текста. Например, для того, чтобы заключить в скобки строку, независимо от ее длины, можно использовать команду:

	s/.*/(&)/

Амперсенд может встречаться в правой части команды несколько раз. Команда:

	s/ВРЕМЯ/& СУТОК И & ГОДА/

построит строку:

	ВРЕМЯ СУТОК И ВРЕМЯ ГОДА 

а команда:

	s/В ЭТО ВРЕМЯ/&? &!!!/

преобразует исходную строку в:

	В ЭТО ВРЕМЯ? В ЭТО ВРЕМЯ!!!

Чтобы получить настоящий символ "&", используется обратная дробная черта для отмены его специального значения. Команда:

	s/амперсенд/\&/

заменит слово "амперсенд" на символ "&". Обратите внимание на то, что символ "&" является специальным только в правой части команды, в левой части он не имеет специального значения.

6.17. Дополнительные возможности

6.17.1. Временный выход из редактора

Иногда бывает удобно на некоторое время выйти из редактора, для выполнения какой-либо другой команды, не покидая редактор. Это можно сделать с помощью команды временного выхода "!".

Если ввести:

	!команда_системы 

процесс редактирования приостанавливается и выполняется указанная команда. Редактор сообщает о завершении этой команды, печатая еще один восклицательный знак "!", после этого можно снова возобновлять редактирование.

6.17.2. Восстановление после останова

Если произойдет неожиданный останов, система UNIX пытается сохранить содержимое буфера редактора в специальном файле ed.hup. Позднее вы можете попытаться восстановить текст из этого файла одним из двух способов. Первый: вы можете воспользоваться командой shell, чтобы переписать файл ed.hup в файл с другим именем. Второй: вы можете войти в редактор ed и воспользоваться командой f для переименования в буфере:

        ed ed.hup<CR>
        928
        f myfile<CR>
        myfile 

6.17.3. Командные файлы редактора

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

Предположим, например, что нужно заменить каждое слово "версия1" на "версия2" и каждое слово "1985" на "1986" в большом количестве файлов. Поместим в файл "list" следующий строки:

        g/версия1/s//версия2/g
        g/1985/s//1986/g
        w
        q 

после этого можно воспользоваться командами:

        ed file1 < list
        ed file2 < list
        ...

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

С помощью интерпретатора команд системы можно более или менее легко просмотреть набор файлов циклически.

6.17.4. Режим шифрования

При обработке зашифрованных файлов, редактор вызывается с параметром "-x":

	ed -x имя_файла<CR>

В этом случае перед началом копирования файла запрашивается ключ, по которому производится шифрование и расшифровка информации при всех обменах с файлом.

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

	x 

После чего будет выдана подсказка:

        Entering encrypting mode!
        Key:

и пользователь набирает ключ (при этом символы не отображаются на экране терминала). Признаком окончания ввода ключа является ввод <CR>. Ввод ключа нулевой длины отменят режим шифрования.

6.17.5. Программа grep

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

Программа grep языка управления заданиями предназначена для печати всех строк, соответствующих указанному образцу. Так, команда:

	grep "нечто" файл1 файл2 файл3 ...<CR>

находит "нечто" везде, где оно встречается в файлах. Команда "grep" указывает также файл, в котором была найдена каждая строка и (если задан параметр "-n") номер строки.

Образец, обозначенный "нечто", может быть любым образцом, который вы используете в редакторе, т.к. grep и ed используют один и тот же механизм поиска образцов. Если образец содержит какие-либо неалфавитные символы, его целесообразно всегда заключать в апострофы ('...'), поскольку многие такие символы имеют специальное значение для интерпретатора команд shell. Если не поместить их в апострофы, интерпретатор команд попытается обработать их перед тем, как они будут переданы команде grep.

Существует также возможность находить строки, которые не содержат указанного образца. Команда:

	grep -v "нечто" файл1 файл2 ...<CR>

находит все строки, которые не содержат "нечто". Ключ "-v" должен находиться в указанной позиции. С помощью команд "grep" и "grep -v" можно выбирать строки, содержащие некоторую комбинацию образцов. Например, для получения всех строк, содержащих "x", но не содержащих "y", можно использовать команду:

	grep x файл ... | grep -v y<CR>

(символ "|" означает, что результат работы первой команды используется в качестве входа второй команды).

6.17.6. Команды помощи

Обратите внимание, что когда вы редактируете файл, редактор ed иногда в ответ на введенную вами команду отвечает знаком "?". Знак "?" означает диагностическое сообщение при обнаружении ошибки. Команды помощи выдают вам короткое сообщение, объясняющее причину ошибки. Существуют две команды помощи:
h - отображает короткое сообщение об ошибке;
H - устанавливает в ed режим распечатки короткого сообщения об ошибке каждый раз, когда появляется "?". Для отмены этого режима вновь введите H.

Если попытаться завершить работу с ed, не записав измененный буфер в файл, то появится знак "?". Когда появится "?", введите "h":

        q<CR>
        ?
        h<CR>
        warning: expecting "w"

6.18. Сообщения редактора

Диагностические сообщения, выдаваемые редактором в процессе работы, крайне лаконичны, это:

WRITE ERROR -
ошибка записи, связанная либо с отсутствием места на устройстве, либо со сбоем аппаратуры;
Entering encrypting mode! -
свидетельствует о включении режима шифрования;
MEM? -
выдается в режиме дозаписи в буфер редактора при достижении предельного размера буфера;
?(file) -
при начале работы или после команд "e", "r", "f" означает, что указанный файл (file) отсутствует; после команды "w" - означает, что запись в файл запрещена.

Если при вводе команды зарегистрирована какая-либо другая ошибка, редактор сообщит об этом, выдав символ "?".

6.19. Краткий обзор команд

В общем случае команды редактора ed состоят из имени команды, которому могут предшествовать один или два номера строк, и после которого для команд "e", "r" и "w" может указываться имя файла. В строке может присутствовать только одна команда, однако команда "p" может следовать после любой другой команды, кроме "e", "r", "w" и "q".

a -
Дописать строки в буфер редактора после текущей строки, (если не задана другая строка). Дозапись продолжается до тех пор, пока не будет введена команда ".<CR>". Текущей становится последняя дописанная строка. В этой команде допускается адрес "0", при этом текст помещается в начало буфера.
c -
Заменить указанные строки новым текстом, следующим после команды "c". Ввод новых строк завершается ".<CR>". Если номера строк в команде не указаны, заменяется текущая строка. Текущей становится последняя замененная строка или (если строк замены не было) строка, предшествующая удаленным строкам.
d -
Удалить указанные строки. Если номера строк не заданы, удаляется текущая строка. Текущей становится первая неудаленная строка, кроме случая, когда удаляется последняя строка буфера. В этом случае текущей становится новая последняя строка буфера.
e -
Релактирование нового файла. Предшествующее содержимое буфера теряется, так что предварительно полезно ввести команду "w". Текущей становится последняя строка буфера.
E -
Команда выполняет те же действия, что и "e", за исключением того, что не выдается сообщение, если после последнего изменения буфера не была выдана команда записи "w".
f -
Выдать текущее имя файла. Если после команды "f" указывается имя файла, текущее имя файла будет заменено этим именем.
g -
Конструкция "g/re/команды" выполняет указанные "команды" над теми строками, которые соответствуют образцу "re".
i -
Вставить строки перед указанной строкой (или строкой, определяемой точкой). Вставка завершается командой ".<CR>". Текущей становится последняя вставленная строка.
j -
Объединить указанные строки в одну строку. Если строки не указаны, объединяются текущая и следующая за ней строки.
k -
Отметить строку (указанную или текущую) маркером, задаваемым псле "k". В качестве маркера используются строчные латинские буквы.
l -
Распечатать строки. Команда "l" эквивалентна команде "p", однако она распечатывает графически не отображаемые символы и "сворачивает длинные строки".
m -
Поместить указанные строки после строки, задаваемой после "m". Текущей становится последняя перемещенная строка.
p -
Выдать указанные строки. Если строки не указаны, распечатывается текущая строка. Отдельный номер строки эквивалентен команде "(номер_строки)p". Простое нажатие клавиши <CR> распечатывает следующую строку.
q -
Выход из редактора. Если при этой операции теряется информация (например, копия исходного файла изменялась, но не была выдана команда записи "w"), после первой команды "q" выдается подсказка "?" и никаких действий не производится. Выдача подряд двух команд "q" без предварительной команды "w" приводит к стиранию буфера и окончанию работы с редактором.
Q -
Работает также как команда "q" за исключением того, что выход производится немедленно (без какой-либо диагностики о возможной потере информации).
r -
Прочитать файл в буфер (в конец буфера, если не указано по-другому). Текущей становится последняя считанная строка.
s -
Команда s/xxx/yyy/ подставляет вместо символов "xxx" символы "yyy" в указанных строках. Если строки не указаны, подстановка выполняется в текущей строке. Текущей становится последняя строка, в которой произошла подстановка, это приводит к сохранению исходного положения, если не была выполнена ни одна подстановка. Команда "s" заменяет только первое вхождение "xxx" в строке. Для замены всех вхождений после завершающей дробной черты указывается символ "g".
t -
Скопировать указанные строки после строки, задаваемой после "t". Текущей становится последняя скопированная строка.
u -
Аннулировать изменение, выполненное предшествующей командой.
v -
Конструкция "v/re/команды" выполняет указанные "команды" над теми строками, которые не соответствуют образцу "re".
w -
Записать буфер в файл. Значение указателя текущей строки не изменяется.
W -
Аналогична команде "w", за исключением того, что указанные строки дописываются к файлу.
x -
Работа в режиме шифрации. Запрашивается ключ, используя который последующие команды "r", "е" и "w" будут зашифровывать и расшифровывать текст. Пустой ключ отменяет режим шифрации.
.= -
Выдать текущий номер строки (один символ "=" печатает номер последней строки).
! -
Конструкция "!командная_строка" вызывает выполнение "командной_строки" интерпретатором команд.
/re/ -
Контекстный поиск. Поиск следующей строки, которая содержит данную последовательность символов, и ее выдача. Текущей становится строка, соответствующая заданному образцу "re". Поиск начинается со строки ".+1" до "$", после последней строки переходит к строке 1 и, при необходимости, продолжается до текущей строки.
?re? -
Контекстный поиск в обратном направлении. Поиск начинается со строки 1 и продолжается до последней строки.
. (точка) -
Обозначение текущей строки.
$ -
Обозначение последней строки.
'x -
Обозначение строки, ранее отмеченной маркером "x".

7. Экранный редактор vi

7.1. Введение

Этот раздел посвящен экранному редактору vi. Редактор vi является мощным средством для создания и редактирования файлов. Он предназначен для работы на видеотерминале и использует окна, посредством которых вы можете просматривать текст файла. Несколько простых команд позволяют вам сделать изменения в тексте, которые очень быстро отображаются на экране. Редактор может отобразить одну или несколько строк текста. Он позволяет вам передвигать курсор в любую точку на экране или в файле, создавать, изменять или удалять текст. Вы можете также использовать некоторые команды построчного редактора, такие как глобальные команды, которые позволяют вам изменять множество появлений некоторой строки символов, используя одну команду. Чтобы двигаться по файлу, вы можете прокручивать текст вперед или назад.

Примечание. Не все терминалы обладают способностью прокрутки текста и поэтому средство прокрутки текста редактором vi зависит от типа используемого терминала.

Редактор vi имеет более 100 команд. В этом разделе описаны основные команды, которые позволят вам использовать vi просто, но эффективно. Особое внимание будет уделено выполнению следующих задач, позволяющих:

  • изменить окружение shell, чтобы установить конфигурацию вашего терминала;
  • сделать доступным автоматический возврат каретки;
  • начать работу с редактором vi, создать текст, исправить ошибки, записать текст в файл и завершить работу;
  • переместить текст внутри файла;
  • разбить и слить текст;
  • использовать специальные команды и сокращения;
  • использовать команды построчного редактора, доступные внутри vi;
  • временно вернуться в shell, чтобы выполнить команды shell;
  • восстановить файл, потерянный из-за прерывания сессии редактирования;
  • редактировать несколько файлов в одной сессии.

7.2. Начальные установки

В этом подразделе описано, как делать установку конфигурации терминала, чтобы правильно работал редактор vi.

7.2.1. Установка конфирурации терминала

Прежде чем начать работать с редактором vi, необходимо сообщить системе UNIX, какой тип терминала вы используете. Это связано с тем, что программное обеспечение vi по разному исполнимо на разных терминалах.

Каждому типу терминала соответствует кодовое имя, которое распознается системой UNIX.

Чтобы установить конфигурацию вашего терминала, введите:

        TERM= terminal_name<CR>
        export TERM<CR>
        tput init<CR>

В первой строке переменной TERM присваивается конкретное значение (тип терминала). Вторая строка экспортирует это значение; она передает это значение всем программам системы UNIX, выполнение которых зависит от типа используемого терминала.

Команда tput в третьей строке производит установку программного обеспечения для вашего терминала, чтобы он правильно функционировал с системой UNIX.

7.2.2. Изменение конфигурации

Если вы часто будете использовать редактор vi, то необходимо сделать соответствующие изменения по установке конфигурации терминала в файле .profile. Этот файл должен находиться в вашем собственном справочнике. За более подробной информацией обратетесь к разд. 9, где описывается shell.

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

hlv 2 Установка автоматического возврата каретки

Если вы хотите, чтобы клавиша RETURN отрабатывала автоматически во время вашей работы с редактором vi, создайте файл с именем .exrc в вашем собственном справочнике. В файле .exrc будут содержаться опции, которые управляют средой редактора vi.

Чтобы создать файл .exrc, введите при вызове редактора имя этого файла. Затем в первой строке текста введите спецификацию циклического режима (автоматический возврат каретки). Формат этой опции:

	: set wm=n<CR>

где n - число символов на строке экрана, после которого должен автоматически появляться возврат каретки. Он может стоять только между словами, но не между слогами слова.

Например, если вы хотите, чтобы возврат каретки проставлялся за 20-м символом с правой стороны экрана, введите:

	: set wm=20<CR>

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

Чтобы проверить установки и циклический режим для вашего терминала в редакторе vi, введите команду:

	: set<CR>

Команду set также можете использовать и для создания или изменения опции циклического режима.

7.3. Создание файла

Чтобы создать файл, введите:

	vi filename<CR>

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

7.4. Режимы редактора

Редактор vi функционирует в двух режимах: режим ввода и командный режим. В режиме ввода вы можете добавлять и модифицировать текст; в командном режиме вы можете:

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

7.4.1. Создание текста в режиме Append

Если вы успешно вошли в редактор vi, то сразу же попадаете в командный режим и vi ожидает ввода ваших команд. Чтобы создать текст необходимо:

  • введите a, чтобы перейти к режиму ввода (не нажимая клавишу RETURN). Теперь вы можете добавить текст к файлу (файл не печатается на экране);
  • введите нужный текст;
  • перейдите на новую строку и нажмите клавишу RETURN.

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

7.4.2. Выход из режима Append

После того как вы закончили создавать текст, нажмите клавишу ESCAPE, чтобы из режима ввода перейти к командному режиму. Теперь вы можете редактировать текст, который вы создали или записали

        <a>
        Create some text<CR>
        in the screen editor<CR>
        and return to<CR>
        command mode.<ESC>

Если вы нажмете клавишу ESCAPE и услышите звуковой сигнал, то это значит, что вы уже перешли в командный режим. Нажатие клавиши ESCAPE в то время, когда вы находитесь в командном режиме, никак не влияет на текст в файле, даже если вы нажмете ее несколько раз.

7.5. Редактирование текста в командном режиме

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

7.5.1. Перемещение курсора

Клавиши перемещения курсора позволяют вам перемещать курсор по файлу. Курсор можно переместить с помощью следующих клавиш:
h - перемещает курсор на один символ влево;
j - перемещает курсор вниз на одну строку;
k - перемещает курсор вверх на одну строку;
l - перемещает курсор на один символ вправо;

Команды j и k сохраняют позицию курсора на строке. Например, если курсор находился на 17-м символе слева, то когда вы введете команду j или k, то он переместится на новую строку, но будет находиться на 17-м символе. Если символов в новой строке меньше, то курсор переместитcя на последний символ строки.

Примечание. Некоторые терминалы имеют специальные символы управления курсором, помеченные стрелками. Эти стрелки можно использовать вместо клавиш h, j, k, l.

Если перед h, j, k, l поставить число, то курсор передвинется на количество строк/символов, равных числу. Например, если надо передвинуть курсор на 4 строки вверх, введите 4k. Если вы не можете продвинуться дальше в этом направлении, то vi подаст звуковой сигнал и курсор останется на прежнем месте.

Чтобы переместить курсор на 35 строк вниз, введите:

	35j 

Дополнительно к клавишам h и l можно использовать клавиши SPACEBAR и BACKSPACE для перемещения курсора вправо или влево.
<SPACEBAR> - переместить курсор на один символ вправо;
<nSPACEBAR> - переместить курсор на n символов вправо;
<BACKSPACE> - переместить курсор на один символ влево;
<nBACKSPACE> - переместить курсор на n символов влево;

7.5.2. Удаление текста

Если вы хотите удалить символ, переместите курсор к этому символу и нажмите x. Перед x может стоять число, которое говорит о том, сколько символов подряд нужно удалить. Редактор vi так корректирует строку, что на месте удаленного символа не остается пустого промежутка или на месте удаленной строки - пустой строки.

7.5.3. Добавление текста

В редакторе vi существует две команды для добавления текста: insert(i) и append(a). Чтобы добавить текст с помощью команды i, переместите курсор в нужное место с помощью клавишей h, j, k, l. Затем нажмите i и введите текст. Введенный вами текст появится на экране слева от символа, на который указывает курсор. Этот символ и все остальные справа от курсора будут передвинуты вправо, чтобы освободить место для вашего нового текста. Редактор vi будет хранить символы, вводимые вами, до тех пор, пока вы не нажмете клавишу ESCAPE. Если необходимо, передвинутые символы будут перенесены на следующую строку.

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

7.6. Завершение работы c vi

Когда вы закончите работу с текстом, необходимо записать содержимое буфера в файл и возвратить управление shell. Для этого нажмите клавишу SHIFT и дважды нажмите Z(ZZ). Редактор сохранил имя того файла, который вы указали в начале сеанса редактирования, и в этот файл перепишет текст из буфера. Обратите внимание, что внизу экрана дается имя файла и количество строк и символов в файле. Затем shell выдает вам подсказку.

Пример.

        <a>
        This is a text file.<CR>
        I am adding text to<CR>
        a temporary buffer and<CR>
        now it is perfect.<CR>
        I want to write this file,<CR>
        and return to the shell.<ESC><ZZ>
        -
        -
        -
        -
        "stuff" [New file] 6 lines, 135 characters
        $

Вы также можете использовать команды :w и :q редактора vi для записи файла и окончания работы с редактором. Команды редактора начинаются с двоеточия (:) и появляются в последней строке экрана. Команда :w записывает буфер в файл. Команда :q завершает работу редактора и возвращает управление shell. Вы можете ввести эти команды раздельно, или в одной команде :wq

В табл. 8 приведены основные команды, которые вам необходимы для вызова и использования редактора vi.

Таблица 8
Основные команды vi

Команды Выполняемые функции
TERM=terminal_name
export TERM
Установка конфигурации терминала
tput init Инициализировать терминал как terminal_name
vi filename Вызов редактора vi для редактирования файла filename
a Добавить текст после курсора
h Перемещает курсор на один символ влево
j Перемещает курсор вниз на одну строку
k Перемещает курсор вверх на одну строку
l Перемещает курсор на один символ вправо
x Удалить символ
<CR> Возврат каретки
<ESC> Перейти из режима ввода в командный режим
:w Записать в файл
:q Завершить работу с редактором
:wq Записать буфер в файл и завершить работу с редактором vi
ZZ Записать изменения в файл и завершить работу с vi

7.7. Перемещение курсора по экрану

Ранее вы познакомились с тем, как перемещать курсор с помощью клавишей h, j, k, l, BACKSPACE и SPACEBAR. В этом подразделе приводятся еще несколько команд, которые помогут вам быстро перемещать курсор по экрану. Эти команды выполняются в командном режиме.

7.7.1. Позиционирование курсора на символ

Для позиционирования курсора на символ в строке существуют три способа:

  • переместить курсор вправо или влево до нужного символа;
  • переместить курсор в начало или конец строки;
  • поиск символа на строке.

7.7.1.1. Переместить курсор в начало или конец строки

Переместить курсор на первый или последний символ в строке можно следующим образом:
$ - переместить курсор на последний символ в строке;
0(ноль) - переместить курсор на первый символ в строке;
^ - переместить курсор на первый ненулевой символ в строке.

7.7.1.2. Поиск символа в строке

Третий способ позиционирования курсора в строке - это поиск указанного символа на текущей строке. Если символ не найден на текущей строке, то появляется звуковой сигнал и курсор остается на прежнем месте. Существуют команды, которые проводят поиск по шаблону. Они будут описаны далее. Здесь приведем 6 команд для поиска внутри строки: f, F, t, T, ;(двоеточие) и ,(запятая). После f, F, t и T вы можете указать символ:

fx -
осуществляет поиск указанного символа x справа от текущей позиции курсора;
Fx -
осуществляет поиск указанного символа x слева от текущей позиции курсора;
tx -
осуществляет перемещение курсора вправо на символ до указанного символа x;
Tx -
осуществляет перемещение курсора влево на символ до указанного символа x;
; -
повторяет предыдущий поиск символа. Команда ; запоминает символ и ищет следующее появление символа в текущей строке;
, -
повторяет предыдущий поиск символа, но в обратном направлении. Команда ; запоминает символ и ищет следующее появление символа в текущей строке;

7.7.1.3. Команда перемещения: - (знак минус)

Команда - (минус) перемещает курсор на одну строку вверх, позиционируя его на первом ненулевом символе. Чтобы переместить курсор более чем на один символ, укажите пред знаком минус количество строк. Например, чтобы переместить курсор вверх на 13 строк, введите:

	13-

Если эти строки находятся выше отраженного экрана, то окно переместится так, чтобы открыть их. Этот способ помогает быстро перемещаться по файлу. Если выше окажется меньше 13-ти строк, то звуковой сигнал подскажет вам, что вы сделали ошибку и курсор останется в своем прежнем положении.

7.7.1.4. Команда перемещения + (знак плюс)

Команда + (плюс) или <CR> перемещает курсор вниз на одну строку и позиционирует на первый непустой символ. Перед командой + можно указать количество строк, на которое вы хотите переместить курсор. Например, чтобы переместить курсор на 9 строк вниз, введите:

	9+

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

7.7.2. Позиционирование слов

Редактор vi предполагает, что слово - это строка символов, которая может включать в себя буквы, цифры и символы подчеркивания. В редакторе vi существует 6 команд позиционирования: w, b, e, W, B и E. Команды w, b, e рассматривают любой символ, отличный от буквы, цифры или подчеркивания, как разделитель, означающий начало или конец слова. Пунктуация до или после пустого пространства является разделителем слов. Символ начала или конца строки также является разделителем.

Команды W, B, E рассматривают пунктуатию как часть слова. Слова разделяются пустым пространством, которое состоит из символов пробел, табуляция и новая строка.

Команды позиционирования:

w -
перемещает курсор к началу следующего слова;
nw -
перемещает курсор к началу n-го слова; конец строки не останавливает движение курсора. Он продолжает подсчет слов с начала следующей строки;
W -
игнорирует все знаки пунктуации и перемещает курсор на следующее после пробела слово;
e -
перемещает курсор на последний символ в следующем слове;
E -
перемещает курсор на последний символ в слове. Игнорирует все символы пунктуации за исключением пробела. Слова разделяются пробелами;
b -
перемещает курсор к первому символу предыдущего слова;
nb -
перемещает курсор к первому символу n-го предыдущего слова. Команда b не останавливается в начале строки и продолжает движение к началу строки;
B -
используется подобно команде b, за исключением того, что слова разделяются только символами пробел и новая строка. Она рассматривает все другие символы пунктуации как буквы.

7.7.3. Позиционирование курсора на предложение

Редактор vi также распознает предложения. В редакторе vi предложение заканчивается знаками !, . или ?. Если эти разделители появляются в середине строки, то за ними должны стоять два пробела, чтобы vi их мог распознать.

Вы можете перемещать курсор от предложения к предложению в файле с помощью команд ( - открывающая скобка и ) - закрывающая скобка.

( -
перемещает курсор в начало текущего предложения;
n( -
перемещает курсор в начало n-го предложения выше текущего предложения;
) -
перемещает курсор в начало следующего предложения;
n) -
перемещает курсор в начало n-го предложения, следующего за текущим предложением.

7.7.4. Позиционирование курсора по параграфам

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

{ -
переместить курсор в начало текущего параграфа, который ограничивается пустой строкой;
n{ -
переместить курсор в начало n-го параграфа, следующего за текущим параграфом;
} -
переместить курсор в начало следующего параграфа;
n} -
переместить курсор в начало n-го параграфа ниже текущей строки.

7.7.5. Позиционирование в окне

Редактор vi предоставляет вам 3 команды, которые позволяют вам позиционировать курсор в окне. Эти команды должны быть введены на верхнем регистре:
H - переместить курсор к первой строке экрана;
M - переместить курсор к средней строке экрана;
L - переместить курсор к последней строке экрана.

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

Таблица 9
Команды позиционирования курсора

Команда Действие команды
Позиционирование на символ
h Перемещает курсор на один символ влево
l Перемещает курсор на один символ вправо
BACKSPACE Перемещает курсор на один символ влево
SPACEBAR Перемещает курсор на один символ вправо
fx Осуществляет поиск указанного символа x справа от текущей позиции курсора
Fx Осуществляет поиск указанного символа x слева от текущей позиции курсора
tx Осуществляет перемещение курсора вправо на символ до указанного символа x
Tx Осуществляет перемещение курсора влево на символ до указанного символа x
; Повторяет предыдущий поиск символа. Команда ; запоминает символ и ищет следующее появление символа в текущей строке
, Повторяет предыдущий поиск символа, но в обратном направлении
j Перемещает курсор вниз на одну строку
k Перемещает курсор вверх на одну строку
- Перемещает курсор на одну строку вверх, позиционируя его на первом ненулевом символе
+ Перемещает курсор вниз на одну строку и позиционирует на первый непустой символ
<CR> Перемещает курсор вниз на одну строку и позиционирует на первый непустой символ
Позиционирование на строку
$ Переместить курсор на последний символ в строке
0(ноль) Переместить курсор на первый символ в строке
^ Переместить курсор на первый ненулевой символ в строке
Позиционирование на слово
w Перемещает курсор к началу следующего слова
W Игнорирует все знаки пунктуации и перемещает курсор на следующее после пробела слово
e Перемещает курсор на последний символ в следующем слове
E Перемещает курсор на последний символ в слове. Игнорирует все символы пунктуации за исключением пробела
b Перемещает курсор к первому символу предыдущего слова
B Используется подобно команде b, за исключением того, что слова разделяются только символами пробел и новая строка
Позиционирование на предложение
( Перемещает курсор в начало текущего предложения
) Перемещает курсор в начало следующего предложения
Позиционирование на параграф
{ Переместить курсор в начало текущего параграфа, который ограничивается пустой строкой
} Переместить курсор в начало следующего параграфа
Позиционирование в окне
H Переместить курсор к первой строке экрана
M Переместить курсор к средней строке экрана
L Переместить курсор к последней строке экрана

7.8. Позиционирование курсора на неотображаемом тексте

В этом подразделе описывается, как переместить курсор на текст, который не отображен на текущем экране. Вы можете сделать это следующим образом:
  • прокрутка вперед и назад файла;
  • перейти к указанной строке в файле;
  • поиск по шаблону в файле.

7.8.1. Прокрутка текста

Четыре команды редактора vi позволяют вам осуществлять прокрутку текста файла. Команды ^f (<CTRL>f) и ^d (<CTRL>d) проводят прокрутку экрана вперед, а команды ^b (<CTRL>b) и ^u (<CTRL>u) - прокрутку экрана назад.

7.8.1.1. Команда ^f

Команда ^f осуществляет прокрутку вперед на одно окно текста, расположенного ниже текущего окна. Редактор vi очищает экран и выводит новое окно. Две последние строки текущего окна отображаются в верхней части нового окна. Если окно дополнено пустыми строками, то они помечаются знаком ~ (тильда)

7.8.1.2. Команда ^d

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

7.8.1.3. Команда ^b

Команда ^b осуществляет прокрутку экрана назад на полное окно, чтобы отобразить текст, который находится выше текущего экрана. Редактор vi очищает экран и отображает новое окно. В отличие от команды ^f, команда ^b не оставляет в новом окне строки из текущего окна.

7.8.1.4. Команда ^u

Команда ^u осуществляет прокрутку половины экрана, чтобы отобразить текст, расположенный выше окна. Если курсор достигнет начала файла, то vi подаст звуковой сигнал.

7.9. Переход на указанную строку

Команда G позиционирует курсор на указанную строку в окне. Если эта строка не находится в текущем экране, то G очищает экран и отображает окно, содержащее эту строку. Если не указана строка, то команда G перемещает курсор на последнюю строку файла:
G - переместить курсор на последнюю строку в файле;
nG - переместить курсор на строку n.

7.10. Номера строк

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

	^g 

В нижней части экрана команда ^g поместит информацию:

  • имя файла;
  • был ли буфер модифицирован после поледней записи его в файл;
  • номер строки, на которой находится курсор;
  • общее количество строк в буфере.

7.11. Поиск символов по шаблону: команды / и ?

Для поиска символов по шаблону вы можете использовать команды /, ?, n и N. Эти команды позволяют осуществлять поиск вперед и назад в буфере следующего появления указанного шаблона символов. Команды n и N позволяют вам повторить последний поиск.

Команда / и следующий за ней шаблон (/pattern) ведет поиск вперед по буферу следующего появления символов, указанных в шаблоне и помещает курсор на первый символ из шаблона. Например, командная строка:

	/Hello world<CR>

находит первое появление в буфере слов Hello world и помещает курсор под буквой H.

Команда ? и следующий за ней шаблон (?pattern) ведет поиск в обратном направлении в буфере первого появления символов, указанных в шаблоне и помещает курсор на первый из этих символов. Например, командная строка:

	?data set design<CR>

находит предыдущее появление в буфере слов data set design и помещает курсор под буквой d в слове data.

Эти команды поиска не выполняют циклически возврат в случае окончания строки во время поиска двух или более слов. Например, если вам надо найти появление Hello world и окажется, что слово Hello находится в конце одной строки, а слово world - первое слово последующей строки, то эти команды не найдут Hello world.

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

Команды n и N позволяют повторить предыдущий запрос поиска /pattern или ?pattern:
n - повторить последнюю команду поиска;
N - повторить последнюю команду поиска в обратном направлении.

Команды / и ? не дают вам возможности указать конкретное появление шаблона с помощью числа. То есть, вы не можете, например, запросить поиск 3-го появления шаблона, начиная с текущей позиции.

В табл. 10 приведены команды vi для перемещения курсора с помощью прокрутки текста, указания номера строки и поиска по шаблону.

Таблица 10
Дополнительные команды перемещения курсора в редакторе vi

Команда Действие
Прокрутка
^f Прокрутка экрана вперед на полное окно. Откры- вается новое окно с текстом, расположенным ниже текущего окна
^d Прокрутка текста вниз на пол-окна. Открываются строки, расположенные ниже текущего окна
^b Прокрутка экрана назад на полное окно. Откры- вается новое окно с текстом, расположенным выше текущего окна
^d Прокрутка текста вверх на пол-окна. Открываются строки, расположенные выше текущего окна
Позиционирование с помощью номера строки
1G Перейти к первой строке в файле
G Перейти к последней строке в файле
^g Выдать номер строки и состояние файла
Поиск по шаблону
/pattern Поиск вперед в буфере до первого появления шаблона. Курсор помещается на первом символе шаблона
?pattern Поиск назад в буфере до первого появления шаблона. Курсор помещается на первом символе шаблона
n Повторить последнюю команду поиска
N Повторить последнюю команду поиска в обратном направлении

7.12. Создание текста

Три основные команды позволяют в редакторе vi создавать текст:
a - добавить текст;
i - вставить текст;
o - открыть новую строку, на которой может быть введен текст.

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

7.12.1. Добавить текст

Чтобы в файл добавить текст, воспользуйтесь следующими командами:
a - добавить текст после курсора;
A - добавить текст в конце текущей строки.

7.12.2. Вставить текст

Чтобы в файл вставить текст, воспользуйтесь следующими командами:
i - вставить текст до курсора;
I - вставить текст в начале текущей строки до первого ненулевого символа.

Для возврата в командный режим, нажмите клавишу ESCAPE.

7.12.3. Открыть строку для текста

Для открытия строки для текста воспользуйтесь следующими командами:
o - создать текст с начала новой строки, расположенной ниже текущей строки. Вы можете ввести эту команду в любом месте текущей строки;
O - создать текст с начала новой строки, расположенной выше текущей строки. Вы можете ввести эту команду в любом месте текущей строки.

Команды открытия создают строку непосредственно выше или ниже текущей строки и переводят вас в режим ввода текста. Курсор располагается в начале новой строки и ожидает от вас ввода текста.

В табл. 11 приведены команды создания и добавления текста с помощью редактора vi.

Таблица 11
Команды создания текста

Команда Функция
a Создать текст после курсора
A Создать текст в конце текущей строки
i Создать текст перед курсором
I Создать текст перед первым ненулевым символом в текущей строке
o Создать текст с начала новой строки, расположенной под текущей строкой
O Создать текст с начала новой строки, расположенной над текущей строкой
<ESC> Возвратить vi в командный режим из режима ввода текста

7.13. Удаление текста

Вы можете удалить текст с помощью нескольких команд в командном режиме и небольшой объем в режиме ввода.

7.13.1. Удаление текста в режиме ввода текста

Если вы находитесь в режиме ввода текста редактора vi и хотите удалить символ, воспользуйтесь клавишей BACKSPACE: BACKSPACE - удалить текущий символ (слева от курсора).

Клавиша BACKSPACE перемещает курсор назад в режиме ввода текста и удаляет каждый символ, который курсор переходит. Однако удаленный символ не стирается с экрана пока вы не нажмете клавишу ESCAPE для возврата в командный режим.

Удалить текст вы можете и с помощью следующих ключей:
^w - отменить ввод текущего слова;
@ - удалить на текущей строке весь введенный во время данного режима ввода текст;
^v - удалить специальное значение, если есть, следующих вводимых символов.

Когда вы вводите ^w, курсор возвращается на последнее введенное слово и ожидает на первом символе этого слова. Он не стирает слово с экрана до тех пор, пока вы не нажмете клавишу ESCAPE или не введете новые символы на месте этого слова.

7.13.2. Отменить последнюю команду

Отменить последнюю введенную команду можно с помощью следующих команд:
u - отменить последнюю команду;
U - восстановить текущую строку в состояние до произведенных изменений.

Если вы случайно удалили строки, то для отмены команды удаления введите команду u. Удаленные строки вновь появятся на экране. Если вы ввели неправильно команду, то введите команду u и неверная команда будет отменена. Команда U будет аннулировать все изменения в текущей строке до тех пор, пока курсор будет находиться на этой строке.

Если вы введете команду u дважды, то вторая команда отменит первую. Например, если вы удалили по ошибке строку и восстановили ее с помощью команды u, то нажав второй раз u, вы вновь удалите строку. Знание этих команд может спасти вас от многих неприятностей.

7.14. Команды удаления в командном режиме

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

	[number][command]text_object 

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

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

Команда удаления имеет следующий формат:

	[number]dtext_object 

где d - команда удаления;
text_object - объект удаления.

7.14.1. Удаление слов

Вы можете удалить слово или часть слова с помощью команды d. Переместите курсор к первому удаляемому символу и введите команду dw. Символ, расположенный над курсором и последующие за нми будут стерты. Команда dw удаляет одно слово или знак пунктуации и пробелы, которые следуют за ним. Вы можете удалить несколько слов или знаков пунктуации за один раз, если укажете перед командой соответствующее число. Например, чтобы удалить 3 слова и две запятые, введите команду 5dw.

7.14.2. Удаление параграфов

Чтобы удалить параграф, воспользуйтесь командой:

	d{ или d}

Помните, что вы можете восстановить удаленный текст с помощью команды u.

7.14.3. Удаление строк

Чтобы удалить строку, введите:

	dd 

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

	10dd 

сотрет 10 строк.

Если вы удаляете несколько строк, то vi отображает в нижней части экрана сообщение типа:

	10 lines deleted 

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

7.14.4. Удаление текста после курсора

Для удаления всего текста на строке, расположенного после курсора, поместите курсор на первый удаляемый символ и введите:

	D или d$

Эта команда удаляет текст только на текущей строке.

В табл. 12 приведен список команд для удаления текста.

Таблица 12
Команды удаления текста

Команда Функция
Режим ввода
BACKSPACE Удалить текущий символ
1w Удалить текущее слово
@ Удалить текущую строку нового текста или удалить весь новый текст в текущей строке Командный режим
u Отменить последнюю команду
U Восстановить текущую строку в прежнем состоянии
x Удалить текущий символ
ndx Удалить n-ый объект текста x
dw Удалить слово над курсором и следующий за ним пробел, или знак пунктуации
dW Удалить слово и пунктуацию над курсором с последующим за ним пробелом
dd Удалить текущую строку
D Удалить часть строки справа от курсора
d) Удалить текущее предложение от текущей позиции курсора до конца
d} Удалить текущий параграф от текущей позиции до конца

7.15. Модификация текста

Один из способов модификации текста представляют команды удаления и команды ввода текста. Другой способ, с помощью которого вы можете изменить текст, это задать команду, позволяющую одновременно удалять и создавать текст. В редакторе vi существуют 3 основные команды изменения текста: r, s и c.

7.15.1. Замена текста

rx -
Заменить текущий символ (символ, на который показывает курсор) на x. Эта команда не устанавливает режим ввода текста и, следовательно, нет необходимости нажимать после нее клавишу ESCAPE.
nrx -
Заменить n символов на x. После этой команды также не надо нажимать клавишу ESCAPE.
R -
Заменяет только те символы, которые введены в режиме ESCAPE. Если будет достигнут конец строки, то эта команда добавит ввод как новый текст.

Например, вы хотите заменить слово acts на ants в следующем предложении:

	The circus has many acts.

Поместите курсор под буквой c в слове acts и введите команду:

	rn 

Предложение будет иметь вид:

	The circus has many ants.

Чтобы заменить слово many на 7777, поместите курсор под буквой m в слове many и введите команду:

	4r7

Команда r заменит слово many на четыре цифры 7:

	The circus has 7777 ants.

7.15.2. Подстановка текста

Команда подстановки текста заменяет символы, но затем позволяет вам продолжать ввод текста с того места, где вы нажали клавишу ESCAPE.

s -
удалить символ, на который указывает курсор и добавить текст. После окончания ввода текста нажмите клавишу ESCAPE;
ns -
удалить n символов и добавить текст. После окончания ввода текста нажмите клавишу ESCAPE;
S -
заменить все символы в строке.

Когда вы вводите команду s, последний символ в строке символов, который будет заменен, переписывается со знаком $. Символ не стирается с экрана, пока вы не введете на его место новый символ, или не нажмете клавишу ESCAPE.

7.15.3. Изменение текста

Команда подстановки заменяет символы. Команда изменения заменяет объект текста и затем продолжает добавлять текст с этого места до тех пор, пока вы не нажмете клавишу ESCAPE.

Команда изменения может содержать аргумент text_object. Вы можете заменить символ, слово и так далее на новый текст:

ncx -
заменить n-ый объект текста типа x (предложение, параграф);
cw -
заменить слово или оставшиеся символы в слове на новый текст. Редактор vi печатает знак $, чтобы показать последний символ, который будет заменен;
ncw -
заменить n слов;
cc -
заменить все символы в строке;
ncc -
заменить все символы в текущей строке и n верхних строк;
C -
заменить оставшиеся символы в строке от курсора до конца строки; dfn nC заменить оставшиеся символы, начиная от курсора в текущей строке и во всех n верхних строках.

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

В табл. 13 приведены команды изменения текста.

Таблица 13
Команды изменения текста

Команда Функция
r Заменить текущий символ
R Заменить те символы, которые введены в режиме ESCAPE
s Удалить символ, под которым расположен курсор и добавить текст. Для окончания режима ввода нажмите клавишу ESCAPE
S Заменить все символы в строке
cc Заменить все символы в строке
ncx Заменить n объектов текста типа x (предложение, параграф)
cw Заменить слово или оставшиеся символы в слове на новый текст
C Заменить оставшиеся символы в строке от курсора до конца строки

7.16. Извлечение и присоединение текста

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

7.16.1. Перемещение текста

Вы можете переместить текст из одного места в буфере редактора vi в другое, удалив строки, а затем поместив их в требуемое место. Удаленный текст сохраняется во временном буфере. Переместите курсор на то место, куда вы хотите поместить текст и нажмите клавишу "p". Удаленные строки будут добавлены ниже текущей строки.

p - поместить содержимое временного буфера после курсора или ниже текущей строки.

Удаленная с помощью команды удаления строка может быть помещена в середине другой строки. Позиционируйте курсор между двумя словами, затем нажмите клавишу "p". Удаленная строка будет помещена после курсора.

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

7.16.2. Перемещение букв

Быстрым способом перемещения букв является комбинация команд "x" и "p" (xp). Команда "x" удаляет букву, "p" - помещает ее после следующего символа. Например, в следующем предложении есть ошибка:

	A line of tetx 

Поместите курсор под буквой "t" в комбинации "tx" и затем нажмите клавиши "x" и "p". В результате получим:

	A line of text 

7.16.3. Копирование текста

Вы можете копировать одну или несколько строк текста во временный буфер и затем поместить копию этого текста в определенное место в файле. Чтобы поместить текст на новое место, введите команду "y". Команда "y" имеет следующий общий формат:

	[number]y[text_object]

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

В табл. 14 приведены способы использования команды "y".

Таблица 14
Команда y

Команда Функция
nyx Копирование n-го объекта текста типа x (предложение или параграф)
yw Создание копии слова
yy Создание копии текущей строки
nyy Копирование n строк
y) Создание копии всего текста до конца предложения
y} Создание копии всего текста до конца параграфа

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

7.17. Копирование и перемещение текста с использованием регистров

Перемещение и копирование нескольких разделов текста в различные части файла является утомительной работой. Редактор vi предлагает вам использовать так называемые регистры, в которых вы можете хранить текст до тех пор, пока он вам не понадобится. Сохранить текст вы можете либо с помощью команды "y", либо с помощью команды удаления. Использование регистров особенно полезно, если часть текста должна появиться во многих местах в файле. Извлекаемый текст остается в указанном регистре пока вы не завершите работу с ним, либо закончите работу с редактором, либо поместите в этот регистр другой текст.

Общий формат команды:

	[number]["X]command[text_object]

где X - имя регистра, состоящее из одной буквы верхнего регистра. Имени регистра должны предшествовать двойные кавычки.

В табл. 15 приведены команды извлечения и присоединения текста.

Таблица 15
Команды извлечения и присоединения текста

Команда Функция
p Помещает содержимое временного буфера, полученное с помощью команды y и команд удаления, в текст после курсора
yy Создает копию строки текста и помещает во временный буфер
nyx Создает копию n-го объекта текста типа x и помещает ее во временный буфер
"xyn Помещает копию объекта текста типа n в в регистр с именем x
"xp Помещает содержимое регистра x после курсора

7.18. Специальные команды

В этом подразделе приведены специальные команды, которые будут вам весьма полезны:
. - повторить последнюю команду;
j - объединить две строки;
^l - очистить экран и вновь отобразить его;
~ - заменить нижний регистр на верхний и vice versa (?).

7.18.1. Повторить последнюю команду

Команда "." (точка) повторяет последнюю введенную команду. Очень часто она используется с командой поиска.

7.18.2. Объединение строк

Команда "j" объединяет строки. Чтобы ввести эту команду, поместите курсор на текущей строке и нажмите клавиши SHIFT и j одновременно. Текущая строка объединяется со следующей строкой.

Например, вы имеете две строки текста:

        Dear Mr.
        Smith:

Объединим эти две строки в одну. Поместите курсор под любым символом в первой строке и введите команду "j". На экране появится строка:

        Dear Mr. Smith:

Обратите внимание, что редактор vi автоматически ставит пробел между последним словом в первой строке и первым словом второй строки.

7.18.3. Очистить окно и восстановить текст

Если другой пользователь системы UNIX посылает вам собщение с использованием команды write, а вы в это время редактируете с помощью vi, то посланное сообщение появится в вашем текущем окне поверх текста, который вы редактируете. Чтобы восстановить редактируемый текст после того, как вы прочтете посланное сообщение, нужно перейти в командный режим. Если вы находитесь в режиме ввода текста, то нажмите "^l". Редактор vi сотрет сообщение и восстановит окно в том виде, в котором оно было до прихода сообщения.

7.18.4. Заменить нижний регистр на верхний и vice versa

Чтобы быстро заменить букву нижнего регистра на букву верхнего регистра, надо поместить курсор под этой буквой и нажать клавишу "~" (тильда). Вы можете заменить несколько букв, нажав столько же раз клавишу "~", либо поставив перед тильдой число требуемых замен.

В табл. 16 приведены специальные команды.

Таблица 16
Специальные команды

Команда Функция
. Повторить последнюю команду
j Соединить текущую строку со строкой, расположенной ниже
^l Очистить и восстановить текущее окно
~ Заменить нижний регистр на верхний

7.19. Использование команд построчного редактора

Редактор vi имеет доступ ко многим командам построчного редактора ex. В этом подразделе обсуждаются некоторые наиболее часто используемые команды.

Команды редактора ex очень похожи на команды редактора ed.

Команды построчного редактора начинаются с символа ":" (двоеточие). После того, как вы введете двоеточие, курсор опускается в низ экрана и отображает двоеточие. Оставшаяся часть команды тоже появляется внизу экрана.

7.19.1. Временный возврат к shell

Когда вы входите в vi, то содержимое буфера заполняет ваш экран, делая невозможным выдачу команд для shell. Однако вам может это понадобиться. Например, вам необходимо будет получить информацию из другого файла для присоединения ее к текущему тексту. Вы можете получить эту информацию, запустив одну из команд shell, которая отображает текст файла на экране. Например, cat или pg. Однако процедура завершения работы с редактором и повторный вход в редактор потребуют времени и сил. Редактор vi предлагает вам два способа временного выхода из редактора для того, чтобы вы могли ввести команды shell (и даже редактировать другие файлы) не покидая сам редактор. Это команды :sh и :!.

Команда :! позволяет вам выйти из редактора и запустить команду shell одной командной строкой. Находясь в командном режиме редактора vi, введите :!. Эти символы будут напечатаны в низу экрана. Сразу же после символа ! введите команду shell. Shell запустит вашу команду, даст вам ответ и напечатает сообщение:

	Hit return to continue 

После того, как вы нажмете клавишу RETURN, vi обновит экран и курсор примет свое прежнее положение.

Команда редактора :sh позволяет вам делать то же самое, но ведет по другому себя на экране. Из командного режима редактора vi введите :sh и нажмите клавишу RETURN. Подсказка команды shell появится на следующей строке. Ведите ваши команды после подсказки так, будто бы вы работаете в нормальном режиме с shell. Когда вы будете готовы вернуться к редактору vi, введите ^d или exit. Экран обновит информация из вашего буфера и курсор вновь переместится на прежнее место.

При временном переходе к shell даже изменение справочников не мешает возврату к буферу редактора vi при вводе ^d или exit.

7.19.2. Запись текста в новый файл

Команда "w" позволяет вам создавать файл, копируя строки текста из файла, который вы в данный момент редактируете, в файл, который вы указали. Чтобы создать новый файл нужно указать строку или строки (номера строк) и имя нового файла в командной строке. Общий формат этой команды:

	:line_number[, line_number]w filename 

Например, чтобы записать третью строку буфера в файл three, введите:

	:3w three<CR>

При успешном создании нового файла, редактор vi напечатает следующую информацию:

	"three" [New file] 1 line, 20 characters 

Чтобы записать текущую строку в файл, укажите . (точку) как адрес строки:

	:.w junk<CR>

Создастся новый файл с именем junk. Он будет содержать только текущую строку буфера vi.

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

	:23,37w newfile<CR>

7.19.3. Переход к указанной строке

Вы можете переместить курсор к любой строке в буфере, если введете команду:

	:n<CR>

где n - номер строки в буфере.

7.19.4. Удалить остаток буфера

Одним из самых простых способов удаления всех строк от текущей строки и до конца буфера является использование команды "d" построчного редактора со специальнымим символами для текущей и последней строк:

	:.,$d<CR>

где .(точка) - обозначает текущую строку;
$ - обозначает последнюю строку.

7.19.5. Добавить файл в буфер

Чтобы добавить текст из файла ниже указанной строки в буфер редактора, воспользуйтесь командой "r". Например, чтобы перенести содержимое файла data в ваш текущий файл, поместите курсор на то место, где должен стоять текст и введите команду:

	:r data<CR>

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

	:56r data<CR>

7.19.6. Провести глобальные изменения

:g/pattern/command<CR> -
для каждой строки, содержащей pattern выполнить команду command редактора ex. Построчный редактор напечатает све строки, сождержащие pattern;
:s/pattern/new_words<CR> -
это команда замены. Построчный редактор отыскивает первое появление символов pattern в текущей строке и заменяет его на new_words;
:s/pattern/new_words/g<CR> -
редактор ex заменяет каждое появление pattern в текущей строке;
:g/helix/s//double helix/g<CR> -
эта команда осуществляет поиск слова helix. Каждое найденное слово helix заменяется на double helix. Ограничители после команды "s" позволяют не вводить слово helix каждый раз. Команда запоминает слово между ограничителями после команды "g".

В табл. 17 приведены команды построчного редактора, доступные в редакторе vi.

Таблица 17
Команды построчного редактора

Команда Функция
: Обозначает, что следующая за ней команда является командой построчного редактора
:sh<CR> Временный возврат к shell для выполнения команд shell
^d Возврат из временного shell в текущее окно vi для продолжения редактирования
:n<CR> Переход к n-ой строке буфера
:x,yw data<CR> Записать строки от номера x до номера y в новый файл data
:$<CR> Переход к последней строке буфера
:.,$d<CR> Удалить все строки в буфере, начиная с текущей и до послед- ней строки
:r shell.file<CR> Вставить содержимое shell.file после текущей строки в буфере
:s/text/new_words/<CR> Заменить первое появление символов text в текущей строке на new_words
:s/text/new_words/g<CR> Заменить каждое появление символов text в текущей строке на new_words
:g/text/s//new_words/g<CR> Заменить каждое появление символов text в файле на new_words

7.20. Завершение работы с редактором vi

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

:wq<CR> -
записать содержимое буфера vi в файл, который в данный момент редактируется и завершить работу с vi;
ZZ -
записать содержимое буфера, если он изменялся с момента последней записи;
:q<CR> -
записать временный буфер в новый файл filename и завершить работу с редактором vi;
:q!<CR> -
завершить работу с редактором vi без записи содержимого буфера в файл; не учитываются все изменения, проведенные в буфере;
:q<CR> -
завершить работу с редактором vi без записи содержимого буфера в файл. Эта команда работает в том случае, если вы не производили изменений в буфере. В противном случае vi выдаст предупреждающее сообщение о том, что вы должны сохранить буфер или воспользоваться для завершения работы с vi командой :q!<CR>. Что нужно сделать, чтобы дать файлу другое имя?

Например, вы хотите записать в новый файл junk. Введите команду:

	:w junk<CR>

Затем завершите работу с vi:

	:q<CR>

Если вы попытаетесь записать в уже существующий файл, то получите предупреждающее сообщение. Например, если вы попытаетесь записать в файл johnson, система выдаст сообщение:

         "johnson" File exists - use "w!johnson"
         to overwrite 

Если вы хотите заменить содержимое существующего файла на содержимое буфера, то воспользуйтесь командой ":w!":

	:w! johnson<CR>

В табл. 18 приведены команды завершения работы с редактором vi.

Таблица 18
Команды завершения

Команда Функция
ZZ Записать буфер в файл, если после последней записи в буфере были сделаны изменения, и завершить работу с vi
:wq<CR> Записать буфер в файл и завершить работу с vi
:w filename<CR> Записать буфер в новый файл filename
:q<CR> и завершить работу с vi
:w! filename<CR> Перезаписать содержимое буфера в уже
:q<CR> существующий файл filename и завершить работу с vi
:q!<CR> Завершить работу с vi без записи буфера в файл, даже если содержимое буфера изменялось
:q<CR> Завершить работу с vi без записи буфера в файл, если буфер не изменялся

7.21. Специальные опции для vi

Команда vi имеет специальные опции. Они позволяют:

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

7.21.1. Восстановление потерянного файла

Если случайно произошло прерывание работы редактора vi, то не производится запись текста из буфера обратно в файл. Но vi сохраняет копию буфера. Когда вы вновь зарегистрируетесь в системе UNIX, вы можете восстановить файл с помощью опции -r. Введите:

	vi -r filename<CR>

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

7.21.2. Редактирование нескольких файлов

Если вы хотите редактировать в одном сеансе более одного файла, то введите команду vi, указав имя каждого файла:

	vi file1 file2<CR>

vi ответит, сколько файлов вы будете редактировать.

Например:

	2 files to edit 

После того, как вы отредактировали первый файл, запишите все изменения из буфера в файл file1:

	:w<CR>

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

	:n<CR>

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

7.21.3. Просмотр файла

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

	view file<CR>

В табл. 19 приведены специальные опции редактора vi.

Таблица 19
Специальные опции vi

Опция Функция
vi file1 file2 file3<CR> Ввести три файла (file1 file2 и file3) в буфер vi для редактирования
:w<CR> Записать текущий файл и начать
:n<CR> редактирование следующего файла
vi -r file1<CR> Восстановить изменения, сделанные в файле file1
view file<CR> Осуществить просмотр файла с помощью опции "только чтение" чтобы предотвратить случайные изменения в файле file

8. Shell - интерпретатор командного языка

В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют:

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

8.1. Метасимволы

В табл. 20 приведены метасимволы, используемые shell.

Таблица 20
Метасимволы

Символ Функция
* ? [ ] Эти метасимволы позволяют указывать сокращенные имена файлов при поиске по шаблону
& Означает, что команда будет выполняться в фоновом режиме
; Точка с запятой разделяет команды в командной строке
\ Отменяет специальное значение символов, таких как *, ?, [, ], &, ;, <, >, |
'...' Одиночные кавычки отменяют значение пробела как разделителя и специальное значение всех символов
"..." Двойные кавычки отменяют значение пробела как разделителя и специальное значение всех символов, за исключением $ и \
> Перенаправляет вывод команды в файл
< Перенаправляет ввод для команды из файла
>> Перенаправляет вывод команды, который должен быть добавлен в конец существующего файла
| Создает канал, направляющий вывод одной команды во ввод другой команды
`...` Используется в паре; позволяет использовать вывод команды как аргументы в командной строке
$ Используется с позиционными параметрами и определенными пользователем пременными; также используется по умолчанию в качестве подсказки shell

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

8.1.1. Поиск всех символов (метасимвол *)

Метасимвол * осуществляет поиск любой строки символов, включая нулевую (пустую) строку. Вы можете использовать * для обозначения полного или частичного имени файла. Просто символ * ищет все имена файлов и справочников в текущем справочнике, за исключением тех, которые начинаются с точки. Чтобы посмотреть метасимвол * в действии, введите его как аргумент в команде echo:

	echo *<CR>

В ответ система распечатает перечень всех имен файлов в вашем текущем справочнике.

Символ * может представлять символы в любой части имени файла. Например, если вы знаете, что несколько файлов имеют одинаковые первые и последние буквы, то вы можете выдать запрос, основываясь на этом факте. Если в вашем справочнике находятся файлы FATE, FE, FADED_LINE, FIG3.4E, FINE_LINE, FAST_LINE, то для отображения всех этих файлов на экране введите команду:

	ls F*E<CR>

Вы можете, например, с помощью метасимвола * найти все файлы с именами memo в системном справочнике: ls */memo

8.1.2. Поиск по одному символу (метасимвол ?)

Метасимвол ? осуществляет поиск любого одного символа в имени файла за исключением лидирующей точки. Предположим, вы имеете книгу, в которой 12 глав и хотите получить список глав до 9-ой главы. Если ваш справочник содержит следующие файлы:

        Chapter1
        Chapter2
        Chapter5
        Chapter9
        Chapter11

то введите команду ls с метасимволом ? для получения всех глав, которые начинаются со строки "Chapter" и заканчиваются одним символом:

        $ ls Chapter?<CR>
        Chapter1
        Chapter2
        Chapter5
        Chapter9
        $

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

	ls Chapter??<CR>

И, конечно, чтобы получить список всех глав в текущем справочнике, используйте метасимвол *:

	ls Chapter*<CR>

8.1.3. Поиск одного набора (метасимвол [])

Если вы хотите, чтобы shell нашел любой символ из перечисленных вами символов, то заключите эти символы в квадратные скобки. Предположим, ваш справочник содержит следующие файлы: cat, fat, mat, rat. Если вы воспользуетесь в качестве части имени файла шаблоном [crf], то shell будет искать имена файлов, в которые входят либо буква "c", либо буква "r", либо буква "f" в указанной позиции. Пример:

        $ ls [crf]at<CR>
        cat
        fat
        rat
        $

Символы, которые могут быть сгруппированы в скобки, называются классом символов.

Скобки могут также использоваться для обозначения диапазона символов, цифр или букв. Предположим в вашем справочнике содержатся следующие файлы: chapter1, chapter2, chapter3, chapter4, chapter5, chapter6. Если вы укажете:

	chapter[1-5]

то shell найдет файлы c chapter1 по chapter5.

Класс символов можно также указать с помощью диапазона букв. Если вы укажете [A-Z], то shell будет искать только большие буквы, если [a-z] - то малые буквы.

8.2. Специальные символы

shell имеет также и другие символы, которые выполняют различные полезные функции.

8.2.1. Запуск команды в фоновом режиме (символ &)

Некоторые команды shell занимают много времени при выполнении. Эти команды можно запустить в фоновом режиме с использованием &, освобождая тем самым терминал для других задач. Общий формат для запуска команд в фоновом режиме следующий:

	command &<CR>

Примечание. Интерактивные команды shell (например, read) нельзя запускать в фоновом режиме.

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

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

8.2.2. Последовательное выполнение команд (символ ;)

В одной командной строке вы можете указать несколько команд. Эти команды должны быть разделены символом ; (точка с запятой) или символом & (амперсанд):

	command1; command2; command3<CR>

Система UNIX выполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением.

Например, введите:

	cd; pwd; ls<CR>

shell выполнит эти команды последовательно:

  1. cd изменит ваше местоположение, переместив вас в регистрационный справочник;
  2. pwd распечатает полное имя пути вашего текущего справочника;
  3. ls перечислит файлы в вашем текущем справочнике.

8.2.3. Отмена специального значения (метасимвол \)

Символ \ позволяет вам отменить специальное значение следующего за ним символа. Например, у вас есть файл trail, который содержит следующий текст:

        The all * game
        was held in Summit.

Чтобы найти символ звездочка (*) в файле, воспользуйтесь командой grep:

        $ grep \* trail<CR>
        The all * game
        $

команда grep найдет символ * в тексте и отобразит строку, в которой она появилась. Без символа \, символ звездочка будет интерпретироваться shell как метасимвол.

8.2.4. Отмена специального значения (метасимвол кавычки)

Отменить специальное значение символа вы также можете с помощью метасимвола кавычки. Одиночные кавычки ('...') отменяют специальное значение всех символов за исключением самих одиночных кавычек. Двойные кавычки ("...") отменяют специальное значение всех символов, за исключением символов двойные кавычки, $ и `(слабое ударение). Использование кавычек удобно для цифровых специальных символов.

Например, ваш файл trail содержит строку:

	He really wondered why? Why???

Чтобы найти строку, содержащую три вопросительных знака, воспользуйтесь командой grep:

	$ grep '???' trail<CR>
	He really wondered why? Why???
	$

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

Кавычки аналогично обратной косой черте часто используются для отмены специального значения пробела. shell интерпретирует пробел в командной строке как разделитель между аргументами команды. Одиночные и двойные кавычки и обратная косая черта позволяют отменить это значение.

Например, чтобы в тексте разместить два или более слова, сделайте эти два слова одним аргументом, заключив их в кавычки. Чтобы найти два слова "The all" в файле trail, введите следующую команду:

        $ grep 'The all' trail<CR>
        The all * game
        $

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

Чтобы напечатать более одного аргумента на одной строке, заключите слова в двойные кавычки. Например, если вы введете:

	banner happy birthday to you<CR>

то команда banner напечатает ваше сообщение на 4-х строках. Если вы введете:

	banner happy birthday "to you"<CR>

то команда banner напечатает ваше сообщение на 3-х строках, причем слова "to" и "you" напечатает на одной строке.

Команда banner печатает сообщения на экране терминала большими плакатного размера буквами.

8.3. Перенаправление ввода и вывода

В системе UNIX некоторые команды ожидают ввод только с клавиатуры (стандартный ввод) и большинство команд отображают свой вывод на экране терминала (стандартный вывод). Однако система UNIX позволяет вам перенаправлять ввод и вывод в файлы и программы, т.е. вы можете сказать shell:
  • взять ввод из файла, а не с клавиатуры;
  • послать вывод в файл, а не на терминал;
  • использовать программу как исходные данные для другой программы.

8.3.1. Перенаправить ввод: знак <

Чтобы перенаправить ввод, укажите в командной строке после знака "меньше чем" (<) имя файла:

	command < имя_файла<CR>

8.3.2. Перенаправить вывод: знак >

Чтобы перенаправить вывод, укажите в командной строке после знака "больше чем" (>) имя файла:

	command > имя_файла<CR>

Примечание. Если вы перенаправите вывод в уже существующий файл, то вывод вашей команды заменит содержимое существующего файла.

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

Чтобы убедиться, что файл с запланированным именем не существует, воспользуйтесь командой ls с аргументом "имя_файла". Если этот файл не существует, то ls выдаст сообщение, что файл не найден в текущем справочнике. Например, проверка существования файлов temp и junk даст следующий результат:

        $ ls temp<CR>
        temp
        $ ls junk<CR>
        junk: no such file or directiry
        $

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

8.3.3. Добавить вывод в существующий файл

Чтобы добавить вывод в существующий файл и не разрушить его, вы можете воспользоваться символом >>:

	command >> имя_файла<CR>

В результате выполнения команды вывод будет добавлен в конец существующего файла. Если файл не существует, то он будет создан. Например, рассмотрим как добавить вывод с помощью команды cat. Команда cat печатает содержимое файлов, имена которых являются ее аргументами, в стандартный вывод. Если нет аргументов, то она печатает стандартный ввод в стандартный вывод. Сначала выполните команду cat без перенаправления вывода. Затем содержимое файла trial2 добавляем после последней строки в файл trial1 при выполнении команды cat над файлом rtial2, перенаправив вывод в файл trial1:

        $ cat trial1<CR>
        This is the first line of trial1.
        Hello.
        This is the last line of trial1.
        $
        $ cat trial2<CR>
        This is the beginning of trial2.
        Hello.
        This is the end of trial2.
        $ cat trial2 >> trial1<CR>
        $ cat trial1<CR>
        This is the first line of trial1.
        Hello.
        This is the last line of trial1.
        This is the beginning of trial2.
        Hello.
        This is the end of trial2.
        $

8.3.3.1. Некоторые применения перенаправления вывода

Перенаправление вывода очень удобно в том случае, если вы не хотите, чтобы вывод появлялся на экране немедленно, или хотите сохранить его. Рассмотрим две команды: spell и sort.

Команда spell

Команда spell сравнивает каждое слово в файле со своим словарем и печатает список всех потенциальных орфографических ошибок на экране. Если в словаре spell нет какого-либо слова (например, персональное имя), то она также выдает его как орфографическую ошибку. Если вы подадите на ввод spell большой файл, то его обработка займет много времени и список ошибок может быть очень большим. Команда spell распечатывает весь список ошибок сразу. Поэтому лучше всего перенаправить вывод spell в файл. Например, spell осуществляет поиск файла memo и помещает список орфографических ошибок в файл misspell:

	$ spell memo > misspell<CR>

Команда sort

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

8.3.3.2. Комбинирование фонового режима и перенаправления вывода

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

Предположим, что вы хотите найти все появления слова "test" в файле schedule. Запустите команду grep в фоновом режиме и перенаправьте вывод в файл testfile:

	$ grep test schedule > testfile<CR>

Теперь вы можете использовать терминал для других работ и просмотреть файл testfile позднее.

8.3.4. Перенаправление вывода команде

Символ | называется каналом. Канал является мощным средством, которое позволяет вам брать вывод одной команды и использовать его в качестве ввода для другой команды без создания временных файлов. Таким образом построенная последовательность команд называется конвейером. Общий формат конвейера:

	command1 | command2 | command3 ... <CR>

Вывод command1 используется как ввод для command2. Вывод command2 используется как ввод для command3.

Чтобы понять насколько эффективен конвейер, рассмотрим 2 способа, которые дают одинаковый результат:

  • использование метода перенаправления ввода/вывода. Запустим одну команду и перенаправим ее вывод во временный файл. Затем запустим вторую команду, которая берет содержимое временного файла как ввод. И в конце удалим временный файл;
  • использование метода конвейера. Например, предположим вы хотите послать сообщение happy birthday с помощью команды banner владельцу david. Выполним сначала по первому методу:
    1. Введите команду banner и перенаправьте ее вывод во временный файл:
      	banner happy birhday > message.tmp 
    2. Введите команду mail и в качестве ввода воспользуйтесь файлом message.tmp:
      	mail david < message.tmp 
    3. Удалите временный файл:
      	rm message.tmp 

      Вторым методом это можно сделать быстрее:

      	banner happy birthday | mail david<CR>

8.3.5. Подстановка вывода в качестве аргумента

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

Например, вы можете подставить вывод конвейера команд date и cut в качестве аргумента в команде banner:

	$ banner `date | cut -c12-19`<CR>

Обратите внимание на результат: система печатает banner с текущим временем.

8.4. Выполнение, останов и повторный запуск процессов

В этом подразделе описывается:
  • как запустить команду в определенное время с помощью команд batch и at;
  • как получить информацию о состоянии процесса;
  • как завершить активный процесс;
  • как вновь запустить остановленный процесс;
  • как пренести процесс из оперативного в фоновый режим и наоборот.

8.4.1. Запуск команд в заданное время

Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).

Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:

        batch<CR>
        первая команда<CR>
        .
        .
        .
        последняя команда<CR>
        <^d>

Если запускается только одна команда, то ее можно ввести в одной командной строке:

	batch command_line<CR>

В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем справочнике и перенаправляет вывод в файл dol.file.

        $ batch<CR>
        grep dollar * > dol.file<CR>
        <^d>
        job 155223141.b at Sun Dec 11:14:54 1989
        $

После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.

Команда at позволяет вам указывать точное время выполнения команд. Общий фомат команды at:

        at time<CR>
        первая команда<CR>
        .
        .
        .
        последняя команда<CR>
        <^d>

Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.

В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:

        $ at 8:15am Feb 27<CR>
        banner happy birthday | mail emily<CR>
        <^d>
        $

Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.

Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:

	at -r jobnumber<CR>

Например, чтобы удалить предыдущее задание at, введите:

	at -r 453400603.a<CR>

Если вы забыли номер задания, то команда :

	at -l 

распечатает вам список текущих заданий в очереди batch или at, как показано на следующем экране:

        $ at -l<CR>CW
        user mylogin 168302040.a at Sat Nov 25 13:00:00 1989
        user mylogin 453400603.a at Fri Feb 24 08:15:00 1989
        $

Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания "am" и "pm", чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.

Пример.

        at 08:15am Feb 27
        at 5:14pm Sept 24

8.4.2. Получить состояние запущенного процесса

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

В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система UNIX назначает каждому активному процессу.

В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):

        $ grep word * > temp <CR>
        28223
        $
        $ ps<CR>
        PID         TTY       TIME       COMD
        28124       tty10     0:00       sh
        28223       tty10     0:04       grep
        28224       tty10     0:04       ps
        $

Обратите внимание, что система распечатала номер PID для команды grep так же, как и для всех других запущенных процессов: для самой команды ps и команды sh, которая была запущена во время вашей регистрации.

Вы можете приостановить и вновь запустить программу, если в вашей системе предусмотрена функция управления заданиями. Команда jobs выдает список текущих фоновых процессов, запущенных или приостановленных. Команда jobs дополнительно к PID распечатывает идентификатор задания (JID) и имя задания. Чтобы вновь запустить приостановленное задание, либо возобновить фоновый процесс в оперативном режиме, вам необходимо знать JID. JID распечатывается на экране каждый раз, когда вы вводите команду запуска или останова процесса. Если вы введете:

	jobs<CR>

то на экране появится следующая информация:

	[JID] - Stopped (signal) <имя задания>

или

	[JID] + Running      <имя задания>

8.4.3. Завершение активных процессов

Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд:

	kill PID<CR>

или

	stop JID<CR>

Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.

Пример.

        $ kill 28223<CR>
        28223 Terminated
        $

После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:

	kill:28223:No such process 

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

	ctrl Z 

На экране появится следующее сообщение:

	<JID> Stopped(user)  <имя задания>

8.4.4. Запуск остановленного задания

Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами:

fg <JID> -
возобновляет приостановленное задание или переводит задание из фонового режима в оперативный;
bg <JID> -
вновь запускает приостановленное задание в фоновом режиме.

8.4.5. Использование команды nohup

Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:

	nohup command &<CR>

Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки "word" и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:

	nohup grep word * > word.list & <CR>

Вы можете завершить команду nohup с помощью команды kill.

9. Средства программирования shell

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

Прежде чем создавать программы shell необходимо изучить редактор.

9.1. Программы shell

9.1.1. Создание простых программ shell

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

  • печать текущего справочника;
  • список содержимого этого справочника;
  • отображение следующих сообщений на вашем терминале:
    	"This is the end of the shell program."

С помощью редактора создайте файл dl и введите в него строки:

        pwd<CR>
        ls<CR>
        echo This is the end of the shell program.<CR>

Теперь вы имеете программу shell. Вы можете с помощью cat отобразить содержимое файла:

        $ cat dl<CR>
        pwd
        ls
        echo This is the end of the shell program.
        $

9.1.2. Выполнение программ shell

Выполнить shell программу вы можете с помощью команды sh. Введите:

	sh dl<CR>

Когда команда dl выполняется с помощью sh, то вначале печатается имя пути текущего справочника, потом список файлов в текущем справочнике и в конце комментарий: "This is the end of the shell program."

С помощью команды chmod вы можете сделать файл исполняемым:

        $ chmod u+x dl<CR>
        $ ls -l<CR>
        total 2
        -xw------ 1 login  login  3661  Nov  2   10:28 mbox
        -xwx----- 1 login  login    48  Nov 15   10:50 dl
        $

Обратите внимание, что chmod включает разрешение на выполнение (+x) для пользователя (u). Теперь dl является исполняемой программой. Попытайтесь выполнить ее. Введите:

	dl<CR>

9.1.3. Создание справочника bin для исполняемых файлов

Чтобы сделать shell программы доступными изо всех ваших справочников, вы можете создать справочник bin в своем регистрационном справочнике и переписать shell программы в этот справочник.

С помощью переменной PATH вы можете включить ваш справочник bin:

	PATH = $PATH:$HOME/bin 

9.1.4. Ограничения при именовании программ shell

shell программе вы можете дать любое имя, не совпадающее с именами системных команд. Если имя вашей программы совпадает с именем команды системы, то система будет выполнять вашу команду вместо системной.

9.2. Переменные

shell программы манипулируют с переменными. В этом пункте обсуждаются три типа переменных:

  • позиционные параметры;
  • специальные параметры;
  • именованные переменные.

9.2.1. Позиционные параметры

Позиционные параметры являются переменными в shell программе. Их значение устанавливается из аргументов, указанных в командной строке, которая вызывает программу. Позиционные параметры нумеруются и на них ссылка идет с помощью символа $: $1, $2, $3 и т.д.

shell программа может использовать до 9 позиционных параметров. Если shell программа вызывается с помощью командной строки, подобной следующей:

	shell.prog pp1 pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9 <CR>

то позиционному параметру $1 в программе присваивается значение pp1, $2 - значение pp2 и т.д. во время вызова программы. Чтобы практически рассмотреть это замещение позиционных параметров, создайте файл pp. Затем введите команды echo в файл pp. В результате выполнения команды cat получим следующий вывод:

        $ cat pp<CR>
        echo The first positional parameter is: $1<CR>
        echo The second positional parameter is: $2<CR>
        echo The third positional parameter is: $3<CR>
        echo The fourth positional parameter is: $4<CR>
        $

Если вы выполните эту shell программу с аргументами one, two, three, four, то получите результат (но вначале нужно сделать shell программу pp исполняемой с помощью команды chmod):

        $ chmod u+x pp<CR>
        $
        $ pp one two three four<CR>
        echo The first positional parameter is: one
        echo The second positional parameter is: two
        echo The third positional parameter is: three
        echo The fourth positional parameter is: four
        $

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

	who | grep $1<CR>

Команда who перечисляет всех текущих пользователей системы, а команда grep осуществляет поиск строки, содержащей значение, соответствующее позиционному параметру $1. Теперь подставим конкретное имя в качестве аргумента в файле whoson, например, sue. Когда вы зададите команду "whoson sue", shell программа заменит $1 на sue в вашей программе и выполнит ее в следующем виде:

	who | grep sue<CR>

Вывод будет следующим:

        $ whoson sue<CR>
        sue     tty26      Jan 24 13:35
        $

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

shell позволяет указывать в командной строке до 128 аргументов, но ссылаться можно не более, чем на 9 позиционных параметров. В следующем пункте описан специальный параметр $*.

9.2.2. Специальные параметры

Когда вы обращаетесь к программе shell, специальный параметр $# содержит число аргументов, с которыми shell программа была вызвана. Это значение может использоваться в любом месте shell программы.

Например, создайте командную строку в файле get.num, сделайте файл исполняемым и запустите команду cat:

        $ cat get.num<CR>
        echo The number of arguments is: $#
        $

Программа просто отобразит число аргументов, с которыми она была вызвана.

Когда вы обращаететсь к shell программе специальный параметр $* содержит строку со всеми аргументами, с которыми программа была вызвана.

9.2.3. Именованные переменные

В shell программе вы можете использовать именованные переменные. Значение именованной переменной вы присваиваете сами следующим образом:

	name_variable=value<CR>

Обратите внимание, что ни слева ни справа от знака равенства нет пробелов.

В следующем примере var1 - это имя переменной, а myname - значение строки символов, которое присваивается переменной:

Пример.

	var1=myname<CR>

Знак $ используется перед именем переменной в shell программе для ссылки на значение этой переменной. Если взять предыдущий пример, то ссылка $var1 говорит shell, что нужно заменить на значение myname любую встретившуюся строку символов $var1.

Первый символ имени переменной должен быть буквой или символом подчеркивания. Имя переменной может состоять из букв, символов подчеркивания и цифр. Имена переменных не должны совпадать с именами shell команд. Также shell зарезервировано несколько имен переменных, которые вы не должны использовать для своих переменных. Ниже дано краткое описание этих зарезервированных имен переменных:
CDPATH - определяет путь поиска команды;
HOME - значение, используемое по умолчанию командой cd (собственный справочник);
IFS - определяет разделитель (обычно пробел, табуляция и возврат каретки);
LOGNAME - ваше регистрационное имя;
MAIL - имена файлов, которые содержат электронную почту;
PATH - определяет имя пути, используемое shell для нахождения команд;
PS1 - определяет первичную подсказку (по умолчанию $);
PS2 - определяет вторичную подсказку (по умолчанию >);
TERM - идентифицирует тип терминала. Значение этой переменной важно при работе с редактором vi;
TERMINFO - идентифицирует справочник, в котором находится информация о вашем терминале;
TZ - определяет зону времени (по умолчанию EST5EDT).

Значение этих переменных вы можете определить двумя способами. Первый, вы можете ввести:

	echo $variable_name 

Система распечатает значение переменной variable_name. Второй способ: вы можете воспользоваться командой env для распечатки значений всех определенных переменных в shell. Для этого введите команду env и система выдаст список всех имен переменных и их значения.

9.2.4. Присвоение значений переменным

Если вы редактируете с помощью редактора vi, то знаете, что можно установить значения переменной TERM вводом следующей командной строки:

        TERM=terminal_name<CR>
        export TERM 

Это простейший способ присвоения значения переменной. Существует еще несколько способов присвоения:

  • использование команды read для присвоения ввода переменной;
  • перенаправление вывода команды в переменную с использованием команды замены со знаками слабого ударения (`...`);
  • присвоение позиционного параметра переменной.

9.2.4.1. Использование команды read

Общий формат команды read:

	read variable<CR>

Значение, присвоенное командой read переменной variable, будет заменять $variable где бы она не встречалась в программе пользователя. Если программа выполняет команду echo до команды read, то она сможет отобразить только:

	Type in ...

Команда read будет ждать до тех пор, пока вы не введете строку символов и нажмете клавишу <CR>, тем самым присваивая строку переменной.

Следующий пример покажет вам, как написать простую shell программу num.please, содержащую телефонные номера. Эта программа использует следующие команды:
echo - выдает подсказку для ввода фамилий клиентов;
read - присваивает вводимое значение переменной;
grep - просматривает файл list в поисках этой переменной.

Программа будет выглядеть следующим образом:

Пример.

        $ cat num.please<CR>
        echo Type in the list name:
        read name
        grep $name home/list
        $

Создайте файл list, содержащий несколько фамилий и номеров телефонов. И теперь запустите файл num.please.

В следующем примере приводится текст программы mknum, которая создает список. В программе mknum используется следующая последовательность команд:
echo - выдает подсказку для ввода имени клиента;
read - присваивает имя клиента переменной name;
echo - выдает подсказку для ввода номера телефона;
read - присваивает номер телефона переменной num;
echo - добавляет значение переменных name и num в файл list;

Если вы хотите, чтобы вывод команды echo добавлялся в конец списка, то вы должны использовать >>. Если вы будете использовать >, то список будет состоять из последего номера телефона, который вы добавили.

С помощью команды cat отобразите содержание программы mknum:

Пример.

        $ cat mknum<CR>
        echo Type in name
        read name
        echo Type in number
        read num
        echo $name $num >> list
        $ chmod u+x mknum<CR>
        $

9.2.4.2. Перенаправление вывода команды в переменную

Формат команды следующий:

	variable=command<CR>

Вывод команды становится значением переменной. Пример shell программы t, распечатывающей время:

        $ cat t<CR>
        time=`date | cut -c12-19`
        echo The time is: $time
        $

Сделайте файл исполняемым и получите программу, которая выдает время:

        $ chmod u+x t<CR>
        $ t<CR>
        The time is: 10:30
        $

9.2.4.3. Присвоение позиционного параметра переменной

Вы можете присвоить позиционный параметр именованному параметру следующим образом:

	var1=$1<CR>

В следующем примере приведена программа simp.p, которая присваивает позиционнный параметр переменной:

Пример.

        $ cat simp.p<CR>
        var1=$1
        echo $var1
        $

Также вы можете присвоить переменной вывод команды, которая использует позиционные параметры:

	person=`who | grep $1`<CR>

9.3. Конструкции языка программирования shell

Язык программирования shell имеет несколько конструкций, которые придадут гибкость вашим программам:

  • комметнарии позволят описывать функции программы;
  • "here document" позволяет вам включать в shell программы строки, которые будут перенаправляться как ввод в некоторые команды shell программы;
  • команда exit позволяет завершать программу в нужной точке и использовать коды возврата;
  • конструкции цикла for, while позволяют повторять группу команд в цикле;
  • условные команды if и case выполняют группу команд, если выполнилось некоторое условие;
  • команда break позволяет выполнить безусловный выход из цикла.

9.3.1. Комментарии

Чтобы в программе разместить комментарии, воспользуйтесь знаком #. Если знак # стоит после команды, то сама команда выполняется, а комментарий игнорируется. Формат строки комментария:

	#comment<CR>

9.3.2. "Here document"

"Here document" позволяет размещать в shell программе строки, которые перенаправляются в качестве ввода команды в этой программе. Это один из способов обеспечения ввода для команды в shell программе без использования отдельного файла. Запись состоит из символа перенаправления << и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак !.

Формат команды следующий:

        command<<delimiter<CR>
        ...input lines...<CR>
        delimiter<CR>

9.3.3. Использование ed в shell программе

"Here document" предлагает способ использования ed в shell программе. Предположим вы хотите создать shell программу, которая будет вызывать редактор ed, проводить глобальные изменения в файле, записывать изменения в файл и затем завершать работу с ed. На следующем экране приведено содержание программы ch.text, которая выполняет эти задачи:

      $ cat ch.text<CR>
      echo Type in the filename
      read file1
      echo Type in the exact text to be changed.
      read old_text
      echo Type in the exact new text to replace the above.
      read new_text
      ed - $file1 <<!
      g/$old_text/s//$new_text/g
      w
      q
      !
      $

Обратите внимание на знак - (минус) в команде ed. Эта опция предотвращает распечатку счетчика символов на экране. Обратите также внимание на формат команды ed для глобальной замены:

	g/$old_text/s//$new_text/g 

Программа использует 3 переменные: file1, old_text, new_text. При запуске эта программа использует команду read для получения значений этих переменных. Эти переменные содержат следующую информацию:
file - имя файла, который будет редактироваться;
old_text - текст, который будет изменен;
new_text - новый текст.

Переменные вводятся в программу, here document перенаправляет команду глобальной замены, команду записи и команду завершения команде ed. Запустите программу ch.text. Получите следующий экран:

        $ ch.text<CR>
        Type in the filename
        memo<CR>
        Type in the exact text to be changed.
        Dear John:<CR>
        Type in the exact new text to replace the above.
        To what it may concern:<CR>
        $ cat memo<CR>
        To what it may concern:<CR>
        $

9.3.4. Коды завершения

Большинство команд shell возвращает коды, которые указывают, успешно ли завершилась команда. Если возвращаемое значение 0(ноль), то команда выполнилась успешно. Коды возврата не печатаются автоматически, но их можно получить как значение специального параметра shell $?.

9.3.4.1. Проверка кодов завершения

После выполнения в интерактивном режиме команды, вы можете увидеть код завершения при вводе:

	echo $?

Рассмотрим следующий пример:

        $ cat hi
        This is file hi.
        $ echo $?
        0
        $ cat hello
        cat: cannot open hello
        $ echo $?
        2
        $

В первом случае файл hi существует в вашем справочнике и вы имеете разрешение на чтение. С помощью команды cat вы можете распечатать содержимое файла. Результат команды cat: код возврата 0, который вы получите, задав параметр $?. Во втором случае файл либо не существует, либо вы не имеете право на чтение. Команда cat печатает диагностическое сообщение и возвращает код 2.

shell программа нормально завершается, когда выполнится последняя команда в файле. Однако вы можете использовать команду exit для завершения программы. Более важно то, что вы можете использовать команду exit для получения кодов возврата shell программы.

9.3.5. Циклы

Операторы цикла for и while позволяют выполнить команду или последовательность команд несколько раз.

9.3.5.1. Оператор for

Оператор for выполняет последовательность команд для каждого элемента списка. Он имеет формат:

        for variable<CR>
            in a_list_of_values<CR>
        do<CR>
            command_1<CR>
            command_2<CR>
                 .
                 .
                 .
            last command<CR>
        done<CR>

Для каждой итерации цикла следующий элемент списка присваивается переменной, данной в операторе for. Ссылка на эту переменную может быть сделана в любом месте в командах внутри оператора do. При конструировании каждой секции команд вам необходимо убедиться, что каждому do соответствует done в конце цикла.

Переменная может иметь любое имя. Например, если ваша переменная названа var, то ссылка в списке команд на $var сделает значение доступным. Если оператор in опущен, то значением для var будет набор аргументов, заданный в команде и доступный в специальном параметре $*. Список команд между ключевым словом do и done будет выполнен для каждого значения.

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

9.3.5.2. Оператор while

Оператор цикла while использует 2 группы команд. Он будет выполнять последовательность команд во второй группе (список do ... done) до тех пор пока последняя команда в первой группе (список while) возвращает состояние "истина", означающее, что выражение после do может быть выполнено.

Общий формат оператора цикла while:

        while<CR>
            command_1<CR>
                .
                .
                .
            last command<CR>
        do<CR>
            command_1<CR>
                .
                .
                .
            last command<CR>
        done<CR>

Например, программа enter.name использует цикл while для ввода списка имен в файл. Программа состоит из следующих командных строк:

        $ cat enter.name<CR>
        while
           read x
        do
           echo $x>>xfile
        done
        $

Внеся некоторые добавления, получим следующую программу:

     $ cat enter.name<CR>
     echo Please type in each person's name and than a <CR>
     echo Please end the list of names with a <^d>
     while read x
     do
        echo $x>>xfile
     done
     echo xfile contains the following names:
     cat xfile
     $

Обратите внимание, что после завершения цикла программа выполняет команды ниже done.

В первых двух командах echo используются специальные символы, так что вы должны воспользоваться кавычками для отмены специального значения. На следующем экране приведены результаты выполнения программы enter.name:

     $ enter.name<CR>
     Please type in each person's name and than a <CR>
     Please end the list of names with a <^d>
     Mary Lou<CR>
     Janice<CR>
     <^d>
     xfile contains the following names:
     Mary Lou
     Janice
     $

После того, как цикл завершится, программа распечатает все имена, содержащиеся в xfile.

9.3.6. Использование /dev/null

Файловая система имеет файл /dev/null, где вы можете хранить нежелательный вывод. Например, если просто ввести команду who, то система ответит, кто работает в системе. Если вы перенаправите вывод этой команды в /dev/null:

	who > /dev/null 

то не получите ответа.

9.3.7. Условные операторы

Оператор if ... then

Команда if говорит shell программе, что нужно выполнить последовательность команд после then, если последняя команда в списке команд конструкции if выполнилась успешно. Конструкции if заканчиваются ключевым словом fi.

Общий формат конструкции if:

        if<CR>
            command_1<CR>
                .
                .
                .
            last command<CR>
        then<CR>
            command_1<CR>
                .
                .
                .
            last command<CR>
        fi<CR>

Например, shell программа search демонстрирует применение конструкции if ... then. Программа search использует команду grep для поиска слова в файле. Если grep выполнилась успешно, то программа отображает найденное слово. Экран будет выглядеть следующим образом:

        $ cat search<CR>
        echo Type in the word and the file name.
        read word file
        if grep $word $file
            then echo $word is in $file
        fi
        $

Эта программа отображает вывод команды grep. Если вы хотите сохранить ответ системы на команду grep в вашей программе, то воспользуйтесь файлом /dev/null, изменив командную строку if на следующую:

	if grep $word $file > /dev/null<CR>

Теперь выполните команду search. Она ответит только сообщением, указанным после команды echo.

Конструкция if ... then ... else может исполнять альтернативный набор команд, стоящий после else, в случае, если последовательность if является ложью. Формат этой конструкции следующий:

           if<CR>
            command_1<CR>
                .
                .
                .
            last command<CR>
           .linthen<CR>
               command_1<CR>
                 .
                 .
                 .
               last command<CR>
           else<CR>
               command_1<CR>
                 .
                 .
                 .
               last command<CR>
        fi<CR>

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

        $ cat search<CR>
        echo Type in the word and the file name.
        read word file
        if
            grep $word $file > /dev/null
        then
            echo $word is in $file
        else
            echo $word is NOT in $file
        fi
        $

Команда test

Команда test используется для организации цикла. Она проверяет на истинность определенные условия и полезна для организации условных конструкций. Если условие истинно, то цикл будет продолжен. Если условие ложно, то цикл завершится и будет выполняться следующая команда. Некоторые примеры использования команды test:

test -r file<CR>
истина, если файл существует и доступен для чтения;
test -w file<CR>
истина, если файл существует и доступен для записи;
test -x file<CR>
истина, если файл существует и является выполняемым;
test -s file<CR>
истина, если файл существует и имеет как минимум один символ;
test var1 -eq var2<CR>
истина, если var1 равно var2;
test var1 -ne var2<CR>
истина, если var1 не равно var2.

Пример. Создадим shell программу, которая перемещает все исполняемые файлы из текущего справочника в ваш справочник bin. Для этого воспользуемся командой test -x для выбора исполняемых файлов. Программа mv.file будет выглядеть следующим образом:

        $ cat mv.file<CR>
        echo type in the directory path
        read path
        for file
        do
          if test -x $file
             then
                mv $file $path/$file
          fi
        done
        $

Конструкция case ... esac позволяет выбрать вам один из несколько шаблонов и затем выполнить список команд для этого шаблона. Выражение-шаблон должно начинаться с ключевого слова in, а правая круглая скобка должна быть помещена после последнего символа каждого шаблона. Последовательность команд для каждого шаблона заканчивается двумя знаками ;;. Конструкция case должна быть закончена ключевым словом esac.

Общий формат конструкции case:

        case word<CR>
        in<CR>
            pattern1)<CR>
               command line 1<CR>
                     .
                     .
                     .
               last command line<CR>
            ;;<CR>
            pattern2)<CR>
               command line 1<CR>
                     .
                     .
               last command line<CR>
            ;;<CR>
            pattern3)<CR>
               command line 1<CR>
                     .
                     .
               last command line<CR>
            ;;<CR>
            *)<CR>
               command line 1<CR>
                     .
                     .
               last command line<CR>
            ;;<CR>
        esac<CR>

Конструкция case пытается найти word с шаблоном pattern в первой секции шаблонов. Если поиск удачен, то программа выполняет командные строки после первого шаблона до соответствующих знаков ;;.

Если первый шаблон не найден, то осуществляется переход ко второму шаблону. Если любой шаблон найден, то программа не рассматривает остальные шаблоны, а переходит к команде, следующей за esac. Знак * используется как шаблон для поиска любого word и таким образом дает вам набор команд, который будет выполнен, если никакой другой шаблон не будет найден. Поэтому шаблон звездочка (*) размещается как последний шаблон в конструкции case, чтобы другие шаблоны были проверены первыми. Это поможет вам обнаружить некорректный и неожиданный ввод.

В шаблонах могут использоваться метасимволы *, ?, []. Это обеспечивает гибкость программ.

Рассмотрим пример. Программа set.term устанавливает переменную TERM в соответствии с типом терминала, который вы используете. Применяется следующая командная строка:

	TERM=terminal_name<CR>

Шаблон * стоит последним в списке шаблонов. Он выдает предупреждающее сообщение, что для указанного типа терминала нет соответствующего шаблона и позволяет вам завершить конструкцию case.

Пример.

        $ cat set.term<CR>
        echo If you have a TTY 4420 type in 4420
        echo If you have a TTY 5410 type in 5410
        echo If you have a TTY 5420 type in 5420
        read term
        case term
                in
                    4420)
                         TERM-T4
                    ;;
                    5410)
                         TERM-T5
                    ;;
                    5420)
                         TERM-T7
                    ;;
                    *)
                    echo not a correcr terminal type
                    ;;
        esac
        export TERM
        echo end of programm
        $

9.3.8. Безусловная передача управления

Команда break безусловно останавливает выполнение любого цикла, в котором он встречается и передает управление команде, следующей после ключевых слов done, fi или esac.

В предыдущем примере программы set.term вы можете использовать команду break, вместо echo, чтобы выйти из программы, как приведено в следующем примере:

Пример.

        $ cat set.term<CR>
        echo If you have a TTY 4420 type in 4420
        echo If you have a TTY 5410 type in 5410
        echo If you have a TTY 5420 type in 5420
        read term
        case term
                in
                    4420)
                         TERM-T4
                    ;;
                    5410)
                         TERM-T5
                    ;;
                    5420)
                         TERM-T7
                    ;;
                    *)
                    break
                    ;;
        esac
        export TERM
        echo end of programm
        $

Команда continue приведет к тому, что программа немедленно перейдет к следующей итерации цикла while или for без выполнения остальных команд в цикле.

9.4. Отладка программы

Для нахождения и корректировки ошибок вам могут понадобиться две опции команды sh:

sh -v shellprogramname
печатает вводимые shell строки, как если бы они были прочитаны системой;
sh -x shellprogramname
печатает команды и их аргументы по мере их выполнения.

Для примера создадим shell программу, которая содержит ошибку:

        $ cat bug<CR>
        today=`date`
        echo enter person
        read person
        mail $1
        $person
        When you log off once into my office olease.
        $today
        MLH
        $

Обратите внимание, что today равно выводу команды date, которая заключена между знаками слабого ударения.

При выполнении программы bug, чтобы завершить программу, вы должны нажать клавишу BREAK или DELETE.

Чтобы отладить эту программу, попытайтесь выполнить ее с использованием sh -v. Будут напечатаны строки файла, как если бы они были прочитаны системой:

        $ sh -v  bug tom<CR>
        today=`date`
        echo enter person
        enter person
        read person
        tom
        mail $1

Обратите внимание, что вывод остановился на команде mail, т.к. здесь обнаружена ошибка. Вы должны использовать here document, чтобы перенаправить ввод в mail.

Откорректированная программа bug будет выглядеть следующим образом:

        $ cat bug<CR>
        today=`date`
        echo enter person
        read person
        mail $1 <<!
        $person
        When you log off once into my office olease.
        $today
        MLH
        !
        $

Команда tee полезна при отладке конвейеров. В то время как стандартный ввод команда направляет в стандартный вывод, она сохраняет копию этого ввода в файл, имя которого дано как аргумент.

Общий формат команды tee:

	command1 | tee saverfile | command2<CR>

где saverfile - это файл, который сохраняет вывод команды для анализа.

Предположим, вы хотите проверить вывод команды grep в следующей командной строке:

	who | grep $1 | cut -c1-9<CR>

Вы можете воспользоваться командой tee, чтобы скопировать вывод команды grep в файл check не разрушая остальной конвейер:

	who | grep $1 | tee check | cut -c1-9<CR>

Файл check содержит копию вывода grep, как показано на следующем экране:

        $ who | grep mike | tee check | cut -c1-9<CR>
        mike
        $ cat check
        mike   tty61  Apr 10  10:30
        $

9.4.1. Модификация окружения

Система UNIX позволяет вам модифицировать конфигурацию, определяемую при вашей регистрации.

Когда вы регистрируетесь в системе, shell вначале проверяет файл .profile в вашем регистрационном справочнике. Этот файл содержит команды, которые управляют вашей конфигурацией. Этот файл может быть изменен в соответствии с вашими потребностями. Чтобы проверить, существует ли в вашем собственном справочнике файл .profile, введите:

	ls -al $HOME 

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

	cp .profile safe.profile<CR>

9.4.2. Добавление команд в файл .profile

Отредактируем файл и добавим следующую команду echo последней строкой в файл:

	echo Good Morning! I am ready to work for you.

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

	. .profile<CR>

Система ответит:

         Good Morning! I am ready to work for you.
         $

9.4.3. Установка характеристик терминала

Команда stty может сделать вашу конфигурацию более удобной. Вы можете воспользоваться этой командой с опциями -tabs и echoe.

stty -tabs -
эта опция сохраняет символы табуляции при печати. Она устанавливает табуляцию более, чем на 8 пробелов (это значение установлено по умолчанию). Количество пробелов для каждой табуляции может быть разным;
stty echoe -
эта опция стирает символы с экрана аналогично тому, как это делаете с помощью BACKSPACE.

Вы можете включить эти команды stty в файл .profile. Если вы воспользуетесь командой tail, которая отображает несколько последних строк файла, то вы можете увидеть результат добавления этих трех командных строк в файл .profile:

        $ tail -3 .profile<CR>
        echo Good Morning! I am ready to work for you.
        stty -tabs
        stty echoe
        $

9.5. Использование shell переменных

Несколько переменных, зарезервированных shell, используются в файле .profile.

Рассмотрим 4 основные переменные:

HOME -
эта переменная дает имя пути вашего регистрационного справочника. С помощью команды cd перейдите в него и введите:
	pwd<CR>

Теперь введите:

	echo $HOME<CR>
$HOME -
это аргумент, используемый командой cd. Если вы не указывали справочник, то cd переместит вас в $HOME;
PATH -
эта переменная дает путь поиска для обнаружения и выполнения команд. Чтобы посмотреть текущее значение переменной PATH, введите:
	echo $PATH<CR>

Система распечатает текущее значение PATH:

        $ echo $PATH<CR>
        :/mylogin/bin:/bin:/usr/bin
        $

Двоеточие (:) является разделителем между именами путей в строке, присваиваемой переменной $PATH. Если перед двоеточием ничего не указано, то подразумевается текущий справочник.

Если вы хотите установить специальный справочник для shell программ с именем :/project/bin, добавьте его следующим образом:

	PATH="$PATH:/project/bin"<CR>
TERM -
эта переменная сообщает shell тип терминала. Чтобы присвоить этой переменной значение, вы должны выполнить 3 команды в следующем порядке:
        TERM=terminal_name<CR>
        export TERM<CR>
        tput init 

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

Если вы хотите, чтобы эти команды выполнялись автоматически при каждой вашей регистрации, то включите их в файл .profile;

PS1 -
эта переменная устанавливает первичную подсказку shell (по умолчанию это знак $). Изменить подсказку вы можете, изменив значение переменной PS1 в файле .profile.

10. awk - язык сканирования и обработки текста

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

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

10.1. Основные сведения об awk

В этом подразделе приводится информация, достаточная для написания вами программ и их запуска.

10.1.1. Структура программы

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

Структура awk:

        шаблон {действие}
        шаблон {действие}

Пример.

	$ -"address" {print $2, $3}

В этом примере приведена типичная программа awk, состоящая из одного выражения шаблон-действие. Программа печатает второе и третье поля каждой вводной строки, в которой первое поле является "address".

Любой шаблон или действие в выражении шаблон-действие может быть опущен. Отсутствие части "действие" означает печать соответствующих шаблону строк. Отсутствие шаблона означает, что действие выполняется над каждой строкой.

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

awk 'шаблон-действие' [список вводных файлов] чтобы выполнить шаблон-действие в перечисленных вводных файлах. Например,

	awk '{print $2, $3}' файл1 файл2

Обратите внимание, что выражение шаблон-действие заключено в одиночные кавычки. Это защищает символы типа $ от интерпретации командным языком shell и позволяет также программе обрабатывать более одной строки.

Если файлы не указаны в командной строке, awk читает из стандартного файла ввода. Стандартный файл ввода вы можете также указать с помощью "-". Например:

	awk '{print $3, $4}' файл1 -

awk читает сначала из файл1 и затем из стандартного файла ввода. Если программа является большой по объему, то удобнее использовать следующий формат:

	awk -f программа [список вводных файлов]

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

	awk -f myprogram file1

10.1.2. Поля

Обычно awk считывает одну строку или запись за один раз. Записью является последовательность символов, заканчивающаяся символом "новая строка". Затем awk разделяет каждую запись на поля. Поле не может быть пустой строкой и символом табуляции.

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

        USSR        8650     262     Asia
        Canada      3852     24      North America
        China       3692     866     Asia
        USA         3615     219     North America
        Brazil      3286     116     South America
        Australia   2968     14      Australia
        India       1269     637     Asia
        Argentina   1072     26      South America
        Sudan       968      19      Africa
        Algeria     920      18      Africa

Этот файл данных удобен для обработки - смесь слов и цифр, разделенных на поля символами "пробел" и "табуляция".

Число полей в записи определяется полем разделителем. Поля обычно разделяются последовательностью пробелов и/или табуляцией, так что первая запись countries будет иметь 4 поля, вторая - 5 и т.д. Возможно установить разделитель поля точно на символ табуляции, так что каждая строка будет иметь 4 поля, и можно искать значение данных.

При описании по умолчанию будем использовать: поля разделяются табуляцией или пробелами; первое поле в строке обозначается $1, второе - $2 и т.д. Вводная запись обозначается $0.

10.1.3. Печать

Если шаблон в выражении шаблон-действие опущен, действие выполняется для всех вводных строк. Простейшим действием является печать каждой строки, вы можете выполнить это с помощью программы awk, состоящей из одного выражения print:

	{print}

так что командная строка:

	awk '{print}' countries 

печатает каждую строку файла countries, направляя вывод в стандартный файл вывода. Действие print может также использоваться для распечатки частей записи. Например:

	{print $1, $3}

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

Примечание. В этом разделе будут показаны текст программы awk, без командной строки. Каждую программу можно запустить, либо заключив ее в кавычки как первый аргумент команды awk, либо поместив ее в файл и вызвать awk с флагом -f.

10.2. Печать форматированного файла

Для вывода форматированного файла awk обеспечивает Си-подобное выражение printf:

	printf format, expr1, expr2, ..., exprn 

которое печатает expr в соответствии со спецификацией в строке format. Например, программа awk:

	{print "%10s %6d\n", &1, $3}

печатает первое поле ($1) как строку из 10 символов, затем пробел, третье поле ($3) как десятичное число в шестисимвольном поле, затем новая строка (\n).

Если в качестве вводного взять файл countries, то программа напечатает следующую таблицу:

             USSR      262
           Canada      24
            China      866
              USA      219
           Brazil      116
        Australia      14
            India      637
        Argentina      26
            Sudan      19
          Algeria      18

printf не проставляет автоматически в выводном файле разделителей. Вы должны создать их сами, указав "\n" в формате спецификации.

10.3. Простые шаблоны

Вы можете выбрать определенные записи для печати или другой обработки с использованием простых шаблонов. awk имеет три вида шаблонов. Первое - это шаблоны, называемые выражениями отношений, которые проводят сравнения. Например, оператор "==" тестирует на равенство. Чтобы напечатать строки, для которых 4-е поле равно строке "Asia", можно использовать программу, состоящую из одного шаблона:

	$4 == "Asia"

Если в качестве вводного файла взять countries, то получим:

        USSR    8650    262     Asia
        China   3692    866     Asia
        India   1269    637     Asia

Для сравнения используются: >, >=, <, <=, ==, != (не равно). Сравниваться могут числа и строки. Например, из нашего файла мы хотим распечатать только страны, население которых более 100 млн. Для этого введем:

	$3 > 100

Получим печать всех строк, в которых третье поле более 100.

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

	/US/

Эта программа печатает каждую строку, которая содержит буквы US. Если в качестве вводного файла взять countries, то получим:

        USSR    8650    262     Asia
        USA     3615    219     North America

Третье - специальные шаблоны BEGIN и END могут использоваться для получения управления пред считыванием первой входной строки и после считывания последней. BEGIN должен быть первым шаблоном, а END - последним. Эта программа использует BEGIN для печати заголовка:

        BEGIN   {print "Countries of Asia:"}
        /Asia/  {print "          ", $1}

На выходе получим:

	Countries of Asia:
                USSR
                China
                India 

10.4. Простые действия

В этом подразделе описаны встроенные и определенные пользователем переменные и функции простых действий.

10.4.1. Встроенные переменные

Кроме чтения вводного файла и разбиения на поля, awk считает число считанных записей и число полей внутри текущей записи. Вы можете использовать эти счетчики в программе awk. Переменная NR - это номер текущей записи, NF - число полей в записи. Так программа:

	{print NR, NF}

печатает номер каждой строки и число полей в этой записи. А программа:

	{print NR, $0}

печатает каждую запись с соотвествующим номером в начале.

10.4.2. Определенные пользователем переменные

awk позволяет определять пользователям собственные переменные, которые можно использовать для хранения данных, выполнения арифметических действий. Для иллюстрации, подсчитаем общее количество населения и среднее значение из файла countries:

        {sum = sum + $3}
        END {print "Общее количество населения", sum, "млн"
            {print "Среднее количество населения", NR,
            "стран", sum/NR}

Первым действием является накопление значений из третьего поля каждой строки; второе действие, выполняемое после последнего ввода, - напечатать сумму и среднее значение:

      Общее количество населения       2201 млн
      Среднее количество населения
            10 стран                   220.1

10.4.2.1. Функции

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

10.5. Примеры некоторых полезных программ

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

Напечатать последнее поле каждой вводной строки:

	{print $NF}

Напечатать 10-ю вводную строку:

	NF == 10

Напечатать последнюю вводную строку:

	{line = $0}
	END {print line}

Напечатать строки, которые не имеют 4-го поля:

	NF != 4 {print $0, "не имеют 4-го поля" }

Напечатать вводные строки, которые имеют более 4-х полей:

	NF > 4

Напечатать последние поля вводных строк, начиная с 5-го:

	$NF > 4

Напечатать общее число вводных строк:

	END {print NR}

Напечатать обшее число полей:

        {nf = nf+NF}
    END {print nf}

Напечатать общее число символов вводного файла:

        {nc = nc + length($0)}
    END {print nc + NR}

Напечатать общее число строк, которые содержат строку "Asia":

       /Asia/   {nlines++}
    END {print nlines}

(nlines++ имеет тот же эффект, что и nlines = nlines+1).

10.6. Сообщения об ошибках

Если вы сделаете ошибку в программе awk, то получите сообщение об ошибке. Например, если вы попытаетесь запустить программу:

	$3 < 200 { print ($1}

то получите сообщение об ошибке:

        awk: syntax error at source line 1
        contex is
             $3 < 200 {print >>>$1}<<<
        awk: illegal statement at source line 1
             1 extra (

Некоторые ошибки могут быть обнаружены во время работы программы. Например, если вы попытаетесь поделить на 0 (ноль), то awk остановит обработку и распечатает номер записи вводного файла (NR) и номер строки в программе.

10.7. Шаблоны

В выражении шаблон-действие, шаблон служит для выбора записей, для которых выполняется соответствующее действие.

10.7.1. Шаблоны BEGIN и END

BEGIN используется для получения управления перед считыванием первой вводной строки, так что любое действие для шаблона BEGIN выполняется один раз до того, как команда awk начинает считывать первую запись. END используется для получения управления после считывания последней вводной строки.

Следующая awk-программа использует BEGIN для установки в качестве разделителя символа табуляции (\t) и создания заголовков в выводном файле. Поле-разделитель хранится во встроенной переменной FS. Хотя FS может быть восстановлено в любом месте, благоразумнее поместить в секции BEGIN, до того как вводной файл начнет считываться. Второй printf в программе выполняется для каждой вводной строки и формирует выводной файл в виде таблицы, где вся информация располагается по колонкам с заголовками. END печатает результат. (Обратите внимание, что длинная строка может быть продолжена на другой строке после запятой).

       BEGIN { FS = "\t"
                printf "%10s %6s %5s   %s\n",
                "COUNTRY", "AREA", "POP", "CONTINENT" }
                printf "%10s %6s %5s   %s\n", $1, $2, $3, $4
                area = area + $2; pop = pop + $3}
       END {printf "\n%10s %6d  %5d\n", "TOTAL", area, pop }

Если в качестве вводного взять файл countries, то получим следующий результат:

          COUNTRY   AREA     POP     CONTINENT
             USSR   8650     262     Asia
           Canada   3852      24     North America
            China   3692     866     Asia
              USA   3615     219     North America
           Brazil   3286     116     South America
        Australia   2968      14     Australia
            India   1269     637     Asia
        Argentina   1072      26     South America
            Sudan    968      19     Africa
          Algeria    920      18     Africa

            TOTAL  30292    2201

10.8. Выражения отношения

В качестве шаблона может использоваться любое выражение, вызывающее сравнение между строками символов или цифр. awk имеет 6 операторов сравнения и два регулярных выражения ~ и !~. В табл. 21 перечислены все операторы и их значение.

Таблица 21
Значения операторов

Оператор Значение
< Меньше чем
<= Меньше или равно
== Равно
!= Не равно
>= Больше или равно
> Больше чем
~ Входит
!~ Не входит

При сравнении, если оба операнда являются цифровыми, то проводится цифровое сравнение; в противном случае - строчное. Например, шаблон:

	$3 > 100

выбирает строки в которых третье поле больше 100, а программа:

	$1 >= "S"

выбирает строки, которые начинаются с буквы S по букву Z:

        USSR    8650    262     Asia
        USA     3615    219     North America
        SUDAN    986     19     Africa

При отсутствии любой другой информации awk трактует поля как строки, так что программа:

	$1 == $4

сравнивает 1-е и 4-е поля как строки символов и для файла countries получим следующий результат:

	Australia 2968 14 Australia 

10.9. Регулярные выражения

awk обеспечивает более мощные шаблоны для поиска строки символов, чем сравнение. Такие шаблоны называются регулярными выражениями. Простейшим регулярным выражением является строка символов, обрамленная знаками "/". Например:

	/Asia/

Эта программа печатает все записи, которые содержат подстроку Asia (запись, содержащая Asia как часть длинной строки, подобной Asian или Pan-Asiatic, также печатается).

Чтобы ограничить поиск только для специального поля, вы можете использовать операторы ~(входит) и !~(не входит). Программа:

	$4 ~ /Asia/ { print $1 }

печатает первое поле всех тех строк, в которых четвертое поле - Asia, в то время как программа:

	$4 !~ /Asia/ { print $1 }

печатает первое поле всех тех строк, в которых четвертое поле - не Asia.

В регулярном выражении могут использоваться метасимволы:

	\, ^, $, ., [, ], *, ?, (, ), |

которые подобны метасимволам, используемым в shell. Например, метасимволы "^" и "$" осуществляют поиск соответственно начала и конца строки, а метасимвол "." ищет одиночный символ. Например:

	/^.$/

просматривает все записи для поиска записи, состоящей из одного символа.

Если группа символов заключена в квадратные скобки, то это означает поиск одного символа из этой группы. Например, /[ABC]/ - осуществляет поиск либо символа "A", либо "B", либо "C". Границы букв или цифр могут быть обозначены внутри квадратных скобок:

	/[a-zA-Z]/

Если первым символом после "[" является символ "^", то это означает: любой символ, не входящий в набор. Например:

	/[^a-zA-Z]/

означает поиск любого символа, кроме буквы.

Символ "+" означает "один или больше". Например, программа:

	$2 !~ /^[0-9]+$/

печатает все записи, в которых второе поле не является строкой из одной или более цифр. (^ - начало строки, [0-9]+ - одна или более цифр, $ -конец строки).

Круглые скобки используются для группирования символов, а символ | для указания альтернативы. Программа:

	/(apple|cherry) (pie|tart)/

осуществляет поиск строк, содержащих одну из 4-х подстрок:

        apple pie
        apple tart
        cherry pie
        cherry tart 

Чтобы отменить специальное значение метасимвола, поставьте знак "\" перед ним. Например:

	/b\$/

печатает все строки, содержащие символ "b" и следующий за ним знак "$".

В дополнение к распознаваемым метасимволам, awk распознает следующие последовательности языка программирования Си внутри регулярных выражений и строк:
\b - возврат
\f - перевод формата
\n - новая строка
\r - возврат каретки
\t - табуляция
\ddd - восьмиричное значение
\" - кавычки
\c - с

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

	/\t/

awk интерпретирует любую строку или переменную справа от символа "~" или "!~" как регулярное выражение. Например, мы можем записать программу:

	$2 !~ /^[0-9]+$/

как

      BEGIN { digits = "^[0-9]+&" }
         $2 !~ digits 

Предположим, что нужно найти строку символов, подобную ^[0-9]+$. Если строка "^[0-9]+$" используется как регулярное выражение, появляются дополнительные знаки "\", которые защищают регулярное выражение. Это связано с тем, что первый уровень знаков "\" удаляется при синтаксическом анализе строки. Первый уровень "\" перед символом возвращает его специальное значение в регулярном выражении, второй нужен, чтобы защитить его в строке.

Например, нужно найти строки, содержащие "b" и следующий за ним знак "$". Регулярное выражение для этого шаблона:

	b\$

Чтобы создать строку для представления этого регулярного выражения, необходимо добавить еще один символ "\":

	"b\\$"

Следующие регулярные выражения попарно эквивалентны:

        x ~ "b\\$"      x ~ /b\$/
        x ~ "b\$"       x ~ /b$/
        x ~ "b$"        x ~ /b$/
        x ~ "\\t"       x ~ /\t/

Регулярные выражения и подстроки, поиск которых они осуществляют, приведены в табл. 22.

Унарные операции *, +, ? имеют наивысший приоритет, затем конкатенация и затем альтернативный выбор |.

Таблица 22
Регулярные выражения

Выражение Действие
с Любой, отличный от "с" мета-символ
Символ "с"
^ Начало строки
$ Конец строки
. Любой символ, кроме новой строки
[s] Любой символ из набора "s"
[^s] Любой символ, не входящий в набор "s"
r* Ноль или больше
r+ Один или больше
r? Ноль или один
(r) r
r1r2 Соединить r1 и r2
r1|r2 r1 или r2

10.10. Комбинация шаблонов

Составной шаблон комбирирует простые шаблоны с логическими операторами "||" (или), "&&" (и), !(отрицание). Например, нужно напечатать все страны в "Asia" с населением более 500 млн. Следующая программа выполняет выбор всех строк, у которых 4-е поле "Asia" и третье поле превышает 500:

	$4 == "Asia" && $3 > 500

Программа:

	$4 == "Asia" || $4 == "Africa"

выбирает строки с названиями "Asia" или "Africa" в 4-м поле. Эти же действия можно выполнить с помощью регулярного выражения и альтернативного оператора "|":

	$4 ~ /^(Asia|Africa)$/

Оператор отрицания "!" имеет более высокий проиритет, чем "&&" и "||". Операторы "&&" и "||" вычисляются слева направо. Вычисление останавливается как только истина или ложь будут достигнуты.

10.11. Область шаблона

Область шаблона состоит из двух шаблонов, разделенных запятой:

	pat1, pat2 {...}

В этом случае действие выполняется для каждой строки, расположенной между pat1 и pat2 (включительно). Например, шаблон:

	/Canada/, /Brazil/

ищет строки со словом "Canada" до строки со словом "Brazil"

        Canada      3852     24      North America
        China       3692     866     Asia
        USA         3615     219     North America
        Brazil      3286     116     South America

Также, если FNR - число текущих записей в текущем вводном файле, FILENAME - имя текущего вводного файла, то программа:

	FNR == 1, FNR == 5 {print FILENAME, $0}

печатает первые 5 записей каждого вводного файла с именем FILENAME.

10.12. Действие

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

Встроенные переменные

В табл. 23 приведены встроенные переменные, которые поддерживает awk.

Таблица 23
Встроенные переменные

Переменная Значение Умолчание
ARGC Число аргументов команд ной строки -
ARGV Массив аргументовной строки командной строки -
FILENAME Имя текущего вводного файла -
FNR Номер записи в текущем файле -
FS Поле разделителя вводного файла пробел и/или табуляция
FN Число полей в текущей записи -
NR Число считанных на данный момент записей -
OFMT Выводной формат для цифр %.6g
OFS Разделитель поля выводного файла пробел
ORS Разделитель записи выводного поля символ новой строки
RS Разделитель записи вводного файла то же
RSTART Индекс первого выбранного символа при помощи match() -
RLENGTH Длина строки, выбранной при помощи match() -
SUBSEP Нижний разделитель "\034"

10.12.1. Арифметические действия

В качестве действия могут использоваться уловные арифметические выражения, чтобы вычислить числовые значения. В качестве простого примера предположим, что нужно напечатать плотность населения для каждой страны в файле countries. Так как второе поле - это площадь в тысячах квадратных километров, а третье поле - это население в миллионах, то выражение:

	100 * $3 / $2

дает плотность населения на 1 квадратный километр.

Программа:

      {print "%10s %6.1f\n", $1,
        1000 *$3 / $2}

печатает название страны и плотность населения:

             USSR    30.3
           Canada     6.2
            China   234.6
              USA    60.6
           Brazil    35.3
        Australia     4.7
            India   502.0
        Argentina    24.3
            Sudan    19.6
          Algeria    19.6

Арифметические действия выполняются с плавающей точкой. Арифметическими операторами являются:

	+, -, *, /, %, ^

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

	v = e 

где v - переменная или имя поля;
e - выражение.

Например, чтобы вычислить число стран континента "Asia" и общее количество населения, вы должны написать:

        $4 == "Asia"  { pop = pop = $3; n = n + 1 }
        END           { print "population of", n,
              "Asian countries in million is", pop }

Относительно файла countries эта программа выдает результат:

        population of 3 Asian countries in
        million is 1765

Действие, связанное с шаблоном $4 == "Asia" выполняет 2 назначения, одно - накопление населения и другое - подсчет стран.

Назначения в предыдущей программе могут быть записаны более сжато с использованием операторов "+=" и "++":

	$4 == "Asia" {pop += $3; ++n}

Оператор "+=" заимствован из языка программирования Си, следовательно:

	pop += $3

аналогично:

	pop = pop + $3

но оператор "+=" короче и работает быстрее.

Операторами назначения являются:

	+=, -=, *=, /=, %=, ^=

Операторами приращения являются "++" и "--". Как и в языке Си они могут использоваться как префиксные (++x) или постфиксные (x++) операторы. Если x равно 1, то "i = ++x" увеличивает x, затем устанавливает i равным 2, в то время как "i = x++" устанавливает i равным 1, затем увеличивает x. Аналогичная интерпретация для префиксного и постфиксного операторов "--".

Операторы присвоения, увеличения и уменьшения могут использоваться в арифметических выражениях.

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

        maxpop < $3 { maxpop = $3; country = $1 }
        END         { print country, maxpop }

Обратите внимание, что эта программа будет некорректна, если значение $3 будет отрицательным.

В табл. 24 перечислены встроенные арифметические функции.

Таблица 24
Встроенные арифметические функции

Функция Возвращаемое значение
atan2(y,x) Арктангенс y/x в пределах от "-пи" до "пи"
cos(x) Косинус x
exp(x) Экспоненциальная функция x
int(x) Целая часть x с усеченными лидирующими нулями
log(x) Натуральный логарифм x
rang() Случайное число между 0 и 1
sin(x) Синус x
sqrt(x) Квадрат x
srand(x) x - новое начальное значение для rand()

Функция rand() возвращает псевдослучайное число с плавающей точкой в диапазоне от 0 до 1, а srand(x) может быть использовано для установки нового начального значения генерирующей программы. Если srand() не имеет аргументов, то начальное значение производится из времени дня.

10.13. Строки и строковые функции

Строка констант - это последовательность символов, заключенная в двойные кавычки, как например, "abc", "hello, everyone".Строкаконстант может содержать последовательности escape языка программирования Си для специальных символов.

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

Программа:

	{ print NR ":" $0 }

печатает перед каждой записью ее номер и двоеточие без пробела. Три строки: номер записи, двоеточие и запись сливаются и результирующая строка печатается.

В табл. 25 приведены встроенные строковые функции, поддерживаемые awk. В этой таблице r представляет собой регулярное выражение (либо как строка, либо как /r/), s и t - строковые выражения, n и p - целые числа.

Таблица 25
Встроенные строковые функции awk

Функция Описание
gsub(r, s) Глобальная замена s на r в текущей записи; возвращает количество земененых символов
gsub(r,s, t) Глобальная замена s на r в строке t, возвращает количество замененных символов
index(s,t) Возвращает позицию t в s: 0 - если t нет в s
length(s) Возвращает длину s
matgch(s,r) Возвращает позицию s, в которой встречается r; 0 - если r не встретилось
split(s,a) Разделяет s на массив a по FS; возвращает число полей
split(s,a,r) Разделяет s на массив a по r; возвращает число полей
sprintf(fmt,expr-list) Возвращает expr-list, отформатированный в соответствии с форматом строки fmt
sub(r,s) Замещает s на первое r в текущей записи, возвращает количество замен
sub(r,s,t) Заменяет s на первое r в строке t, возвращает количество замен
substr(s,p) Возвращает индекс s, начиная с позиции p
substr(s,p,n) Возвращает подсказку s длиной n, начиная с позиции p

Функции sub и gsub сформированы после команды замены в текстовом радакторе ed. Функция gsub(r,s,t) заменяет успешное появление подстрок, найденных при помощи регулярного выражения r с заменой строки s в целевой строке t. Функция gsub(r,s) является синонимом gsub(r,s,$0). Например, программа:

	{ gsub(/USA/, "United States"); print }

преобразует ввод, меняя появление "USA" на "Unites States". Функция sub подобна ей, за исключением того, что она заменяет первую найденную подстроку в целевой строке.

Функция index(s,t) возвращает левую крайнюю позицию, с которой строка t начинается в s. Первый символ в строке начинается с позиции 1. Например,

	index("banana", "an")

возвращает 2.

Функция length возвращает число символов в строке; так:

	{ print length($0), $0 }

печатает каждую запись, а перед ней ее длину. ($0 не включает в вводную запись разделитель). Программа:

        length($1) > max { max = length($1); name = $1 }
        END              { print name }

применительно к файлу countries распечатывает наибольшее имя страны:

	Australia 

Функция match(s,r) возвращает позицию в строке s, в которой появилось регулярное выражение r, либо 0, если оно не найдено. Эта функция также устанавливает две встроенные переменные RSTART и RLENGTH. RSTART принимает значение начальной позиции, найденной в строке, это значение равно возвращаемому значению. RLENGTH принимает значение длины найденной строки. (Если строка не найдена, то RSTART равно 0, а RLENGTH равно -1). Например, следующая программа ищет появление буквы i и за ней сразу или через один символ следует буква a:

           { if (match($0, /i.?a/))
                { print RSTART, RLENGTH, $0 }

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

        17 2 USSR 8650     262     Asia
        26 3 Canada         3852     24      North America
        3 3 China 3692     866     Asia
        24 3 USA  3615     219     North America
        27 3 Brazil         3286     116     South America
        8 2 Australia       2968     14      Australia
        4 2 India 1269     637     Asia
        7 3 Argentina       1072     26      South America
        17 3 Sudan          968      19      Africa
        6 2 Algeria         920      18      Africa

Функция sprintf(format, expr1, expr2, ..., exprn) возвращает (без печати) строку, содержащую expr1, expr2, ..., exprn, отформатированную в соответствии со спецификацией printf в строке format. Выражение:

	x = sprintf("%10s %6d", $1, $2)

присваивает x строку, полученную при форматировании $1 и $2 как 10-символьных строк и десятичное число в поле шириной как минимум 6 знаков.

Функция substr(s,p,n) возвращает подстроку s, которая начинается с позиции p и имеет длину не менее n символов. Если используется функция substr(s,p), то подстрока направляется в конец s, так что она состоит из индекса s, начинающегося с позиции p. Например, мы можем сократить имена стран в файле countries до трех символов, вызвав программу:

	{ $1 = substr($1, 1, 3); print }

В итоге получим:

        USS 8650 262 Asia
        Can 3852 24 North America
        Chi 3692 866 Asia
        USA 3615 219 North America
        Bra 3286 116 South America
        Aus 2968 14 Australia
        Ind 1269 637 Asia
        Arg 1072 26 South America
        Sud 968 19 Africa
        Alg 920 18 Africa

Обратите внимание, что установка $1 в программе приводит к тому, что awk заново вычисляет $0 и, кроме того, поля разделяются пробелами (значение по умолчанию для OFS), но не табуляцией.

Чтобы слить строки, надо просто записать их одна за другой. Например, для файла countries:

        { s = s substr($1, 1, 3) " " }
        END { print s }

печатает:

        USS Can Chi USA Bra Aus Ind Arg Sud Alg

10.14. Поле переменных

Поля текущей записи могут ссылаться на поле переменных $1, $2, ... $NF. Эти переменные могут использоваться в арифметических или строковых операциях, им могут присваиваться различные значения. Например, вы можете разделить второе поле файла countries на 1000, чтобы площадь измерялясь не в тысячах, а в миллионах квадратных метров:

	{ $2 /= 1000; print }

или назначить новую строку полю:

        BEGIN                  { FS = OFS = "\t" }
        $4 == "North America"  { $4 = "NA" }
        $4 == "South America"  { $4 = "SA" }
                               { print }

Действие BEGIN устанавливает поле разделителя вводного файла (FS) и поле разделителя выводного файла (OFS) в значение табуляции. Обратите внимание, что print в четвертой строке программы печатает значение $0 после того как оно было модифицировано предыдущими присвоениями.

К полям можно получить доступ при помощи выражений. Например,

	$(NF-1)

означает: со второго до последнего поля текущей записи. Здесь необходимы круглые скобки, т.к. значение $NF-1 означает: на единицу меньше, чем значение последнего поля.

Поле переменных, ссылающееся на несуществующее поле, например, $(NF+1), имеет в качестве своего начального значения пустую строку. Тем не менее новое поле может быть создано при присвоении ему значения. Например, следующая программа, вызвавшая файл countries, создает пять полей, дающих плотность населения:

        BEGIN   { FS = OFS = "\t" }
                { $5 = 1000*$3/$2; print }

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

10.15. Номер или строка

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

	pop += $3

pop и $3 должны трактоваться как цифровые.

В контексте строки, подобной:

	print $1 ":" $2

строки $1 и $2 сливаются.

В операторах присвоения "v = e" или "op = e" тип "v" станет таким же, как и у "e". В двухсмысленном контексте:

	$1 == $2

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

Если два операнда являются цифровыми, то сравнение будет цифровым, если операнды являются строковыми, то сравнение - строковое. Все поля переменных имеют строковый тип; дополнительно каждое поле, которое содержит только цифры, имеет цифровой тип. Например, сравнение "$1 == $" успешно выполнится для любой части ввода:

	1 1.0 +1 0.1e+1 10E-1 001

но неуспешно для:

        (ноль)  0
        (ноль)  0.0
        0a      0
        1e50    1.0e50

Существуют две идиомы приведения выражения к одному или другому типу:

number"" -
присоединяет нулевую строку к number для приведения к строковому типу;
string+0 -
добавляет ноль к string для приведения к цифровому типу.

Чтобы выполнить строковое сравнение между двумя полями, используйте:

	$1 "" == $2 ""

Так значение: "12.34x" равно 12.34, а значение "x12.34" равно нулю.

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

Неустановленные переменные имеют цифровое значение 0 (ноль) и строковое значение "".

Несуществующие поля имеют только строковое значение ""; они не являются цифровыми.

10.16. Операторы управления потоком

awk поддерживает операторы if-else, while, do-while аналогично языку программирования Си.

Синтаксис оператора if:

	if (выражение) оператор_1 else оператор_2

"выражение" является условным и не имеет ограничений. Оно может включать операторы отношений:

	<, <=, >, >=, ==, !=

регулярные выражения:

	~, !~

логические операторы:

	||, &&, !

операторы слияния и круглые скобки для группирования.

В операторе if awk сначала вычисляет "выражение". Если оно не ноль и не пустое, то оператор_1 выполняется, в противном случае выполняется оператор_2. Часть else не является обязательной.

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

Возьмем файл countries и вычислим максимальное население с помощью оператора if:

       {   if (maxpop < $3) {
                  maxpop = $3
                  country = $1
            }
        }
        END { print country, maxpop }

Синтаксис оператора while:

	while (выражение) оператор 

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

        {  i = 1
           while ( i <= NF ) {
               print $i
               i++
           }
        }

Синтаксис оператора for:

	for(выражение_1; выражение; выражение_2) оператор 

Он аналогичен следующей последовательности:

        выражение_1
        while ( выражение) {
              оператор
              выражение_2
        }

Синтаксис оператора do:

	do оператор while (выражение)

Оператор выполняется до тех пор, пока "выражение" не станет равным нулю. Тестирование проводится после выполнения "оператора", т.е. в конце цикла. Как правило оператор do используется реже, чем while или for.

Оператор break приводит к немедленному выходу из while или for; чтобы продолжить оператор, надо начать новую итерацию.

Следующий оператор заставит awk перейти к новой записи и начать поиск шаблона, начиная с первого оператора "шаблон-действие".

Оператор exit завершает программу; ввод больше не считывается и действие END выполняется, если оно есть в программе.

	exit expr 

приводит к тому, что программа возвращает значение "expr" как состояние выхода. Если "expr" в строке нет, то состояние exit равно нулю.

10.17. Массивы

awk поддерживает одномерные массивы. Массивы и элементы массивов нет необходимости объявлять. Индексы массива могут быть числом или строкой. Пример условного обозначения числового индекса:

	x[NR] = $0

присваивает текущую строку вводного файла элементу NR массива x.

Фактически возможно считать целый вводной файл в массив с помощью программы awk:

              { x[NR] = $0 }
        END   { ... обработка ...}

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

Элементы массива могут именоваться с помощью нецифровых величин. Например, следующая программа накапливает общее количество населения Asia и Africa в соответветствующий массив pop. Оператор END печатает общее количество населения этих двух континентов.

        /Asia/          { pop["Asia"] += $3 }
        /Africa/        { pop["Africa"] += $3 }
 END {     print "Asian population in million is", pop[Asia]
       print "African population in million is", pop[Africa]
     }

Результат получим следующий:

      Asian population in million is   1765
      African population in million is   37

В этой программе, если вы воспользуетесь pop[Asia] вместо pop["Asia"], то выражение будет использовать значение переменной как индекса, и так как значение переменной не установлено, то количество населения будет накапливаться в pop[""].

Предположим, нужно определить общую площадь каждого континента из файла countries.

Каждое выражение может быть использовано как индекс при ссылке в массиве. Так:

	area[ $4 ] += $2

использует строку в 4-м поле текущей записи вводного файла для индексирования массива area, накапливая значение второго поля:

        BEGIN  { FS = "\t" }
               { area[$4] += $2 }
        END    { for (name in area)
                     print name, area[name] }

Относительно файла countries получим результат:

          Asia  13611
          North America 7467
          South America 4358
          Australia 2968
          Africa 1888

Эта программа использует следующую форму оператора, который организует итерации для нахождения индекса в массиве:

	for ( i in array ) оператор 

выполняется "оператор" с переменной i , для которой определен array[i]. Цикл выполняется для каждого определенного индекса, который выбирается в произвольном порядке.

awk не поддерживает многомерные массивы, но допускает список индексов. Они объединяются в один индекс значениями, разделенными строкой (хранимой в переменной SUBSEP).

Например:

          for ( i = 1; i <= 10; i++ )
               for ( j = 1; j <= 10; j++ )
                    arr[i, j] = ...

создает массив, который ведет себя как двумерный массив. Индексом является сочетание i, SUBSEP и j.

Вы можете определить, появляется ли конкретное i в массиве arr:

	if ( "Africa" in arrea ) ...

Это условие приведет к выполнению тестирования без создания массива ["Africa"]. Этот массив создался, бы если использовалось

	if ( area ["Africa"] != "" ) ...

Возможно также разбить любую строку на поля, которые станут элементами массива. Это можно сделать с помощью встроенной функции split:

	split ( "s1:s2:s3", a, ":" )

split разбивает строку на 3 поля, используя в качестве разделителя ":" и сохраняя s1 в [1], s2 - в [2], s3 - в [3]. Возвращаемое значение этого оператора равно числу полей, т.е. трем. Третий аргумент функции split - это регулярное выражение, будет использоваться как поле разделителя. Если третий аргумент отсутствует, то в качестве поля разделителя будет использоваться FS.

Массив элементов может быть разделен с помощью аргумента delete:

	delete имя_массива [индекс]

10.18. Функции, определенные пользователем

awk поддерживает функции, определенные пользователем:

         function имя( список_аргументов) {
                      операторы
         }

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

Массив элементов просматривается при обращении, как и в Си. Функция при просмотре не может изменить значение скалярных аргументов. Внутри функции формальные параметры являются локальными переменными, но все другие переменные являются глобальными. У вас может быть любое количество формальных параметров, которые используются только как локальные переменные. Операторreturnявляется необязательным, но если он отсутствует, возвращаемое значение будет неопределенным.

10.19. Комментарии

В программе awk могут присутствовать комментарии. Они начинаются с символа # и заканчиваются символом новой строки:

	print x,y # это комментарий 

Операторы обычно занимают одну строку. Несколько операторов могут располагаться на одной строке, тогда они должны разделяться точкой с запятой. Длинный оператор может располагаться на нескольких строках, причем каждая продолжаемая строка должна заканчиваться символом "\". Нельзя продолжить строку вида "....". Такое продолжение встречается редко, однако как только строка заканчивается запятой, операторы продолжаются автоматически. Примером этого служат операторы print и printf, и такое возможно после операторов "&&" и "||". Несколько операторов "шаблон-действие" могут появляться на одной строке, если они разделены точкой с запятой.

10.20. Вывод

Операторы print и printf являются простейшими конструкциями, которые генерируют вывод. Оператор print используется для образования просто вывода; printf - для форматируемого вывода. Подобно shell awk позволяет вам перенаправлять вывод в файл или в канал.

10.20.1. Оператор print

Оператор:

	print expr1, rxpr2, ..., exprn 

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

Оператор:

	print 

является сокращенной формой оператора:

	print $0

Чтобы напечатать пустую строку, введите:

	print ""

10.20.2. Разделители вывода

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

        BEGIN   { OFS = ":"; ORS = "\n\n" }
                { print $1, $2 }

Обратите внимание, что :

	{ print $1 $2 }

печатает первое и второе поле без разделителя полей вводного файла.

10.20.3. Оператор printf

Оператор printf, используемый в awk, подобен этому оператору в Си, за исключением того, что спецификатор * не поддерживается.

Общий формат оператора:

	print format expr1, rxpr2, ..., exprn 

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

Каждая спецификация начинается с символа "%", заканчивается буквой, которая определяет преобразование, и может включать:
- - выравнивание по левому краю в поле;
width - заполнить поле на заданную ширину; поля, начинающиеся с лидирующего нуля, должны быть заполнены нулями;
.prec - указывает максимальную ширину строки или разряд справа от десятичной точки.

В табл. 26 приведен список символов преобразования printf.

Таблица 26
Символы преобразования printf

Символ Вид печати выражения
c Один символ
d Десятичное число
e [-]d.ddddddE[+-]dd
f [-]ddd.dddddd
g e или f преобразование с подавленем незначащих нулей
o Беззнаковое восьмиричное число
s Строка
x Беззнаковое шестнадцатиричное число
% Печать %; нет аргументов для преобразования

Примеры оператора printf с соответтвующим выводом на той же строке.

        printf "%d", 99/2                     49
        printf "%s", 99/2                     4.950000e+01
        printf "%f", 99/2                     49.500000
        printf "%6.2f", 99/2                   49.50
        printf "%g", 99/2                      49.5
        printf "%o", 99                        143
        printf "%06o", 99                      000143
        printf "%x", 99                        63
        printf "|%10s|", "January"             |   January|
        printf "|%-10s|", "January"            |January   |
        printf "|%.3s|", "January"             |Jan|
        printf "|%10.3s|", "January"           |       Jan|
        printf "|%-10.3s|", "January"          |Jan       |
        printf "%%"                            %

По умолчанию формат чисел выводного файла %.6g. Он может быть изменен, если вы зададите новое значение OFMT. OFMT также управляет преобразованием цифровых значений в строковые при конкатенации и создании массива индексов.

10.20.4. Вывод в файлы

В качестве стандартного вывода для печати можно использовать файлы. Для этого используются операторы изменения направления > и >>. Например, следующая программа вызывает печать из файла countries всех строк, в которых 3-е поле (население) больше, чем 100, в файл bigpop и все остальные строки в файл smallpop:

        $3 > 100     { printf $1, $3 > "bigpop"  }
        $3 > 100     { printf $1, $3 > "smallpop"  }

Обратите внимание, что имена файлов заключены в двойные кавычки; без кавычек bigpop и smallpop будут просто неустановленными переменными. Если имена выводных файлов создаются с помощью выражения, они должны быть заключены в круглые скобки:

	$4 ~ /North America/ { print $1 > ("tmp" FILENAME) }

так как оператор > имеет более высокий приоритет, чем конкатенация. Без круглых скобок конкатенация tmp и FILENAME не будет производиться.

Примечание. Файлы в программе awk открываются один раз. Если файл открыт с помощью >>, его содержимое сохраняется и вывод дополняется в файл.

10.20.5. Вывод в канал

Вы можете направить печать в канал.

Оператор:

	print | "командная_строка"

направляет вывод в "командную_строку". Хотя канал здесь показан как строковая переменная, заключенная в двойные кавычки, командная строка и имена файлов могут приходить из переменных и возвращать значения из функций.

Предположим, вы хотите создать список страна-население так, чтобы страны были отсортированы по алфавиту. Программа awk накапливает значение "количество населения" из 3-го поля для каждого названия страны из 4-го поля и вывод направляет в массив pop. Затем print название каждой страны и ее население направляет вывод команде sort:

        BEGIN    { FS     "\t"  }
                 { pop [$4] += $3 }
        END      { for ( c in pop )
                   print c ":" pop[c] | "sort" }

В результате работы этой программы получим:

          Africa:37
          Asia:1765
          Australia:14
          North America:243
          South America:142

Во всех этих операторах print, вызывающих перенаправление вывода, файлы или каналы идентифицируются с помощью имен (так, канал в данном примере называется "sort"), но они создаются и открываются один раз при запуске. Так что в последнем примере для всех "c" в "pop" открывается только один канал "sort".

Существует ограничение на число файлов, которые могут быть открыты одновременно. Оператор close (файл) закрывает файл или канал.

Когда открывается или закрывается файл, различные строки являются различными командами.

10.21. Ввод

Наиболее общим способом подачи ввода программе awk является указание в командной строке имен вводных файлов. Но существуют и другие способы. Они описываются в этом подразделе.

10.21.1. Файлы и каналы

Вы можете поместить вводимые данные в файл, указать awkdata и затем выполнить:

	awk 'программа' awkdata 

Если не указано имя файла, то awk читает из стандартного файла ввода. Например, egrep выбирает вводные строки, содержащие указанное регулярное выражение, которое может сделать это быстрее, чем awk, т.к. выполняет только это действие. И мы можем вызвать кроме того канал:

	egrep 'Asia' countries | awk '...'

egrep быстро находит строки, содержащие "Asia" и затем направляет их программе awk для последующей обработки.

10.21.2. Разделители ввода

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

           поле 1 поле 2
        поле 1
     поле 1

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

Разделитель поля может быть установлен при помощи регулярного выражения при присваивоении значения встроенной переменной FS.

Например:

	BEGIN { FS = ",[\t] * | ([\t]+" }

переделывает разделитель поля каждой строки в запятую и следующий за ней символ новой строки или табуляции, и каждую строку с символами пустой строки или табуляции без запятой. FS может быть установлен в командной строке с аргументом -F:

Пример.

	awk -F ' (, [\t]*) | ([\t]+)' '...'

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

Регулярные выражения используются как разделители поля для поиска самых длинных строк (как в sub()), но не нулевых строк.

10.22. Многострочные записи

Обычно записи разделяются символами новой строки, так что каждая строка яавяется записью. Такой порядок можно изменить. Если пременная RS - разделитель встроенных записей - установлен в значение "пустая строка", как в:

	BEGIN { RS = "" }

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

	BEGIN { RS = ""; FS = "\n" }

установка в качестве разделителя записи символ пустой строки и разделителя поля - символ новой строки. Таким образом, каждая строка является одним полем. Однако длина записи ограничена (обычно 2500 символов).

10.23. Функция getline

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

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

getline вызывает следующую вводную запись и выполняет над ней нормальную операцию по разбиению на поля. Он устанавливает NF, NR, FNR. getline возвращает 1, если запись существует, 0 - если найден конец файла и -1, если появляется ошибка. (Например, невозможно открыть файл).

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

	f[1] f[2] ... f[nf]

Как только встретится строка, содержащая STOP, то запись может быть обработана в виде данных массива f:

        /^START/  {
                   f[nf-1] = $0
                   while (getline && $0 !~ /~STOP/ }
                          f[++nf] = $0
                    # now process the data in f[1] ... f[nf]
                    ...
        }

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

То же самое задание может быть выполнено с помощью следующей программы:

        /^START/ && nf == 0   { f[nf-1] = $0 }
        nf > 1                { f[++nf] = $0 }
        /^STOP/    # now process the data in f[1] ... f[nf]
                               ...
                               nf = 0
        }

Оператор:

	getline x 

читает из файла вместо текущего ввода. Значение NR и FNR не устанавливается, но разбиение полей выполняется и устанавливается значение NF.

Оператор:

	getline x < "file"

получает следующую запись из файла и направляет в x; разбиение не производится и значение NF, NR и FNR не устанавливается.

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

	while ( getline x < (ARGV[1] ARGV[2]) ) { ... }

т. к. операция "<" имеет больший приоритет, чем конкатенация. Без круглых скобок оператор подобный:

	getline x < "tmp" FILENAME 

указывает , что нужно читать в файл "x" из файла "tmp", а не в "tmp" <значение FILENAME>.

Если вы используете оператор, подобный:

	while ( getline x < file) { ... }

то цикл будет бесконечным, если файл не может быть считан, т.к. getline возвращает -1 в этом случае. Лучше такой тест сделать с помощью следующего оператора:

	while ( getline x < file > 0) { ... }

Вы также можете направить вывод другой команды прямо getline. Например, оператор:

	while ( "who" | getline )
                n++

выполняет who и направляет свой вывод в getline. Каждая итерация цикла while читает более одной записи и увеличивает переменную n. После завершения цикла while, n содержит количество пользователей.

Оператор:

	"date" | getline d 

направляет вывод из date в переменную d, таким образом устанавливается в d текущая дата.

В табл. 27 суммируется рассказанное в этом пункте.

Таблица 27
Функция getline

Форма Устанавливаемое значение
getline $0, NF, NR, FNR
getline var var, NR, FNR
getline < file $0, NF
getline var < file var
cmd | getline $0, NF
cmd | getline var

10.24. Аргументы командной строки

В программе awk могут использоваться аргументы командной строки: массив ARGV содержит элементы ARGV[0], ... ARGV[ARGC-1], где ARGC - счетчик, ARGV[0] - имя программы (в общем случае - awk), остальное - любые поддерживаемые аргументы, исключая программы и необязательные аргументы).

Следующая командная строка содержит программу awk, отражающую аргументы, которые появляются после имени программы:

        awk '
        BEGIN  {
                for ( i = 1; i < ARGC; i++ )
                     printf "%s ", ARGV[i]
                printf "\n"
        }' $*

Аргументы могут быть модифицированы или добавлены. ARGC может изменяться. После окончания вводного файла awk обращается к следующему ненулевому элементу ARGV (увеличив текущее значение ARGC-1) как к имени следующего вводного файла.

Исключением из правила является то, что аргумент считается именем файла, если он имеет форму:

	var-value 

Переменная var принимает значение value, как при операции присвоения. Если value является строкой, то кавычки не нужны.

10.25. Использование awk с другими командами и с shell

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

10.25.1. Функция system

Встроенная функция system (command_line) выполняет команду "command_line", которая может быть строкой, вычисляющей, например, sprintf. Функция system возвращает состояние выполненной команды.

Например:

             $1 == "#include" { gsub (/[<>"]/, $2;
             system ("cat " $2}

вызывает команду cat для печати файла, названного во втором поле каждой вводной записи, у которой первое поле #include, после разборки каждого <, > или ", которые должны присутствовать.

10.25.2. Взаимодействие с shell

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

	awk '{ print $1 }' ...

Так как awk использует те же символы, что и shell (такие как $ и ", окружающие программу awk), одиночные кавычки обеспечат прохождение программы неизменной через shell к интерпретатору awk.

Пример. Команда addr осуществляет выборку файла addresslist для получения имени, адреса и телефона. Предположим, что addresslist содержит имена и адреса, в котором типичным входом является многострочная запись, такая как:

        G.  R.  Emlin
        600 Mountain Avenue
        Murray Hill, NJ 07974
        201-555-1234

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

	addr Emlin 

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

        awk '
        BEGIN  { RS = "" }
        /Emlin/
        ' addresslist 

Проблема состоит в том, чтобы получить различные шаблоны выборок при каждом запуске программ.

Существует несколько способов сделать это. Один из способов - это создать файл, названный addr, который содержит:

        awk '
        BEGIN  { RS = "" }
        /'$1'/
        ' addresslist 

В программе awk один аргумент, хотя установлено два набора кавычек, но они не являются вложенными. $1 заключено в одиночные кавычки и видимо для shell; затем будет заменено на шаблон Emlin при вызове команды addr Emlin.

Второй способ реализации addr полагается на тот факт, что shell заменяет параметры $ в двойных кавычках:

        awk "
        BEGIN  { RS = \"\" }
        /$1/
        " addresslist 

Кроме того, вы должны защитить кавычки, определяющие RS символами \, так что shell направит их awk без интерпретации. $1 распознается как параметр и shell заменяет его на шаблон, когда команда addr вызывается с шаблоном.

Третий способ реализации addr - использовать ARGV для передачи регулярного выражения программе awk, которая читает список адресов с помощью getline:

        awk '
        BEGIN   { RS = ""
                 while ( getline < "addresslist" )
                   if ($0 ~ ARGV[1]
                      print $0
        } ' $*

Вся обработка выполняется в "действии" оператора BEGIN.

Обратите внимание, что регулярное выражение может быть передано addr. В частности, возможно отыскать отдельно адрес, или номер телефона, или имя.

10.26. Примеры использования

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

10.26.1. Генерирование отчетов

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

        Africa:
                Sudan            19
                Algeria          18
        Asia:
                China           866
                India           637
                USSR            262
        Australia:
                Australia        14
        North America:
                USA             219
                Canada           24
        South America:
                Brazil          116
                Argentina        26

Так как здесь несколько задач обработки данных, то намного легче выполнить этот отчет в несколько стадий. Первая: создать список троек "континент_страна_население", в котором каждое поле отделяется запятой. Это можно сделать с помощью следующей программы triplies, которая использует массив pop, индексированный в форме "континент:страна" для сохранения количества населения данной страны. Оператор print в секции END этой программы создает список троек "континент-страна-население", который направляется в программу sort:

        BEGIN  { FS = "\t" }
               { pop[$4 ":" $1] += $3 }
        END    { for ( cc in pop )
           print cc "":" pop[cc] | "sort -t: +0 -1 +2nr"  }

Аргумент для sort заслуживает специального внимания. Аргумент -t: говорит sort, чтобы использовать ":" как разделитель полей. Аргументы +0 и -1 делают первое поле первичным ключом sort. В общем случае +i -j делают поля i+1, i+2, ... j ключом сортировки. Если j опущено, поля от i+1 до конца записи используются. Аргумент +2nr делает третье поле (цифровое уменьшение) вторичным ключом sort ( n - числовое, r - обратный порядок). Относительно файла countries эта программа выдает результат:

        Africa:Sudan:19
        Africa:Algeria:18
        Asia:China:866
        Asia:India:637
        Asia:USSR:262
        Australia:Australia:14
        North America:USA:219
        North America:Canada:24
        South America:Brazil:116
        South America:Argentina:26

Порядок вывода правильный, но неверен формат. Чтобы преобразовать формат вывода в требуемую форму, запустите программу format с этими данными:

        BEGIN  {  FS = ":" }
        {      if ($1 != prev) {
                   print "\n" $1 ":"
                   prev = $1
                }
                printf "\t%-10s %6d\n", $2, $3
        }

Эта программа прерывания управления печатает только первое появление имени континента и форматирует строки "страна-население", соответствующие этому континенту, требуемым способом. Командная строка:

	awk -f triplies countries | awk -f format 

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

10.26.2. Дополнительные примеры

10.26.2.1. Частота использования слов

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

        { for ( w = 1; w <= NF; w++ ) count[$w]++ }
  END   {for( w in count) print count[w], w | " sort -nr" }

Первый оператор использует массив count для накопления количества появлений каждого слова. Как только ввод будет считан, второй оператор цикла for направляет окончательный счетчик каждого слова команде sort.

10.26.2.2. Накопление

Предположим вы имеете два файла deposite и withdrawals, записи которых содержат имя поля и количество полей. Для каждого имени вы хотите напечатать итог net, определяющийся вычитанием общего вывода из общего депозита. Баланс net может быть вычислен следующей программой:

        awk '
        FILENAME == "deposits"        { balance[$1] += $2 }
        FILENAME == "withdrawals"     { balance[$1] -= $2 }
        END                        { for (name in balance )
                                  print name, balance[name]
        }' deposits withdrawals 

Первый оператор использует массив balance для накопления общего количества для каждого имени в файле deposits. Второй оператор вычитает соответствующий вывод из каждого общего депозита. Оператор END печатает каждое имя с соответствующим итогом.

10.26.2.3. Случайный выбор

Следующая функция печатает случайные элементы k, начиная с первого элемента массива A, состоящего из n элементов. В программе k - это количество входов, необходимых для печати, n - количество элементов, которые еще будут исследоваться. Выбор печатать или нет i-тый элемент определяется тестом rand() < k/n:

        function choose (A, k, n, i) {
                for (i = 1; n > 0; i++)
                     if (rand() < k/n--) {
                        print A[i]
                        k--
                      }
                 }
        }

10.26.2.4. Возможности shell

Следующая программа awk приблизительно моделирует возможности shell системы UNIX. Строка, содержащая только знак "=" заново выполняет последнюю выполненную команду. Строка, начинающаяся с =cmd заново выполняет последнюю команду, вызов которой включает строку cmd. Иначе выполняется текущая строка.

         $1 == "=" { if [NR == 1]
                      system ( x[NR] = x [NR-1] )
                    else
                      for ( i= NR-1]; i > 0; i-- )
                           if ( x[i] ~ $2 ) {
                                system(x[NR] = x[i])
                                break
                            }
                     next }
        /./          { system(x[NR] = $0) }

10.27. Итоговое краткое описание awk

Командная строка

        awk programm filenames
        awk -f programm-file filenames
        awk -Fs sets field separator to string s
        awk -Ft sets separator to tab

Шаблоны

        BEGIN
        END
        /regular expression/
        relational expression
        pattern && pattern
        pattern || pattern
        (pattern)
        !pattern
        pattern, pattern

Операторы управления потоком

        if (expr) statement [else statement]
        if (subscript in array) statement [else statement]
        while (expr) statement
        for (expr; expr; expr) statement
        for (var in array) statement
        do statement while statement
        break
        cintinue
        next
        exit [expr]
        return [expr]

Ввод-вывод

close (filename) закрыть файл
getline установить $0 из следующей вводной записи; установить NF, NR, FNR
getline <file установить $0 из следующей записи файла; установить NF
getline var установить var из следующей вводной записи; установить NR, FNR
getline var <file установить var из следующей записи файла
print распечатать текущую запись
print expr-list распечатать выражение
print expr-list >file печать выражений в файл
printf fmt, expr-list отформатировать и распечатать
printf fmt, expr-list >file отформатировать и распечатать в файл
system (cmd-line) выполнить команду cmd-line, возвратить состояние

В print и printf >>file добавляется в file и |command - записывает в канал.

Функции

        func name(parameter list) { statement }
        function  name(parameter list) { statement }
        function-name(expr, expr, ...)

Функции строки

gsub(r,s,t) заменить строку s для каждого найденного регулярного выражения r в строке t; возвращает количество замен; если t опущено, то используется $0
index(s,t) возвращает индекс строки t в строке s, или 0, если нет вхождений строки t
length(s) возвращает длину строки s
match(s,r) возвращает позицию s, в которой встретилось регулярное выражение r; возвращает 0, если r не найдено
split(s,a,r) разбить строку s в массив a по регулярному выражению r; возвращает количество полей; если r опущено, то используется значение FS
sprints(fmt,expr-list) печатает expr-list в соответствии с fmt, возвращает результирующую строку
sub(r,s,t) аналогично gsub, за исключением того, что заменяется только первая найденная подстрока
substr(s,i,n) возвращает подстроку n, начинающуюся с i; если n опущено, то используется остаток s

Арифметические функции

atan2(y,x) арктангенс y/x в пределах от "-пи" до "пи"
cos(x) косинус x
exp(x) экспоненциальная функция x
int(x) целая часть x с усеченными лидирующими нулями
log(x) натуральный логарифм x
rang() случайное число между 0 и 1
sin(x) синус x
sqrt(x) квадрат x
srand(x) x - новое начальное значение для rand()

Операторы

= += -= *= /= %= ^= присвоение
?: условное выражение
|| логическое OR
&& логическое AND
~ !~ поиск регулярного выражения; отрицательный поиск
< <= > >= != == отношения
blank конкатенация строк
+ - сложить, вычесть
* / % умножить, разделить, режим
+ - ! унарный плюс, унарный минус, логическое отрицание
^ показательная функция ( ** является синонимом)
++ -- приращение, отрицательное приращение
$ поле

Регулярные выражения

с поиск на совпадение с немета-символом "c"
поиск буквенного символа "с"
^ поиск начала строки или последовательности строк
$ поиск конца строки или последовательности строк
. поиск любого символа, кроме символа новой строки
[s] поиск любого символа из набора "s"
[^s] поиск любого символа, отличного от "s" и символа новой строки
r* поиск ноль или больше
r+ поиск одного или больше
r? поиск ноль или один
(r) группирование: поиск r
r1r2 конкатенация: поиск r1 затем r2
r1|r2 поиск либо r1 либо r2

Встроенные переменные

ARGC число аргументов командной строки
ARGV массив аргументов командной строки
FILENAME имя текущего вводного файла
FNR номер записи в текущем файле
FS разделитель поля вводного файла; (по умолчанию - пробел)
FN число полей в текущей записи
NR число считанных на данный момент записей
OFMT выводной формат для цифр; (по умолчанию - %6.g)
OFS разделитель поля выводного файла
ORS разделитель записи выводного поля
RS разделитель записи вводного файла
RSTART индекс первого выбранного символа при помощи match(); 0 - если символ не найден
RLENGTH длина строки, выбранной при помощи match() -1 - если строка не найдена
SUBSEP разделитель индексов элементов массива; (по умолчанию - \034)

10.27.1. Ограничения

При работе с awk вы должны придерживаться следующих ограничений:

100 полей
2500 символов во вводной записи
2500 символов в выводной записи
1024 символов в индивидуальном поле
1024 символов в строке printf
400 символов в строке, заключенной в кавычки
400 символов в классе символов
15 открытых файлов
1 канал

10.27.2. Инициализация, сравнение и тип приведения

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

	var = expr 

то тип переменной определяется выражением. В арифметических выражениях тип - цифровой, в конкатенации - строковый, и т.д. Если назначение является простым копированием:

	v1 = v2

то типом v1 становится тип v2. При сравнении, если оба операнда являются цифровыми, то производится цифровое сравнение. В противном случае, операнды рассматриваются как строковые и сравнение производится над строками. Тип любого выражения может быть приведен к цифровому таким образом:

	expr + 0

и к строковому типу:

	expr ""

(это конкатенация с пустой строкой)

Инициализированные переменные имеют цифровое значение 0, а строковые - значение "". Соответственно, если x проинициализировано, то оператор

	if (x) ...

имеет значение "ложь", а

        if (!x) ...
        if (x == 0) ...
        if (x == "") ...

все являются истиной, но

        if (x == "0") ...

является ложью.

Тип поля определяется по контексту. Например:

	$1++

означает, что $1 будет цифровым, и

	$1 = $1 "," $2

означает, что и $1 и $2 являются строковыми. Приведение к типу выполняется при необходимости.

Если по контексту тип не может быть определен, например:

	if ($1 == $2) ...

тип поля определяется при вводе.

Поля, которые являются нулевыми, имеют строки со значением "", они не являются цифровыми.

Определения типов для элементов массива, созданных split(), аналогичны определению типов для полей.

Так, если arr[i] не существует, то :

	if (arr[i] == "") ...

приводит к тому, что он появляется со значением "".

Приложение 1. Файловая система UNIX

Файловая система UNIX имеет иерархическую структуру; чаще всего она описывается в виде дерева. Вершина этого дерева - это справочник root. Он обозначается с помощью /. Все другие справочники и файлы берут свое начало из справочника root.

Один из путей из root ведет в ваш собственный справочник. Вы можете организовывать и хранить информацию в вашей собственной иерархии справочников и файлов.

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

	ls -l /<CR>

Чтобы перемещаться по файловой структуре, вы можете использовать имена путей. Например, вы можете переместиться в справочник /usr/bin, если введете следующую командную строку:

	cd /usr/bin<CR>

Справочники системы UNIX

/ -
справочник root;
/stand -
содержит программы и файлы данных, используемые в процессе загрузки;
/dev -
содержит специальные файлы, которые представляют периферийные устройства, такие как:
console - консоль
lp - построчно-печатающее устройство
term/* - пользовательские терминалы
dsk/* - диски
/etc -
содержит файлы конфигурации и базы данных;
/home -
собственный справочник пользователя;
/tmp -
содержит временные файлы, например, буферы для редактирования файла;
/var -
поддерево для изменяемых файлов (например, файлы регистрации);
/usr -
содержит другие справочники, например, bin, lib;
/usr/bin -
содержит исполняемые программы, включая следующие:
              cat         grep
              date        mkdir
              login       who
/usr/lib -
содержит библиотеки для программ и языков программирования.

Приложение 2. Основные команды системы UNIX

 
at -
выполнить команду в фоновом режиме в указанное время.

Формат:

        at время [день]<CR>
           команда_1<CR>
           команда_2<CR>
           <^d>
banner -
распечатать сообщение (слова должны быть длиной не более 10 символов) большими буквами в стандартный вывод;
batch -
поставить задание в очередь. Формат:
        batch<CR>
           команда_1<CR>
           команда_2<CR>
           <^d>

Команда batch читает задание со стандартного ввода и ставит его в очередь. Команды, поставленные в очередь командой batch, будут выполнены, когда позволит уровень загруженности;

cat -
отобразить содержимое указанного файла на терминал. Чтобы временно приостановить вывод, нажмите <^s>, и чтобы возобновить вывод введите <^q>. Для прекращения вывода и возврата управления shell, нажмите клавишу BREAK или DELETE;
cd -
сменить текущий справочник. Если вы указали имя справочника, то команда cd сменит текущий справочник на указанный. Если имя не указано, то используется значение переменной окружения $HOME. Если вместо имени справочника указано имя пути, то вы можете перескочить несколько уровней при помощи одной команды;
cp -
скопировать указанный файл в новый файл, оставив оригинальный файл неизменным;
cut -
выбрать отдельные поля из строк файла. Эта команда может, например, использоваться для выборки колонок из таблицы;
date -
отобразить текущие дату и время;
diff -
сравнить два файла. Команда diff выдает на стандартный вывод те строки файлов, которые нужно изменить, чтобы привести файлы в соответствие друг с другом;
echo -
отображает ввод на стандартный вывод, включая возврат каретки, и возвращает подсказку;
ed -
редактирование указанного файла с помощью построчного редактора. Если имя файла не указано, то команда ed создает новый файл;
grep -
поиск по шаблону, заданному ограниченным регулярным выражением;
kill -
завершить фоновый процесс с помощью идентификатора процесса (PID). Вы можете получить PID, запуcтив команду ps;
lex -
генерирует программы, которые будут использоваться для лексического анализа текста;
lp -
распечатать содержимое указанного файла на построчно-печатающем устройстве;
lpstat -
отобразить состояние любого запроса построчно-печатающему устройству;
ls -
распечатывает имена всех файлов и справочников, за исключением тех, которые начинаются с точки;
mail -
отправка пользователям почты или ее чтение. Каждое сообщение заканчивается подсказкой ?; mail ждет от вас ввод опции для сохранения, удаления сообщения или передвижения к месту использования. Чтобы получить список допустимых опций, введите ?. mail, следующая за регистрационным именем, посылает сообщение владельцу этого имени. Чтобы завершить сообщение, введите <^d>. Для прерывания сеанса mail нажмите клавишу BREAK;
mailx -
интерактивная система обработки сообщений;
make -
поддержка, обновление и восстановление групп программ;
mkdir -
создать новый справочник. Новый справочник становится подсправочником того справочника, в котором вы выдали команду mkdir;
mv -
переместить файл. С помощью этой команды можно скопировать файл в новый в том же справочнике либо в новый файл в другом справочнике. Если вы перемещаете файл в другой справочник, то можете использовать то же самое имя файла;
nohup -
запустить команду в фоновом режиме; она продолжит свою работу и после того, как вы завершите работу. Сообщения об ошибках и вывод будут располагаться в файле nohup.out;
pg -
отображает содержимое указанного файла на терминал постранично. После распечатки каждой страницы система делает паузу и ждет от вас подтверждения на продолжение вывода следующей страницы;
pr -
форматирует и выдает файлы на стандартный вывод. Команда pr разбивает текст на страницы;
ps -
отображает состояние и номер каждого процесса, выполняющегося в данный момент. Команда ps не отображает состояние заданий, находящихся в очереди к at и batch;
pwd -
отображает полное имя пути текущего рабочего справочника;
rm -
удалить файлы или справочники из файловой системы. В этой команде вы можете использовать метасимволы, но с большой осторожностью, т.к. удаленные файлы восстановить непросто;
rmdir -
удалить справочник. Вы не можете удалить справочник, в котором находитесь, не можете также удалить непустой справочник;
sort -
сортировка и слияние файлов; результат отображается на экране;
spell -
слова из указанного файла проверить на соответствие орфографии; слова, которые не соответствуют орфографическому списку, отображаются на экране;
stty -
установка характеристик терминального ввода/вывода для устройства, являющегося стандартным вводом;
uname -
отобразить имя системы UNIX, в которой вы работаете;
uucp -
послать указанный файл другой системе UNIX;
uuname -
список имен удаленных систем UNIX, которые могут связываться с вашей системой UNIX;
uupick -
поиск файла в открытом справочнике посланного вам командой uuto. Если файл найден, то uupick отображает его имя и имя системы, из которой он пришел;
uustat -
отобразить состояние команды uuto, с помощью которой вы послали файлы другому пользователю;
uuto -
послать указанный файл другому пользователю. Укажите пункт назначения в формате system!login; system должно находиться в списке систем, созданном командой uuname;
wc -
подсчитать числа строк, слов и символов в указанном файле и отобразить результат на терминале;
who -
отобразить регистрационные имена пользователей, в данный момент зарегистрированных в вашей системе UNIX;
yacc -
компилятор компиляторов.