Некоторые операционные системы требуют от вас определить тип файла и использовать его определенным способом. От этого будет зависеть то, как будут файлы сохраняться, т.к. файлы могут быть последовательными, двоичными или произвольной выборки Для системы UNIX все файлы одинаковы. Это делает файловую структуру UNIX легкой в использовании. Например, вам нет необходимости указывать требования к памяти для ваших файлов, т.к. система автоматически это сделает для вас. Или если вам или написанной вами программе необходим доступ к определенному устройству (например, принтеру) вы указываете устройство также как любой из ваших файлов. В системе UNIX существует только один интерейс для всего вашего ввода и вывода для вас; это упрощает ваше взаимодействие с системой. Справочник root содержит несколько важных системных справочников:
Справочники и файлы, созданные вами, охватывают часть файловой системы, которая контролируется вами. Другая часть файловой системы обслуживается операционной системой: /sbin, /dev, /tmp и /usr. В этом разделе вы познакомились с основными принципами операционной системы UNIX. Следующие разделы помогут применить эти принципы. |
Следующие соглашения используются в данном руководстве:
Во всех разделах приведены примеры, в которых показано, как выглядят экраны терминалов, когда вы взаимодействуете с системой UNIX. Эти примеры показывают как пользоваться редакторами системы UNIX, писать короткие программы и выполнять команды. Ввод (символы, вводимые вами) и вывод (символы печатаемые системой UNIX) приведены на этих экранах в соответствии с соглашениями, приведенными выше. |
Существует несколько способов исправления ошибок ввода. Символ @ стирает текущую строку, а клавиша <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>. |
Что получится, если вы захотите использовать буквенное значение специальных символов? Так как по умолчанию система UNIX интерпретирует специальные символы как команды, то вы должны сказать системе, что нужно игнорировать специальные значения символов, если хотите использовать их как буквенные символы. Обратная косая черта (\) позволяет вам сделать это. Введите \ перед любым специальным символом, с которым вы хотите обращаться в его неизменном виде. Например, вы хотите добавить следующее предложение в файл: He bought three pounds @ $.05 cents each Чтобы предотвратить интерпретацию системой UNIX знака @ как запрос на удаление символа, поставьте обратную косую черту перед знаком @. Если вы этого не сделаете, то система удалит все слова перед знаком @ и вы получите следующее предложение: $.05 cents each Чтобы избежать это, введите предложение в следующем виде: He bought three pounds \@ $.05 cents each |
Найдите на клавиатуре клавишу управления. Обычно она помечается CONTROL или CTRL, и возможно находится либо левее буквы A или ниже буквы Z. Клавиша управления используется в комбинации с другими символами для выполнения некоторых действий над вводимой строкой. Вводимые таким образом команды называются символами управления. Некоторые управляющие символы выполняют те же действия, что и клавиши <BACKSPACE> и <TAB>. Другие определяют команды, которые являются специфичными для системы UNIX. Например, только управляющий символ (по умолчанию ^s) временно останавливает вывод, который печатался на экране терминала. Чтобы ввести управляющий символ, нажмите одновременно сооответствующую буквенную клавишу и клавишу управления. Так как большинство управляющих символов не появляются на экране терминала при вводе, то они в документации приводятся в угловых скобках. Клавиша управления представляется в виде знака ^, стоящего перед буквой. Например, <^s> означает, что нужно одновременно нажать клавишу с буквой s и управляющую клавишу. Для двух функций наиболее часто используются управляющие символы: вывод на экран и выход из системы. Чтобы приостановить вывод нинформации на экран видеотерминала, нажмите <^s>. Когда вы будете готовы прочитать следующую порцию информации, нажмите <^g> и вывод возобновится. Чтобы завершить работу с системой UNIX, нажмите <^d>. В дополнение, система UNIX использует управляющие символы для обеспечения тех возможностей, которые некоторые терминалы не могут выполнить посредством специальных клавиш. Если ваша клавиатура не имеет клавиши <BACKSPACE>, вы можете вместо нее воспользоваться клавишами <^h>. Вы можете вместо отсутствующей клавиши <TAB> воспользоваться клавишами <^i>. Теперь, когда вы настроили терминал и изучили клавиатуру, вам осталось сделать еще один шаг, чтобы связаться с системой UNIX: вы должны получить регистрационное имя. |
Регистрационное имя - это имя, с помощью которого система UNIX проверяет, являетесь ли вы полномочным пользователем системы, во время запроса доступа к ней. Регистрационное имя вы должны вводить каждый раз, когда вы хотите войти в систему. Чтобы получить регистрационное имя, обратитесь к администратору системы UNIX. Существует несколько правил выбора регистрационного имени. Обычно длина имени составляет от 3 до 8 символов. Оно может состоять из больших или маленьких букв, цифр, символа подчеркивания, но не может начинаться с цифры. Однако ваше регистрационное имя, возможно, будет определяться конкретным применением. Примеры допустимых имен: startship mary2 jmrs |
Информация, приводимая в этом подразделе, подразумевает, что терминал напрямую связан с компьютером или посредством телефонной линии. Хотя в этом подразделе описана типичная процедура входа в систему, данне инструкции могут не подойти для вашей системы, т.к. существует несколько способов регистрации в системе UNIX через телефонную линию. Включите терминал. Если он напрямую связан с компьютером, то в верхнем левом углу немедленно появится подсказка: login: Если вы устанавливаете связь с компьютером через телефонную линию, вы должны установить связь. Следующая процедура приведена в качестве примера одного из способов установки этой связи.
|
Поведение терминала предсказуемо, если вы правильно настроили его. Однако иногда он может функционировать странно. Например, неправильно работает функция возврат каретки. Некоторые проблемы могут быть решены просто: выйти из системы и вновь зайти в нее. Если перерегистрация не поможет решить эту проблему, то вы вначале должны проверить следующее:
Теперь снова зарегистрируйтесь с системе UNIX. В табл. 2 представлены процедуры, которым вы можете следовать, чтобы обнаружить и исправить некоторые возникающие при регистрации проблемы. Таблица 2
Примечание. Множество проблем может появиться, если терминал настроен неправильно. Чтобы исключить эти проблемы, до начала регистрации еще раз проверьте установленные характеристики терминала. Некоторые проблемы могут быть специфичны для вашего терминала или модема. В этом случае обратитесь к документации по вашему конкретному устройству. Ввод строки stty -tabs устанавливает табуляцию только для вашей текущей сессии. Чтобы установить табуляцию для всех сессий, добавьте эту строку в .profile. |
Вы можете давать справочникам или файлам любые имена в соответствии со следующими правилами:
В следующем примере приведены допустимые имена справочников или файлов: Пример. memo MEMO section2 raf:list file.d chap3+4 item1_10 outline |
В этом разделе описываются 4 системные команды, позволяющие вам организовывать и использовать структуру справочника:
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> $ Вы можете перейти к подсправочнику и в нем построить дополнительные подсправочники |
Все справочники в файловой системе имеют информацию о содержащихся в них файлах и справочниках, такую как: имя, размер и дата последней модификации. Вы можете получить эту информацию о вашем текущем справочнике и других системных справочниках, задав команду 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.
|
Сразу же после регистрации в системе 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 помещает вас в указанный справочник, то возвращается подсказка $. Чтобы получить доступ к справочнику, который не является вашим рабочим справочником, вы должны указать полное или родственное имя пути в командной строке. |
Если вам больше не нужен справочник, вы можете удалить его с помощью команды 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 команды предполагают сложную технику обработки информации при работе с файлами. |
В этом подразделе описываются команды системы UNIX, необходимые для доступа к файлам и для их использования. В табл. 4 перечислены основные команды. Таблица 4
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
Примечание. Некоторые команды могут быть введены с цифрой впереди. Например: +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 строки невозможно будет прочитать, т.к. вы не можете вернуть экран или два назад. В этом случае воспользуйтесь: |
При работе с системой 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> |
Команда 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 перезапишет новую версию файла. Старая версия файла удаляется. |
Чтобы удалить файл, введите следующую команду: rm файл(ы)<CR> Вы можете удалить несколько файлов, указав их имена в командной строке. В этом случае команда будет выглядеть следующим образом: rm файл1 файл2 файл3 ... <CR> Чтобы проверить, успешно ли выполилась команда, выполните команду ls. Например, предположим, что в вашем справочнике находятся файлы outline и table. Вы хотите удалить оба файла. Если команда rm выполнится успешно, то справочник будет пустой. Проверьте, задав команду ls. Экран будет выглядеть следующим образом: $ rm outline table<CR> $ ls $ Подсказка говорит о том, что файлы outline и table удалены. |
С помощью команды wc вы можете подсчитать число строк, слов и символов в указанном файле. Если указано более одного файла в командной строке, то программа wc осуществляет подсчет строк, слов и символов в каждом файле и затем выдает общее число. Вы можете с помощью ключей указать либо подсчет только строк, или только слов, или символов. Синтаксис команды: wc имя-файла<CR> Система отвечает строкой в следующем формате: l w c файл где l - число строк в файле; Например, чтобы подсчитать число строк, слов и символов в файле 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 $ |
Команда chmod позволяет вам устанавливать разрешение на чтение, запись и использование вашего файла. Так как операционная система UNIX является многопользовательской, то обычно вы не работаете в одиночку в файловой системе. Пользователи системы могут любым путем обращаться к различным справочникам и читать файлы, принадлежащие другим пользователям до тех пор, пока есть разрешение на это. Если вы являететсь владельцем файла, то можете решить, кто имеет право на чтение файла, запись в него и, если это программа, то выполнить ее. Вы также можете ограничить права доступа к справочнику. Когда вы предоставляете право доступа к справочнику, это значит, что позволяете указывать пользователю команду cd и распечатывать содержимое справочника с помощью команды ls. Чтобы указать право доступа, используются следующие символы:
Чтобы указать, кто из пользователей имеет эти права на доступ, используются следующие символы:
Когда вы создаете файл или справочник, система автоматически предоставляет или не предоставляет право доступа вам, члену вашей группы или всем пользователям системы. Вы можете изменить это автоматическое действие по предоставлению права (см. разд. 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 не будет выполняться, если вы поставите пробел между "кто", символами "+", "-" и "право". В следующих примерах приведены несколько способов использования команды 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 обозначают права для группы и
для всех пользователей системы; Проверьте результат и введите команду 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). |
В этом пункте описаны три команды, которые могут вам пригодиться при работе с файлами: 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. Так как вы хорошо знакомы с этими
командами, вам необходимо получить более
углубленные знания по технике обработки
информации. В этом пункте представим три команды:
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> Эта команда приводит к тому, что строки в указанном файле будут отсортированы и слиты в следующем порядке:
Например, вы имеете 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.1. Управление офисом системы"Офис" системы UNIX подобен бизнес-офису и состоит из файлов, записей, копий, блоков для хранения этих данных и значения хранения, перемещения, дублирования таких данных. FACE (Framed Access Command Environment) позволяет организовывать ваш "офис" для эффективного и легкого использования. При помощи FACE вы можете манипулировать не только со своими собственными файлами, но и получать доступ к файлам других пользователей. FACE предлагает сделать вам выбор в форме меню. |
В этом подразделе описывается, как с помощью редакторов создавать и редактировать текстовые файлы. В начале подраздела дается объяснение, что такое редактор текста и как он работает. Затем приводится описание двух редакторов: строчный редактор ed и экранный редактор vi ( см. разд. 6 и 7). 4.2.1. Что такое редактор текстаКогда вы пересматриваете письмо, отчет, то может возникнуть необходимость выполнить следующее: вставить новый или дополнительный материал, переставить местами куски текста и окончательно подготовить чистую корректную копию. Редактор текста выполнит эти действия в вашем справочнике, сделав запись и просмотр текста быстрее и легче, чем это сделаете вы вручную. Редакторы текста системы UNIX являются интерактивными программами: они принимают от вас команды и выполняют требуемые функции. |
4.2.2.1. Буфера редактора текстаПрежде чем использовать текстовый редактор для создания нового файла или модификации существующего, вы сначала делаете запрос shell передать управление редактору. Как только это произойдет, редактор располагает временным рабочим пространством, называемом буфером редактора. Любая информация, которую вы вводите во время редактирования файла, сохраняется в этом буфере и здесь можно ее редактировать. Так как буфер является временным рабочим пространством, то любой введенный текст и любые изменения также являются временными. Буфер и его содержимое будут существовать только во время процесса редактирования. Если вы хотите сохранить файл, то должны дать текстовому редактору команду записать содержимое буфера в файл. Файл сохраняется в памяти компьютера. Чтобы предотвратить потерю содержимого буфера, редактор посылает вам напоминание о том, чтобы не забыть записать его в файл, при попытке завершить работу с редактором. Текст в буфере организуется в строки. Строка текста является просто набором символов, которые появляются на экране горизонтально, и завершается строка при нажатии клавиши RETURN. Иногда строка может выходить за рамки экрана. Некоторые терминалы отображают непоместившееся продолжение строки на следующей строке, другие - нет. |
Текстовый редактор работает в двух режимах: командный и режим ввода. Когда вы начинаете сессию с редактороm, то автоматически устанавливается командный режим. В этом режиме вы можете перемещаться внутри файла, осуществлять поиск по шаблону в файле, изменять существующий текст. Однако не можете создать файл в командном режиме. Чтобы сделать это, надо перейти в режим ввода. В этом режиме любой введенный вами символ помещается в буфер как часть вашего текстового файла. После того, как вы ввели весь текст и решили запустить команды редактора, то вы должны возвратиться в командный режим. 4.2.4. Построчный редакторПострочный редактор становится доступным при помощи команды ed и является разновидностью программ для подготовки текстовых файлов. Он называется построчным, т.к. манипулирует с текстом по принципу "строка-за-строкой". Это означает, что вы должны указать номер строки, текст которой вы хотите изменить. Затем ed печатает эту строку на экране и вы можете ее модифицировать. Этот текстовый редактор предоставляет команды, с помощью которых вы можете изменить строки, напечатать строки, читать и записывать в файл и вводить текст. Кроме того, вы можете вызвать редактор ed из shell программы. Построчный редактор ed работает с видеотерминалом и с печатающим терминалом. Он также может работать по малоскоростным телефонным линиям. Редактор vi может быть использован только с видеотерминалом. |
К экранному редактору вы можете получить доступ с помощью команды vi. Экранный редактор vi является дисплей-ориентированным, интерактивным программным средством. Он позволяет вам обозревать файл при редактировании постранично. Этот редактор работает наиболее эффективно на видеотерминалах, оперирующих со скоростью 1200 бод и выше. Вы можете модифицировать (добавлять, удалять, изменять) файл, позиционируя курсор в том месте на экране, где должны быть произведены изменения. Экранный редактор немедленно отображает результат изменений. Экранный редактор предлагает вам набор команд. Например, команда number позволяет вам перемещать курсор внутри файла. Другие команды прокручивают вперед и назад файл на экране, помогают изменить существующий текст или создать новый текст. Дополнительно к своему набору команд экранный редактор может иметь доступ к командам построчного редактора. В табл. 6 приведены характеристики редакторов ed и vi. Таблица 6
|
Каждый раз, когда вы регистрируетесь в системе UNIX, то вступаете во взаимодействие с shell, которое продолжается до выхода из системы. Однако, если вы используете текстовый редактор, то ваше взаимодействие с shell приостанавливается, оно восстанавливается, как только закончите работу с редактором. shell подобна другим программам, за исключением того, что вместо выполнения одного задания, как cat или ls, она является основой при вашем взаимодействии с системой UNIX. Первой функцией shell является действие как команды интерпретатора между вами и системой. Как интерпретатор, shell транслирует ваши запросы на язык, понятный компьютеру и выполняет их. 4.2.7. Применение средств системыИспользуя shell различными способами, вы увеличиваете используемые системные средства. Кроме применения shell для запуска отдельных программ, вы также можете:
Дополнительно к функциям интерпретатора языка команд shell является языком программирования. Более подробно shell описан в разд. 9. |
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 Если файл существует, то его содержимое появится на экране. Если не существует, то вы можете создать его с помощью одного из текстовых редакторов. |
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. Программирование с помощью awkawk предлагает вам управлять задачами обработки данных и восстановления информации. В разд. 7 приводится концепция языка и структура программы awk. Типичная программа awk состоит из выражения "шаблон-действие". awk-программа находит во вводном файле строку, соответствующую шаблону и выполняет над ней указанное действие. Процесс продолжается до тех пор, пока весь вводной файл не будет прочитан. |
Как пользователь системы UNIX вы можете посылать сообщения другим пользователям, работающим в вашей системе или другой системе UNIX, или принимать информацию, хранящуюся в файлах других пользователей. Особенностью является то, что вы можете посылать и принимать сообщения, изменять файлы и организовывать сетевую работу с другими системами UNIX. Чтобы сделать это, вы должны быть зарегистрированы в системе UNIX, что предоставляет вам возможность связываться с той системой UNIX, которой вы хотите послать информацию. Команда, которую вы будете использовать для посылки информации зависит от того, что вы хотите послать. 4.4. Программирование в системе UNIXСистема UNIX обеспечивает мощное и удобное окружение для развития программирования и программного обеспечения. В дополнение к различным языкам, которые вы можете использовать, система UNIX обеспечивает некоторыми дополнительными средствами, чтобы сделать развитие программного обеспечения легче. |
5.1. Что такое FACE?Командная среда (КС) FACE (Framed Access Command Environment) является дружелюбным для пользователя интерфейсом к системе UNIX, отображающим на экран электронный "оффис", с помощью которого вы можете легко выбирать команды, выполняющие многие обычные служебные задачи, такие как организация ваших файлов, совместная разработка проектов и выполнение нескольких задач одновременно. Кроме того FACE дает возможность доступа к принтеру, установленным программам, оболочке системного администратора и к системе UNIX. 5.1.1. Организация этого разделаМатериал в данном разделе организован следующим образом:
|
Этот подраздел описывает основы работы в среде FACE. Вы узнаете как регистрироваться, какие существуют меню, формы и текстовые окна, как их использовать, как перемещать окна на экране, как получать справочную информацию (help) и как выходить из системы. Вы узнаете как ориентироваться в окнах и меню на экране, а также как выполнять команды FACE: с помощью функциональных клавиш или альтернативных последовательностей, из командного меню или из командной строки. 5.2.1. Регистрация в системеПеред тем как вы сможете работать с FACE, вы должны зарегистрироваться в вашей системе. Регистрацию в системе можно сравнить с запертой дверью вашего оффиса. Также как посторонние люди не могут войти в ваш оффис без ключа к двери, посторонние пользователи не могут войти в вашу систему без ключа к вашему регистрационному имени - пароля. Примечание. Никогда не разделяйте свое регистрационное имя с другим лицом. Кроме того что это снижает защиту вашего оффиса, если два человека используют одно регистрационное имя одновременно, ваш FACE экран может оказаться несколько испорченым. (Окна могут быть искажены и вы не сможете правильно ориентироваться). Перед тем как вы сможете зарегистрироваться в FACE вам необходимо узнать следующее:
Когда вы узнали эту информацию, можно начинать.
FACE может определить не любой тип терминала. Если FACE не сможет определить тип терминала, вы опять получите подсказку "TERM=", и будет необходимо ввести тип терминала. Это все что касается регистрации. Но перед тем как вы начнете использовать FACE, вы должны понять как работают части FACE экрана. Если FACE не запускается автоматически при входе в систему, вы можете вызвать его командой "face" в ответ на подсказку системы UNIX. |
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=" при регистрации в системе. |
После того как вы успешно зарегистрировались, экран очищается и появляется первое окно (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 содержит следующее пункты:
На FACE экране могут появиться и другие информационные окна, которые вы назначили. После того, как открыто FACE меню и, возможно, другие окна, может появиться подсказка в строке сообщения о том, что файлы или наборы файлов в вашей "корзине для бумаг" должны быть удалены. При этом также выводится меню файлов или наборов файлов, предназначенных для удаления. Вы можете использовать клавишу MARK для того чтобы пометить некоторые файлы или наборы файлов для сохранения, и затем удалите оставшиеся нажатием клавиши ENTER. Также вы можете вообще отказаться от удаления нажатием CANCEL или альтернативной последовательности CTRL-f 6. (Полная информация по ориентации в окнах и меню приведена в разделе "Как использовать меню.) Раздел "Использования вашего FACE оффиса" обсуждает средство "корзина для бумаг" детально. |
Не каждая клавиатура имеет все клавиши, на которые ссылается данное руководство. Например, многие клавиатуры не имеют клавиши BACKTAB или функциональных клавиш с F1 по F8. Если ваша клавиатура не имеет каких-либо клавиш, использованных в данном руководстве (или если ваша клавиатура их имеет, но они не работают правильно), вы можете использовать альтернативные последовательности клавиш. В табл. 7 показаны эти альтернативные последовательности (две или три клавиши, ввод которых эквивалентен нажатию именованной клавиши). В этих последовательностях CTRL представляет управляющую клавишу. Управляющая клавиша используется также как вы нажимаете клавишу shift когда вы хотите ввести заглавную букву. Например, если вы не можете использовать функциональную клавишу F1, введите альтернативную последовательность CTRL-f 1. Для ввода данной последовательности, нажмите управляющую клавишу (CTRL) и не отпускайте ее пока набираете первый символ, который следует за тире (здесь это "f"), и отпустите управляющую клавишу перед тем как вы введете второй символ (здесь это "1"). Таблица 7
В зависимости от вашей клавиатуры, клавиша возврата каретки может называться ENTER или RETURN. В данной главе для обозначения клавиши возврата каретки используется клавиша ENTER. Метка ENTER может быть также присвоена функциональной клавише F3. Однако, если ваша клавиатура имеет только клавишу RETUN, используйте ее или CTRL-m взамен. |
5.3.2.1. Метки функциональных клавиш в менюРяд меток на экране, которые появляются на нижней строке вашего FACE экрана, соответствуют восьми функциональным клавишам на вашей клавиатуре, с F1 по F8. Когда текущим активным окном является меню, как например сейчас, первый уровень функциональных клавиш появляется внизу экрана. Когда, однако, текущим активным окном является набор файлов, меткой для клавиши F8 становится CHG-KEYS, и вы имеете доступ ко второму уровню функциональных клавиш (рис.4).
* Функциональная клавиша F8 имеет метку CHG-KEYS когда меню отображает содержимое набора файлов. Рис. 4. 5.3.2.2. Перемещение в менюДля отображения текущего выбранного пункта меню, FACE использует два метода. Первый метод - это отображение некоторого графического символа слева от пункта меню. Например, на некоторых терминалах в качестве этого символа используется знак больше (">"), на других - знак подчеркивания ("_"). Второй метод используется только в случае если ваш терминал поддерживает режим видео инверсии. Видео инверсия это возможность, которая позволяет двухцветовым дисплеям отображать части экрана в противоположных сочетаниях цветов (например, вместо белых символов на черном фоне, части экрана отображаются как черные символы на белом фоне). Если ваш терминал имеет эту возможность, текущей пункт меню будет выделен видео инверсией. В этом руководстве для отображения позиции курсора на рисунках используется знак больше (">"). Все меню FACE используют одни и те же клавиши для перемещения внутри окна. Если ваши функциональные клавиши или именованные клавиши не работают так как описано, используйте альтернативные последовательности. Клавиши для перемещения в меню
Рис. 5. Если меню содержит слишком много пунктов, чтобы отобразить их одновременно, меню может прокручиваться. Перемещаемое меню идентифицируется зоной прокрутки на правой границе экрана. Символы прокрутки в данной зоне показывают направление возможной прокрутки меню. Не все терминалы используют одинаковые графические символы для символов прокрутки. Некоторые терминалы используют символ "^" для показа возможной прокрутки вверх и "v" для прокрутки вниз. Если меню может прокручиваться, также могут могут использоваться и следующие именованные клавиши. Дополнительные клавиши для перемещения в прокручиваемом меню
Рис. 6. Так как главное FACE меню имеет только одну колонку, многие из этих клавиш не могут быть продемонстрированы на этом меню, но вы можете попробовать клавиши со стрелками (или альтернативные последовательности) для перемещения курсора в меню. 5.3.2.3. Выбор пункта менюСледующие короткие примеры демонстрируют два метода выбора пункта меню. Попробуйте оба способа и тогда вы сможете продолжать работать с FACE, наиболее понравившимся способом. Выберите пункт и нажмите ENTER. Пункт меню может быть выбран простым переходом к нему и нажатием клавиши ENTER.
Введите первую букву пункта меню. Второй способ выбора пункта меню заключается в простом наборе его названия.
Если в данном документе вам предлагается выбрать пункт меню, используйте способ который вам кажется удобнее. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Вторым типом окна в 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. Помните, что если ваша клавиатура не имеет некоторых из этих именованных клавиш (или они не работают), вы можете использовать альтернативные последовательности. Клавиши перемещения, используемые в формах
Рис. 10. В следующем примере вы научитесь перемещению в форме Office Functions (функции оффиса) и редактированию его полей. Помните, что в FACE "выбрать" означает, нужно перейти к пункту меню и нажать ENTER. Если курсор выглядит в виде знака подчеркивания (_), его бывает трудно различить при использовании форм, так как поля по умолчанию подчеркнуты. Если вы решили ввести новое значение в поле, первый введенный символ очистит все поле. Если первым символом, который вы ввели является пробел, будет похоже что поле пустое, но это не так. В начале строки присутствует символ пробела и курсор находится во второй позиции этой строки. Если вы забудете удалить этот первый пробел, поле будет выглядеть правильно, но возможно не будет правильно работать.
|
Термин "перемещение", до настоящего момента, применялся только для описания движения внутри окна. Кроме того, вы можете передвигаться от окна к окну. Мы уже использовали для этого два метода:
Для того, чтобы попробовать перемещение от окна к окну без закрытия текущего окна, вам необходимо иметь открытыми несколько окон на вашем FACE экране. Например, чтобы открыть окна "Office of login", "/home/login" и "Корзина для бумаг", проделайте следующее:
Конечно, существуют понятные причины для желания переместиться к другому окну без закрытия текущего. В этой точке сеанса работы с FACE, вы можете захотеть посмотреть меню "Other Users" (другие пользователи) для того, чтобы узнать кому принадлежит некоторый регистрационный идентификатор. Для того, чтобы открыть меню "Other Users" вы должны вернуться назад в Office меню, но возможно вы не хотите закрывать окно "Корзина для бумаг". 5.3.4.1. Переход к другому окну с помощью командной строкиЭтот метод использует номера окон, которые появляются слева от названия каждого открытого окна. Заметьте, что каждое открытое окно имеет уникальный номер, начиная с главного FACE меню с номером 1.
Для перемещения в окно по его номеру, также можно использовать команду "goto". 5.3.4.2. Перемещение от окна к окну с помощью функциональных клавишБольшинство окон, которые появляются на FACE экране имеют метки PREV-FRM и NEXT-FRM, соответствующие функциональным клавишам F4 и F5. Эти функциональные клавиши приводят к перемещению курсора от окна к окну. Причем новое окно становится текущим, вместо предыдущего. Сейчас, меню Office of login должно быть текущим,
5.3.4.3. Перемещение от окна к окну с помощью команды frm-mgmt.Несмотря на то, что командное меню полностью обсуждается в следующем разделе, одна из команд описывается здесь, т.к. она позволяет переходить из окна в окно не закрывая текущее окно. Последуйте следующему примеру:
Вы вероятно заметили существенную разницу между закрытием окна клавишей CANCEL и перемещением от окна к окну, способами описаными здесь. Когда вы закрываете окно клавишей CANCEL, оно пропадает и курсор автоматически перемещается в предыдущее окно. Перейти в окно, которое было закрыто можно только повторив процесс выбора сначала. Однако при выходе из окна только что описанными способами, окно не исчезает, а только становится не активным. Вы можете сделать его активным и продолжать его использовать. |
Каждый раз, когда вы открываете окно, FACE автоматически определяет его размер и положение на экране. FACE располагает окна таким образом, что они не накладываются друг на друга, кроме случаев когда это необходимо. Размер окна выбирается таким, чтобы окно вмещало имена файлов и наборов файлов в отображаемых списках. Команда "frm-mgmt" позволяет вам изменить размеры и положение открытого окна. Кроме того эту команду можно использовать для вывода списка всех открытых окон и активации одного из них. После того как вы измените форму меню или текстового окна, изменение остается в силе, пока не изменится содержимое окна. Если вы закрыли перемещенное, обновленное или измененное окно, или вышли из системы, FACE автоматически переместит и изменит окно, когда вы откроете его в следующий раз. FACE постарается возвратить окно в его первоначальное положение, кроме случаев, когда были открыты другие окна, что делает это не целесообразным. 5.3.5.1. Перемещение окнаМногим нравится когда окна располагаются в специальных местах на экране, например, окно "/home/login" в верхнем правом углу рабочей области. Другие, возможно, захотят переместить окна, чтобы несколько окон были видны одновременно. В следующем примере мы будем использовать команду "frm-mgmt" из командного меню для перемещения окна "/home/login" в другое место вашей рабочей области.
5.3.5.2. Изменение формы окнаВ следующем примере вы измените форму окна /home/login, используя команду "frm-mgmt".
Можно изменить форму только текстовых окон и меню. Изменить окно, являющееся формой, нельзя. |
Командное меню, показанное на рис. 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. В этом примере вы будете использовать только некоторые команды из командного меню. Имеется экранная помощь по каждой команде, описание доступа к ней приводится в разделе "Получение помощи".
|
Средство help является встроеной помощью для пользователя, предоставляя справочную информацию на каждый аспект использования FACE. Данный раздел обсуждает, как получить помощь по конкретным командам, меню и полям форм. Следующий раздел обсуждает как получить помощь о FACE. 5.3.7.1. Помощь по командам, меню и полям форм FACEПомощь по активной команде, меню или полю формы получить очень просто, т.к. команда help всегда вызывается по функциональной клавише F1 (или CTRL-f 1) если помощь в данной точке доступна. Когда активным окном является командное меню, нажатие HELP выводит окно с информацией о том как использовать команду на которую указывает курсор. Когда активным окном является меню, нажатие HELP выведет окно с информацией, описывающей каждый пункт данного меню. Когда активным окном является форма, нажатием HELP выводит окно с информацией о том как заполнять текущее поле. Если вы в командной строке, нажатие HELP выводит меню команд, и дает помощь о команде, которую вы выберете. Следующий пример показывает как получить помощь по команде FACE. Вы можете использовать подобную процедуру и способ перемещения, если вам нужна помощь по конкретному меню или полю формы. Средство Help предоставляет помощь по текущему активному окну или команде.
5.3.7.2. Получение помощи о FACEПомощь о FACE вы можете получить после нажатия клавиши HELP. Эту помощь можно получить из меню "Обзор содержания" ("Overview of Contents"), к которому можно перейти нажатием функциональной клавиши CONTENTS (или CTRL-f 8), отображаемой когда на экране открыто окно помощи. Общая помощь не доступна из первого уровня функциональных клавиш, т.к. она используется менее часто, чем помощь по конкретным командам и окнам. Вы можете попробовать следующий пример из любого окна (если вы толькo что завершили предыдущий пример, будет активным меню "Office of login").
В окне помощи или другом текстовом окне следующие клавиши позволяют вам перемещаться по тексту. Эти клавиши являются добавлением к PREVPAGE и NEXTPAGE. Помните, что если ваша клавиатура не имеет каких-либо именованных клавиш (или они не работают), вы можете использовать альтернативные последовательности. Клавиши перемещения в окне помощи и других текстовых окнах
Рис. 12. |
Вы завершили курс начинающего по оболочке FACE. Если вы хотите выйти из FACE используйте пункт "Выход из FACE" ("Exit FACE") главного FACE меню. Проделайте следующее:
Если FACE запустился автоматически, когда вы зарегистрировались в системе, вы выйдете из системы по выходу из FACE. В противном случае вы вернетесь на подсказку системы UNIX. Вы можете изменить этот режим с помощью пункта "Office Functions" из меню "Preferences". Помните всегда о необходимости выхода из FACE и из вашей системы перед тем как оставить свой терминал. Это предохраняет и ваши файлы и всю компьютерную систему. |
6.1. ВведениеРедактор текстов ed является диалоговой (интерактивной) программой, которая позволяет добавлять, перемещать, удалять текст и извлекать его из других файлов. Имеется возможность замены слова или части слова в тексте как для одной указанной строки, так и для части файла или всего файла. Кроме того, можно просмотреть текстовый файл, напечатать его частично или целиком, напечатать строки, содержащие определенное слово и т.д. ed работает с копией обрабатываемого файла, которая создается в буфере редактора и хранится там в течение всей обработки. Это предохраняет исходный файл от возможных разрушений при совершении грубых ошибок. Сделанные в копии изменения не влияют на исходный файл до тех пор, пока не будет выдана команда записи. Редактор запоминает имя обрабатываемого файла (первоначально - имя исходного загруженного файла). По желанию пользователя это имя можно заменять для получения новых вариантов файла. Если размер файла превышает размер буфера редактора, файл приходится делить на части с помощью команды split, редактировать его по частям, а затем снова объединять с помощью команды cat. Пользователь сообщает редактору, что делать с его текстом, с помощью определенных инструкций, называемых "командами". Команды редактора имеют простую структуру, и в большинстве случаев состоят из одной буквы. Каждая команда печатается на отдельной строке. Иногда перед командой указывается информация о том, какая строка или строки должны подвергаться действию команды. ed не отвечает на большинство команд, не печатает подсказки или сообщения типа "готово". Все вводимые командные строки должны заканчиваться символом <CR>. |
Синтаксис команды: ed [файл]<CR> где файл - имя файла. Если файл с указанным именем существует, в ответ будет выдано число символов в файле. В противном случае редактор выдает строку "?file". 6.2.1. Дозапись текстаЕсли создан пустой файл и необходимо записать в него некоторый текст, следует установить режим дозаписи командой: a в ответ система переведет курсор на новую строку. Для отмены режима дозаписи в первой позиции строки вводится команда "." (точка) , за которой следует символ "конец строки" (<CR>). Символ "." в любой другой позиции не является командой, воспринимается как часть вводимого текста и не приводит к выходу из режима дозаписи. |
Во время работы ed текст находится во временном буфере редактора и, чтобы сохранить его, по концу редактирования необходимо записать содержимое буфера в файл. Для этой цели используется команда записи. Формат команды: w[файл]<CR> где файл - имя файла, в который требуется произвести запись. Если имя файла опущено, запись производится в текущий файл. В результате работы команды содержимое буфера будет скопировано в файл (предыдущая информация в файле будет уничтожена) и выдано сообщение о количестве символов в файле. Если в ответ на попытку записи появляется сообщение "?имя_файла", это означает, что запись в данный файл или справочник закрыта. При записи файла создается копия текста - содержимое буфера не изменяется, так что можно продолжить работу. Рекомендуется время от времени записывать содержимое буфера, т.к. в случае сбоя системы или совершения какой-либо ошибки весь находящийся в буфере текст может быть потерян. 6.4. Выход из редактораДанная команда используется для завершения редактирования текста и выхода из редактора. Формат команды: q<CR> Так как буфер редактора при выполнении команды "q" уничтожается, для сохранения результатов редактирования буфер должен быть предварительно скопирован командой записи "w". Если после изменения информации не была выполнена команда записи, в ответ на первую команду "q" выдается подсказка "?" и никаких действий не производится. При повторном наборе команды осуществляется выход с уничтожением накопленной в буфере информации. |
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.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 символа, печатается на нескольких строках. Чтобы указать, что строка была перенесена и где она была перенесена, в конце каждой части переносимой строки вставляется обратная дробная черта (\). Некоторые управляющие символы:
|
Редактор запоминает последнюю строку, с которой производились какие-либо действия, так что она может использоваться без явного указания номера строки. Ссылка на эту строку производится с помощью символа ".". Точка обозначает номер текущей строки. Ее можно использовать различными способами. В частности, можно ввести: ., $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
|
Данная команда предназначена для удаления одной или группы строк в буфере редактора. Формат команды: [n[, k]]d<CR> где n, k - номера начальной и конечной удаляемых строк. Команде "d" может предшествовать один или два номера строки. Если номер не задан, то редактор удаляет текущую строку. Если задан номер только одной строки, то удаляется указанная строка, текущей становится строка, следующая за удаленной. Если задано два номера строки, то удаляются все строки в указанном интервале от n до k включительно. Текущей строкой всегда становится строка, следующая за последней удаленной строкой, кроме случая, когда удаляется последняя строка буфера. В этом случае текущей станет последняя строка буфера. Пример. 4, $d удаление из буфера строк с 4-й по последнюю включительно. В буфере после выполнения команды останется 3 первых строки. Текущей строкой станет третья строка буфера. |
В некоторых случаях обнаруживается, что внесенные изменения не были необходимы или оказались неверными. Команда отмены редакции может быть использована для приведения только что измененной строки в ее исходное состояние: 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. |
Команда замены "s" предназначена для изменения отдельных слов или символов в пределах одной строки или группы строк. Общий формат команды: [n[, k]]s/x/y/[команда]<CR> где x - группа символов или слов в
строке, которые надо заменить (старый текст); Если номера строк не указаны, замена осуществляется в текущей строке. Если указан номер только одной строки, то замена производится только в одной строке. Для реализации замены в группе строк надо указать номера начальной (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.1. Конструкция /.../Формат команды: /текст/ где "текст" - искомый текст. Редактор просматривает буфер, начиная со строки ".+1" (т.е. следующей за текущей), идет до конца буфера, затем продолжает поиск с первой строки буфера и до текущей строки включительно. При обнаружении строки с заданным текстом редактор распечатывает ее, и эта строка становится текущей. В случае отсутствия в буфере искомого текста редактор возвращается к текущей строке и печатает символ "?". Пример. /lop/ найти в буфере строку, содержащую последовательность символов "lop". Команда поиска в комбинации с другими командами ("a", "i", "s", "t", "m") может успешно использоваться для указания необходимой строки. Примеры. /lop/s//loop/p найти строку, содержащую слово "lop", и заменить его на "loop", затем распечатать эту строку; /текст/i поиск строки, содержащей указанный текст, и вставка перед найденной строкой. В команде "s" искомый текст в левой части можно не указывать. 6.11.2. Конструкция ?...?Редактор производит поиск не только в прямом, но и в обратном направлении. Для этого в команде поиска вместо символа "/" используется символ "?": ?текст? Это удобно в случае, если при редактировании текста необходимо вернуться назад. 6.11.3. Продолжение поискаЕсли при поиске строки с искомым
текстом оказалось, что это не та строка, то для
продолжения поиска нужно задать команду в виде: |
Данная команда используется для вставки в текст строк, вводимых с терминала. Формат команды: [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.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 - номера начальной и конечной
заменяемых строк; По данной команде строки с номерами от "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.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 - номера начальной и конечной
перемещаемых строк; По данной команде строки с номерами от "n" до "k" включительно помещаются после строки с номером "l", причем на прежнем месте эти строки не сохраняются. Пример. 1, 3m$ группу строк с 1-й по 3-ю поместить после последней строки в буфере редактора. Если указан один номер строки, то перемещается только эта строка. Если номер отсутствует, то перемещается текущая строка. Данная команда может успешно использоваться вместе с командой поиска. Например, имеется следующий текст: ПЕРВЫЙ ПАРАГРАФ
(текст)
КОНЕЦ ПЕРВОГО ПАРАГРАФА
ВТОРОЙ ПАРАГРАФ
(текст)
КОНЕЦ ВТОРОГО ПАРАГРАФА
Если необходимо переставить параграфы местами, то это можно выполнить с помощью команды: /ВТОРОЙ/, /КОНЕЦ ВТОРОГО/m/ПЕРВЫЙ/-1 Строки, начиная со строки, содержащей слово "ВТОРОЙ", до строки, содержащей слова "КОНЕЦ ВТОРОГО" включительно, помещаются перед строкой, содержащей слово "ПЕРВЫЙ". По завершинию операции перемещения текущей строкой становится последняя перемещенная строка (в последнем примере - это строка со словами "КОНЕЦ ВТОРОГО"). 6.15.4.2. Копирование строк текста (t)Команда копирования "t" аналогична команде "m", за исключением того, что блок текста не удаляется, а копия этого блока помещается после указанной строки текста. Формат команды: [n[, k]]tl<CR> где n, k - номера начальной и конечной
копируемых строк; если указано только n, то
копируется одна строка с номером n; если номер
строки не указан, то копируется текущая строка; В следующем примере показано, как поместить 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.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.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 иногда в ответ на
введенную вами команду отвечает знаком "?".
Знак "?" означает диагностическое сообщение
при обнаружении ошибки. Команды помощи выдают
вам короткое сообщение, объясняющее причину
ошибки. Существуют две команды помощи: Если попытаться завершить работу с ed, не записав измененный буфер в файл, то появится знак "?". Когда появится "?", введите "h": q<CR>
?
h<CR>
warning: expecting "w"
|
Диагностические сообщения, выдаваемые редактором в процессе работы, крайне лаконичны, это:
Если при вводе команды зарегистрирована какая-либо другая ошибка, редактор сообщит об этом, выдав символ "?". |
В общем случае команды редактора ed состоят из имени команды, которому могут предшествовать один или два номера строк, и после которого для команд "e", "r" и "w" может указываться имя файла. В строке может присутствовать только одна команда, однако команда "p" может следовать после любой другой команды, кроме "e", "r", "w" и "q".
|
7.1. ВведениеЭтот раздел посвящен экранному редактору vi. Редактор vi является мощным средством для создания и редактирования файлов. Он предназначен для работы на видеотерминале и использует окна, посредством которых вы можете просматривать текст файла. Несколько простых команд позволяют вам сделать изменения в тексте, которые очень быстро отображаются на экране. Редактор может отобразить одну или несколько строк текста. Он позволяет вам передвигать курсор в любую точку на экране или в файле, создавать, изменять или удалять текст. Вы можете также использовать некоторые команды построчного редактора, такие как глобальные команды, которые позволяют вам изменять множество появлений некоторой строки символов, используя одну команду. Чтобы двигаться по файлу, вы можете прокручивать текст вперед или назад. Примечание. Не все терминалы обладают способностью прокрутки текста и поэтому средство прокрутки текста редактором vi зависит от типа используемого терминала. Редактор vi имеет более 100 команд. В этом разделе описаны основные команды, которые позволят вам использовать vi просто, но эффективно. Особое внимание будет уделено выполнению следующих задач, позволяющих:
|
В этом подразделе описано, как делать установку конфигурации терминала, чтобы правильно работал редактор 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 очистит экран и отобразит окно, в которое вы можете вводить и редактировать текст. |
Редактор vi функционирует в двух режимах: режим ввода и командный режим. В режиме ввода вы можете добавлять и модифицировать текст; в командном режиме вы можете:
7.4.1. Создание текста в режиме AppendЕсли вы успешно вошли в редактор vi, то сразу же попадаете в командный режим и vi ожидает ввода ваших команд. Чтобы создать текст необходимо:
Если вы указали циклический режим в файле .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.1. Перемещение курсораКлавиши перемещения курсора позволяют
вам перемещать курсор по файлу. Курсор можно
переместить с помощью следующих клавиш: Команды j и k сохраняют позицию курсора на строке. Например, если курсор находился на 17-м символе слева, то когда вы введете команду j или k, то он переместится на новую строку, но будет находиться на 17-м символе. Если символов в новой строке меньше, то курсор переместитcя на последний символ строки. Примечание. Некоторые терминалы имеют специальные символы управления курсором, помеченные стрелками. Эти стрелки можно использовать вместо клавиш h, j, k, l. Если перед h, j, k, l поставить число, то курсор передвинется на количество строк/символов, равных числу. Например, если надо передвинуть курсор на 4 строки вверх, введите 4k. Если вы не можете продвинуться дальше в этом направлении, то vi подаст звуковой сигнал и курсор останется на прежнем месте. Чтобы переместить курсор на 35 строк вниз, введите: 35j Дополнительно к клавишам h и l можно
использовать клавиши SPACEBAR и BACKSPACE для
перемещения курсора вправо или влево. 7.5.2. Удаление текстаЕсли вы хотите удалить символ, переместите курсор к этому символу и нажмите x. Перед x может стоять число, которое говорит о том, сколько символов подряд нужно удалить. Редактор vi так корректирует строку, что на месте удаленного символа не остается пустого промежутка или на месте удаленной строки - пустой строки. 7.5.3. Добавление текстаВ редакторе vi существует две команды для добавления текста: insert(i) и append(a). Чтобы добавить текст с помощью команды i, переместите курсор в нужное место с помощью клавишей h, j, k, l. Затем нажмите i и введите текст. Введенный вами текст появится на экране слева от символа, на который указывает курсор. Этот символ и все остальные справа от курсора будут передвинуты вправо, чтобы освободить место для вашего нового текста. Редактор vi будет хранить символы, вводимые вами, до тех пор, пока вы не нажмете клавишу ESCAPE. Если необходимо, передвинутые символы будут перенесены на следующую строку. Таким же образом вы можете использовать команду a. Отличие состоит в том, что новый текст появится справа от символа, к которому подведен курсор. |
| Когда вы закончите работу с текстом,
необходимо записать содержимое буфера в файл и
возвратить управление 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
|
Ранее вы познакомились с тем, как перемещать курсор с помощью клавишей h, j, k, l, BACKSPACE и SPACEBAR. В этом подразделе приводятся еще несколько команд, которые помогут вам быстро перемещать курсор по экрану. Эти команды выполняются в командном режиме. 7.7.1. Позиционирование курсора на символДля позиционирования курсора на символ в строке существуют три способа:
7.7.1.1. Переместить курсор в начало или конец строкиПереместить курсор на первый или
последний символ в строке можно следующим
образом: 7.7.1.2. Поиск символа в строкеТретий способ позиционирования курсора в строке - это поиск указанного символа на текущей строке. Если символ не найден на текущей строке, то появляется звуковой сигнал и курсор остается на прежнем месте. Существуют команды, которые проводят поиск по шаблону. Они будут описаны далее. Здесь приведем 6 команд для поиска внутри строки: f, F, t, T, ;(двоеточие) и ,(запятая). После f, F, t и T вы можете указать символ:
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 рассматривают пунктуатию как часть слова. Слова разделяются пустым пространством, которое состоит из символов пробел, табуляция и новая строка. Команды позиционирования:
7.7.3. Позиционирование курсора на предложениеРедактор vi также распознает предложения. В редакторе vi предложение заканчивается знаками !, . или ?. Если эти разделители появляются в середине строки, то за ними должны стоять два пробела, чтобы vi их мог распознать. Вы можете перемещать курсор от предложения к предложению в файле с помощью команд ( - открывающая скобка и ) - закрывающая скобка.
7.7.4. Позиционирование курсора по параграфамПараграфы распознаются редактором vi, если они начинаются после пустой строки. Если вы хотите перемещать курсор по параграфам, то при создании текста не забудьте в конце каждого параграфа поставить пустую строку.
7.7.5. Позиционирование в окнеРедактор vi предоставляет вам 3 команды,
которые позволяют вам позиционировать курсор в
окне. Эти команды должны быть введены на верхнем
регистре: В табл. 9 приведены команды перемещения курсора для позиционирования его на символе, строке, предложении, параграфе или позиционирования на экране. Таблица 9
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
В этом подразделе описывается, как переместить
курсор на текст, который не отображен на текущем
экране. Вы можете сделать это следующим образом:
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 подаст звуковой сигнал. |
| Команда G позиционирует курсор на указанную
строку в окне. Если эта строка не находится в
текущем экране, то G очищает экран и отображает
окно, содержащее эту строку. Если не указана
строка, то команда G перемещает курсор на
последнюю строку файла: G - переместить курсор на последнюю строку в файле; nG - переместить курсор на строку n. 7.10. Номера строкКаждая строка файла имеет номер, соответствующий ее положению в буфере. Чтобы получить номер конкретной строки, переместите курсор на эту строку и введите команду: ^g В нижней части экрана команда ^g поместит информацию:
|
Для поиска символов по шаблону вы можете использовать команды /, ?, 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: Команды / и ? не дают вам возможности указать конкретное появление шаблона с помощью числа. То есть, вы не можете, например, запросить поиск 3-го появления шаблона, начиная с текущей позиции. В табл. 10 приведены команды vi для перемещения курсора с помощью прокрутки текста, указания номера строки и поиска по шаблону. Таблица 10
|
||||||||||||||||||||||||||||||
Три основные команды позволяют в
редакторе vi создавать текст: После того, как вы создали текст с помощью одной из этих команд, можете возвратиться в командный режим редактора vi нажав клавишу ESCAPE. 7.12.1. Добавить текстЧтобы в файл добавить текст,
воспользуйтесь следующими командами: 7.12.2. Вставить текстЧтобы в файл вставить текст,
воспользуйтесь следующими командами: Для возврата в командный режим, нажмите клавишу ESCAPE. 7.12.3. Открыть строку для текстаДля открытия строки для текста
воспользуйтесь следующими командами: Команды открытия создают строку непосредственно выше или ниже текущей строки и переводят вас в режим ввода текста. Курсор располагается в начале новой строки и ожидает от вас ввода текста. В табл. 11 приведены команды создания и добавления текста с помощью редактора vi. Таблица 11
|
Вы можете удалить текст с помощью нескольких команд в командном режиме и небольшой объем в режиме ввода. 7.13.1. Удаление текста в режиме ввода текстаЕсли вы находитесь в режиме ввода текста редактора vi и хотите удалить символ, воспользуйтесь клавишей BACKSPACE: BACKSPACE - удалить текущий символ (слева от курсора). Клавиша BACKSPACE перемещает курсор назад в режиме ввода текста и удаляет каждый символ, который курсор переходит. Однако удаленный символ не стирается с экрана пока вы не нажмете клавишу ESCAPE для возврата в командный режим. Удалить текст вы можете и с помощью
следующих ключей: Когда вы вводите ^w, курсор возвращается на последнее введенное слово и ожидает на первом символе этого слова. Он не стирает слово с экрана до тех пор, пока вы не нажмете клавишу ESCAPE или не введете новые символы на месте этого слова. 7.13.2. Отменить последнюю командуОтменить последнюю введенную команду
можно с помощью следующих команд: Если вы случайно удалили строки, то для отмены команды удаления введите команду u. Удаленные строки вновь появятся на экране. Если вы ввели неправильно команду, то введите команду u и неверная команда будет отменена. Команда U будет аннулировать все изменения в текущей строке до тех пор, пока курсор будет находиться на этой строке. Если вы введете команду u дважды, то вторая команда отменит первую. Например, если вы удалили по ошибке строку и восстановили ее с помощью команды u, то нажав второй раз u, вы вновь удалите строку. Знание этих команд может спасти вас от многих неприятностей. |
Многие команды редактора vi, такие как команды удаления и изменения, предоставляют вам возможность использовать в командной строке команды перемещения курсора. Команды перемещения курсора могут указывать на объект текста: слово, строка, предложение, параграф. В этом случае общий формат команды будет такой: [number][command]text_object Квадратные скобки указывают, что данные компоненты не являются обязательными. Все команды удаления, выдаваемые в командном режиме сразу же удаляют указанный текст с экрана и оставшуюся часть отображают на экране в обновленном виде. Команда удаления имеет следующий формат: [number]dtext_object где d - команда удаления; 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
|
||||||||||||||||||||||||||||||
Один из способов модификации текста представляют команды удаления и команды ввода текста. Другой способ, с помощью которого вы можете изменить текст, это задать команду, позволяющую одновременно удалять и создавать текст. В редакторе vi существуют 3 основные команды изменения текста: r, s и c. 7.15.1. Замена текста
Например, вы хотите заменить слово 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. 7.15.3. Изменение текстаКоманда подстановки заменяет символы. Команда изменения заменяет объект текста и затем продолжает добавлять текст с этого места до тех пор, пока вы не нажмете клавишу ESCAPE. Команда изменения может содержать аргумент text_object. Вы можете заменить символ, слово и так далее на новый текст:
Команда "c" использует знак $, чтобы отметить последний символ, который должен быть замещен. После того как выполнилась команда изменения, вы находитесь в режиме ввода текста и можете вводить любой текст. Тескт будет храниться в буфере, пока вы не нажмете клавишу ESCAPE. В табл. 13 приведены команды изменения текста. Таблица 13
|
Редактор 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
Обратите внимание, что эта команда позволяет указывать номер объекта текста, который будет копироваться. |
Перемещение и копирование нескольких разделов текста в различные части файла является утомительной работой. Редактор vi предлагает вам использовать так называемые регистры, в которых вы можете хранить текст до тех пор, пока он вам не понадобится. Сохранить текст вы можете либо с помощью команды "y", либо с помощью команды удаления. Использование регистров особенно полезно, если часть текста должна появиться во многих местах в файле. Извлекаемый текст остается в указанном регистре пока вы не завершите работу с ним, либо закончите работу с редактором, либо поместите в этот регистр другой текст. Общий формат команды: [number]["X]command[text_object] где X - имя регистра, состоящее из одной буквы верхнего регистра. Имени регистра должны предшествовать двойные кавычки. В табл. 15 приведены команды извлечения и присоединения текста. Таблица 15
|
В этом подразделе приведены
специальные команды, которые будут вам весьма
полезны: 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
|
Редактор 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. Провести глобальные изменения
В табл. 17 приведены команды построчного редактора, доступные в редакторе vi. Таблица 17
|
Пять основных команд могут быть использованы для завершения работы с редактором vi. Команды, которым предшествует ":", являются командами построчного редактора:
Например, вы хотите записать в новый файл junk. Введите команду: :w junk<CR> Затем завершите работу с vi: :q<CR> Если вы попытаетесь записать в уже существующий файл, то получите предупреждающее сообщение. Например, если вы попытаетесь записать в файл johnson, система выдаст сообщение: "johnson" File exists - use "w!johnson"
to overwrite
Если вы хотите заменить содержимое существующего файла на содержимое буфера, то воспользуйтесь командой ":w!": :w! johnson<CR> В табл. 18 приведены команды завершения работы с редактором vi. Таблица 18
|
Команда 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
|
В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют:
8.1. МетасимволыВ табл. 20 приведены метасимволы, используемые shell. Таблица 20
Метасимволы используются для поиска имен файлов, посредством их упрощается задача указания файлов или групп файлов как аргументов команды. 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] - то малые буквы. |
shell имеет также и другие символы, которые
выполняют различные полезные функции. 8.2.1. Запуск команды в фоновом режиме (символ &)Некоторые команды shell занимают много времени при выполнении. Эти команды можно запустить в фоновом режиме с использованием &, освобождая тем самым терминал для других задач. Общий формат для запуска команд в фоновом режиме следующий: command &<CR> Примечание. Интерактивные команды shell (например, read) нельзя запускать в фоновом режиме. Когда вы запускаете команду в фоновом режиме, то система UNIX выводит номер процесса. Вы можете использовать этот номер для завершения выполняющейся в фоновом режиме команды. Появившаяся подсказка означает, что терминал свободен и ожидает вашу команду. Запустить команду в фоновом режиме вы можете только в том случае, если ваш терминал предоставляет вам такую возможность. 8.2.2. Последовательное выполнение команд (символ ;)В одной командной строке вы можете указать несколько команд. Эти команды должны быть разделены символом ; (точка с запятой) или символом & (амперсанд): command1; command2; command3<CR> Система UNIX выполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением. Например, введите: cd; pwd; ls<CR> shell выполнит эти команды последовательно:
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 печатает сообщения на экране терминала большими плакатного размера буквами. |
В системе 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 способа, которые дают одинаковый результат:
8.3.5. Подстановка вывода в качестве аргументаВывод большинства команд может использоваться как аргумент в командной строке. Для этого команду заключите между знаками "слабое ударение" (`...`) и поместите ее в командной строке в том месте, где вывод будет трактоваться как аргумент. Например, вы можете подставить вывод конвейера команд date и cut в качестве аргумента в команде banner: $ banner `date | cut -c12-19`<CR> Обратите внимание на результат: система печатает banner с текущим временем. |
В этом подразделе описывается:
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 со следующими командами:
8.4.5. Использование команды nohupВсе процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат: nohup command &<CR> Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки "word" и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку: nohup grep word * > word.list & <CR> Вы можете завершить команду nohup с помощью команды kill. |
Вы можете использовать shell для создания программ. Такие программы называются также процедурами shell. В этом разделе рассказывается как создавать и выполнять программы shell с помощью команд, переменных, позиционных параметров, кодов возврата. Прежде чем создавать программы shell необходимо изучить редактор. 9.1. Программы shell9.1.1. Создание простых программ shellНачнем описание создания простых программ shell, которые выполняют задачи:
С помощью редактора создайте файл 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. Ограничения при именовании программ shellshell программе вы можете дать любое имя, не совпадающее с именами системных команд. Если имя вашей программы совпадает с именем команды системы, то система будет выполнять вашу команду вместо системной. |
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
зарезервировано несколько имен переменных,
которые вы не должны использовать для своих
переменных. Ниже дано краткое описание этих
зарезервированных имен переменных: Значение этих переменных вы можете определить двумя способами. Первый, вы можете ввести: echo $variable_name Система распечатает значение переменной variable_name. Второй способ: вы можете воспользоваться командой env для распечатки значений всех определенных переменных в shell. Для этого введите команду env и система выдаст список всех имен переменных и их значения. 9.2.4. Присвоение значений переменнымЕсли вы редактируете с помощью редактора vi, то знаете, что можно установить значения переменной TERM вводом следующей командной строки: TERM=terminal_name<CR>
export TERM
Это простейший способ присвоения значения переменной. Существует еще несколько способов присвоения:
9.2.4.1. Использование команды readОбщий формат команды read: read variable<CR> Значение, присвоенное командой read переменной variable, будет заменять $variable где бы она не встречалась в программе пользователя. Если программа выполняет команду echo до команды read, то она сможет отобразить только: Type in ... Команда read будет ждать до тех пор, пока вы не введете строку символов и нажмете клавишу <CR>, тем самым присваивая строку переменной. Следующий пример покажет вам, как
написать простую shell программу num.please, содержащую
телефонные номера. Эта программа использует
следующие команды: Программа будет выглядеть следующим образом: Пример. $ cat num.please<CR>
echo Type in the list name:
read name
grep $name home/list
$
Создайте файл list, содержащий несколько фамилий и номеров телефонов. И теперь запустите файл num.please. В следующем примере приводится текст
программы mknum, которая создает список. В
программе mknum используется следующая
последовательность команд: Если вы хотите, чтобы вывод команды 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> |
Язык программирования shell имеет несколько конструкций, которые придадут гибкость вашим программам:
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 для получения значений этих
переменных. Эти переменные содержат следующую
информацию: Переменные вводятся в программу, 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:
Пример. Создадим 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 без выполнения остальных команд в цикле. |
Для нахождения и корректировки ошибок вам могут понадобиться две опции команды sh:
Для примера создадим 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 в файл .profile. Если вы воспользуетесь командой tail, которая отображает несколько последних строк файла, то вы можете увидеть результат добавления этих трех командных строк в файл .profile: $ tail -3 .profile<CR>
echo Good Morning! I am ready to work for you.
stty -tabs
stty echoe
$
|
Несколько переменных, зарезервированных shell, используются в файле .profile. Рассмотрим 4 основные переменные:
|
В этом разделе описывается язык программирования, который позволяет вам легко управлять задачами обработки данных и поиска информации. С помощью 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. |
Для вывода форматированного файла 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" в формате спецификации. |
Вы можете выбрать определенные записи для печати или другой обработки с использованием простых шаблонов. 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.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 также позволяет вам определить собственные функции. |
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). |
Если вы сделаете ошибку в программе 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.1. Шаблоны BEGIN и ENDBEGIN используется для получения управления перед считыванием первой вводной строки, так что любое действие для шаблона 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
|
В качестве шаблона может использоваться любое выражение, вызывающее сравнение между строками символов или цифр. 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 |
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 распознает следующие
последовательности языка программирования Си
внутри регулярных выражений и строк: Например, чтобы напечатать все строки, содержащие табуляцию, воспользуйтесь программой: /\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
|
Составной шаблон комбирирует простые шаблоны с логическими операторами "||" (или), "&&" (и), !(отрицание). Например, нужно напечатать все страны в "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. |
В выражении шаблон-действие, "действие" определяет то, что нужно выполнить с вводными записями, которые отобраны по шаблону. Достаточно часто "действие" - это печать каких-либо выражений, но также может быть комбинацией одного или более выражений. Встроенные переменные В табл. 23 приведены встроенные переменные, которые поддерживает awk. Таблица 23
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 - переменная или имя поля; Например, чтобы вычислить число стран континента "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
Функция rand() возвращает псевдослучайное число с плавающей точкой в диапазоне от 0 до 1, а srand(x) может быть использовано для установки нового начального значения генерирующей программы. Если srand() не имеет аргументов, то начальное значение производится из времени дня. |
Строка констант - это последовательность символов, заключенная в двойные кавычки, как например, "abc", "hello, everyone".Строкаконстант может содержать последовательности escape языка программирования Си для специальных символов. Строковые выражения создаются путем слияния констант, переменных, имен полей, элементов массива, функций и других выражений. Программа: { print NR ":" $0 }
печатает перед каждой записью ее номер и двоеточие без пробела. Три строки: номер записи, двоеточие и запись сливаются и результирующая строка печатается. В табл. 25 приведены встроенные строковые функции, поддерживаемые awk. В этой таблице r представляет собой регулярное выражение (либо как строка, либо как /r/), s и t - строковые выражения, n и p - целые числа. Таблица 25
Функции 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 |
Поля текущей записи могут ссылаться на поле переменных $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 полями. |
Переменные, поля и выражения могут иметь цифровое или строчное значение в соответствии с контекстом. Например, в контексте выражения, подобного следующему: 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
Существуют две идиомы приведения выражения к одному или другому типу:
Чтобы выполнить строковое сравнение между двумя полями, используйте: $1 "" == $2 "" Так значение: "12.34x" равно 12.34, а значение "x12.34" равно нулю. Значение строки арифметического выражения вычисляется путем формирования строки с преобразованием формата выводного файла. Неустановленные переменные имеют цифровое значение 0 (ноль) и строковое значение "". Несуществующие поля имеют только строковое значение ""; они не являются цифровыми. |
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 равно нулю. |
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 имя_массива [индекс] |
awk поддерживает функции, определенные пользователем: function имя( список_аргументов) {
операторы
}
Это определение может появляться в любом месте, где возможен оператор "шаблон-действие". Список аргументов - это список имен переменных, разделенных запятыми. Внутри тела функции эти переменные ссылаются на действительные переменные при вызове функции. Между именем функции и левой круглой скобкой не должно быть пробела, иначе это будет означать конкатенацию. Массив элементов просматривается при обращении, как и в Си. Функция при просмотре не может изменить значение скалярных аргументов. Внутри функции формальные параметры являются локальными переменными, но все другие переменные являются глобальными. У вас может быть любое количество формальных параметров, которые используются только как локальные переменные. Операторreturnявляется необязательным, но если он отсутствует, возвращаемое значение будет неопределенным. 10.19. КомментарииВ программе awk могут присутствовать комментарии. Они начинаются с символа # и заканчиваются символом новой строки: print x,y # это комментарий Операторы обычно занимают одну строку. Несколько операторов могут располагаться на одной строке, тогда они должны разделяться точкой с запятой. Длинный оператор может располагаться на нескольких строках, причем каждая продолжаемая строка должна заканчиваться символом "\". Нельзя продолжить строку вида "....". Такое продолжение встречается редко, однако как только строка заканчивается запятой, операторы продолжаются автоматически. Примером этого служат операторы print и printf, и такое возможно после операторов "&&" и "||". Несколько операторов "шаблон-действие" могут появляться на одной строке, если они разделены точкой с запятой. |
Операторы print и printf являются простейшими конструкциями, которые генерируют вывод. Оператор print используется для образования просто вывода; printf - для форматируемого вывода. Подобно shell awk позволяет вам перенаправлять вывод в файл или в канал. 10.20.1. Оператор printОператор: print expr1, rxpr2, ..., exprn печатает строки каждого выражения, разделенные при помощи разделителей полей и следующими за ними разделителями записей. Оператор: является сокращенной формой оператора: 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 - это строка, содержащая информацию, которая будет печататься, и какое преобразование будет выполняться над выражением. Каждая спецификация начинается с
символа "%", заканчивается буквой, которая
определяет преобразование, и может включать: В табл. 26 приведен список символов преобразования printf. Таблица 26
Примеры оператора 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 (файл) закрывает файл или канал. Когда открывается или закрывается файл, различные строки являются различными командами. |
Наиболее общим способом подачи ввода программе 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()), но не нулевых строк. |
Обычно записи разделяются символами новой строки, так что каждая строка яавяется записью. Такой порядок можно изменить. Если пременная 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
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 является строкой, то кавычки не нужны. |
Наибольшего эффекта 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. В частности, возможно отыскать отдельно адрес, или номер телефона, или имя. |
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) }
|
Командная строка 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]
Ввод-вывод
В print и printf >>file добавляется в file и |command - записывает в канал. Функции func name(parameter list) { statement }
function name(parameter list) { statement }
function-name(expr, expr, ...)
Функции строки
Арифметические функции
Операторы
Регулярные выражения
Встроенные переменные
10.27.1. ОграниченияПри работе с awk вы должны придерживаться следующих ограничений:
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] == "") ... приводит к тому, что он появляется со значением "". |
Файловая система UNIX имеет иерархическую структуру; чаще всего она описывается в виде дерева. Вершина этого дерева - это справочник root. Он обозначается с помощью /. Все другие справочники и файлы берут свое начало из справочника root. Один из путей из root ведет в ваш собственный справочник. Вы можете организовывать и хранить информацию в вашей собственной иерархии справочников и файлов. Другие пути ведут к системным справочникам и доступны всем пользователям. Чтобы получить перечень всех справочников и файлов в справочнике root, введите командную строку: ls -l /<CR> Чтобы перемещаться по файловой структуре, вы можете использовать имена путей. Например, вы можете переместиться в справочник /usr/bin, если введете следующую командную строку: cd /usr/bin<CR> Справочники системы UNIX
Приложение 2. Основные команды системы UNIX
|