
- •История создания unix систем. Мультиплатформенность. Пперечень реализаций ос и в чем их отличие.
- •Возникновение и первая редакция ос unix
- •Исследовательский unix
- •Первый перенос ос unix
- •Седьмая редакция
- •Возникновение группы университета г. Беркли (bsd)
- •Unix System III и первые коммерческие версии системы
- •Основные понятия многопользовательской ос
- •Пользователь
- •Интерфейс пользователя
- •Привилегированный пользователь
- •Программы
- •Команды
- •Процессы
- •Перенаправление ввода/вывода
- •Основные сведения для пользователей Unix
- •Терминал
- •Состав программного обеспечения на примере System V версии 4.0
- •Базовая операционная система
- •Дополнительные пакеты программ
- •Структура ядра операционной системы и функции ядра операционной системы Ядро ос unix
- •Общая организация традиционного ядра ос unix
- •Функции операционной системы
- •Предполагаемая аппаратная среда
- •Прерывания и особые ситуации
- •Уровни прерывания процессора
- •Распределение памяти
- •Структура системы
- •Среда выполнения процессов
- •Специальные символы shell-переменных
- •Специальные символы shell-операторов
- •Команды ос unix
- •Регистрационный каталог" пользователя
- •Общее файловое дерево
- •Первый слой файловой системы
- •Второй слой
- •Символические каналы связи
- •Имя пути
- •Полное имя пути
- •Родственное имя пути
- •Правила именования справочников и файлов
- •Дополнительная информация по файловой системе
- •Перечень специальных символов
- •Минимальный набор команд
- •Организация справочника/каталога
- •Команда mkdir - создать справочник/каталог
- •Команда ls - напечатать содержимое справочника/каталога
- •Часто используемые ключи команды ls
- •Команда cd - изменить текущий справочник
- •Команда rmdir - удалить справочник
- •Доступ к файлу и работа с ним
- •Основные команды
- •Команды cat, pg, pr - распечатать содержимое файла
- •Команда cat
- •Команда pg
- •Команда pr
- •Команда cp - сделать копию файла
- •Команда mv - переименование файла
- •Команда rm - удалить файл
- •Команда wc - подсчет строк, слов и символов
- •Команда chmod - изменить статус файла
- •Как определить права
- •Как изменить существующие права
- •Альтернативный метод
- •Дополнительные команды
- •Команда diff
- •Команда grep
- •Команда sort
- •Режимы редактора
- •Создание текста в режиме Append
- •Выход из режима Append
- •Редактирование текста в командном режиме
- •Перемещение курсора
- •Удаление текста
- •Добавление текста
- •Команда перемещения: - (знак минус)
- •Позиционирование слов
- •Позиционирование в окне
- •Позиционирование курсора на неотображаемом тексте
- •Прокрутка текста
- •Удаление текста
- •Удаление текста в режиме ввода текста
- •Отменить последнюю команду
- •Команды удаления в командном режиме
- •Удаление слов
- •Удаление строк
- •Удаление текста после курсора
- •Модификация текста
- •Замена текста
- •Подстановка текста
- •Изменение текста
- •Извлечение и присоединение текста
- •Перемещение текста
- •Перемещение букв
- •Копирование текста
- •Специальные команды
- •Повторить последнюю команду
- •Объединение строк
- •Очистить окно и восстановить текст
- •Заменить нижний регистр на верхний и vice versa
- •Использование команд построчного редактора
- •Временный возврат к shell
- •Запись текста в новый файл
- •Переход к указанной строке
- •Удалить остаток буфера
- •Добавить файл в буфер
- •Провести глобальные изменения
- •Специальные опции для VI
- •Восстановление потерянного файла
- •Редактирование нескольких файлов
- •Просмотр файла
- •Интерпретатор shell последовательность действий интерпретатора shell
- •Специальные символы shell-переменных
- •Специальные символы shell-операторов
- •Встроенные операторы языка shell
- •Команды System V Bourne Shell
- •Дополнительные команды System V.2
- •Общая характеристика командных языков
- •Базовые возможности семейства командных интерпретаторов
- •1. Синтаксические
- •Связь ос unix с другими компьютерными станциями
- •Печать форматированного файла
- •Простые шаблоны
- •Простые действия
- •Встроенные переменные
- •Определенные пользователем переменные
- •Функции
- •Примеры некоторых полезных программ
- •Сообщения об ошибках
- •Шаблоны
- •Шаблоны begin и end
- •Комбинация шаблонов
- •Область шаблона
- •Поле переменных
- •Операторы управления потоком
- •Массивы
- •Функции, определенные пользователем
- •Комментарии
- •Файлы и каналы
- •Разделители ввода
- •Использование awk с другими командами и с shell
- •Функция system
- •Взаимодействие с shell
- •Примеры использования
- •Генерирование отчетов
- •Дополнительные примеры Частота использования слов
- •Накопление
- •Случайный выбор
- •Возможности shell
- •10.27.1. Ограничения
- •Запуск и остановка системы
Комбинация шаблонов
Составной шаблон комбинирует простые шаблоны с логическими операторами "||" (или), "&&" (и), !(отрицание). Например, нужно напечатать все страны в "Asia" с населением более 500 млн. Следующая программа выполняет выбор всех строк, у которых 4-е поле "Asia" и третье поле превышает 500:
$4 == "Asia" && $3 > 500
Программа:
$4 == "Asia" || $4 == "Africa"
выбирает строки с названиями "Asia" или "Africa" в 4-м поле. Эти же действия можно выполнить с помощью регулярного выражения и альтернативного оператора "|":
$4 ~ /^(Asia|Africa)$/
Оператор отрицания "!" имеет более высокий приоритет, чем "&&" и "||". Операторы "&&" и "||" вычисляются слева направо. Вычисление останавливается, как только истина или ложь будут достигнуты.
Область шаблона
Область шаблона состоит из двух шаблонов, разделенных запятой:
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.
Действие
В выражении шаблон-действие, "действие" определяет то, что нужно выполнить с вводными записями, которые отобраны по шаблону. Достаточно часто "действие" - это печать каких-либо выражений, но также может быть комбинацией одного или более выражений.
Встроенные переменные
В табл. 3 приведены встроенные переменные, которые поддерживает awk.
Таблица 3 Встроенные переменные
Переменная |
Значение |
Умолчание |
ARGC |
Число аргументов команд ной строки |
- |
ARGV |
Массив аргументовной строки командной строки |
- |
FILENAME |
Имя текущего вводного файла |
- |
FNR |
Номер записи в текущем файле |
- |
FS |
Поле разделителя вводного файла |
пробел и/или табуляция |
FN |
Число полей в текущей записи |
- |
NR |
Число считанных на данный момент записей |
- |
OFMT |
Выводной формат для цифр |
%.6g |
OFS |
Разделитель поля выводного файла |
пробел |
ORS |
Разделитель записи выводного поля |
символ новой строки |
RS |
Разделитель записи вводного файла |
то же |
RSTART |
Индекс первого выбранного символа при помощи match() |
- |
RLENGTH |
Длина строки, выбранной при помощи match() |
- |
SUBSEP |
Нижний разделитель |
"\034" |
Арифметические действия
В качестве действия могут использоваться уловные арифметические выражения, чтобы вычислить числовые значения. В качестве простого примера предположим, что нужно напечатать плотность населения для каждой страны в файле countries. Так как второе поле - это площадь в тысячах квадратных километров, а третье поле - это население в миллионах, то выражение:
100 * $3 / $2
дает плотность населения на 1 квадратный километр.
Программа:
{print "%10s %6.1f\n", $1,
1000 *$3 / $2}
печатает название страны и плотность населения:
USSR 30.3
Canada 6.2
China 234.6
USA 60.6
Brazil 35.3
Australia 4.7
India 502.0
Argentina 24.3
Sudan 19.6
Algeria 19.6
Арифметические действия выполняются с плавающей точкой. Арифметическими операторами являются:
+, -, *, /, %, ^
Арифметические выражения создаются при применении этих операторов над константами, переменными, именами полей, элементами массивов, функциями и другими выражениями. awk делает присвоения подобно присвоениям в языке программирования Си. Простейшей формой присвоения является:
v = e
где v - переменная или имя поля;
e - выражение.
Например, чтобы вычислить число стран континента "Asia" и общее количество населения, вы должны написать:
$4 == "Asia" { pop = pop = $3; n = n + 1 }
END { print "population of", n,
"Asian countries in million is", pop }
Относительно файла countries эта программа выдает результат:
population of 3 Asian countries in
million is 1765
Действие, связанное с шаблоном $4 == "Asia" выполняет 2 назначения, одно - накопление населения и другое - подсчет стран.
Назначения в предыдущей программе могут быть записаны более сжато с использованием операторов "+=" и "++":
$4 == "Asia" {pop += $3; ++n}
Оператор "+=" заимствован из языка программирования Си, следовательно:
pop += $3
аналогично:
pop = pop + $3
но оператор "+=" короче и работает быстрее.
Операторами назначения являются:
+=, -=, *=, /=, %=, ^=
Операторами приращения являются "++" и "--". Как и в языке Си они могут использоваться как префиксные (++x) или постфиксные (x++) операторы. Если x равно 1, то "i = ++x" увеличивает x, затем устанавливает i равным 2, в то время как "i = x++" устанавливает i равным 1, затем увеличивает x. Аналогичная интерпретация для префиксного и постфиксного операторов "--".
Операторы присвоения, увеличения и уменьшения могут использоваться в арифметических выражениях.
Мы используем установки по умолчанию в следующих программах, которые находят страны с наибольшим населением:
maxpop < $3 { maxpop = $3; country = $1 }
END { print country, maxpop }
Обратите внимание, что эта программа будет некорректна, если значение $3 будет отрицательным.
В табл 4 перечислены встроенные арифметические функции.
Таблица 4 Встроенные арифметические функции
Функция |
Возвращаемое значение |
atan2(y,x) |
Арктангенс y/x в пределах от "-пи" до "пи" |
cos(x) |
Косинус x |
exp(x) |
Экспоненциальная функция x |
int(x) |
Целая часть x с усеченными лидирующими нулями |
log(x) |
Натуральный логарифм x |
rang() |
Случайное число между 0 и 1 |
sin(x) |
Синус x |
sqrt(x) |
Квадрат x |
srand(x) |
x - новое начальное значение для rand() |
Функция rand() возвращает псевдослучайное число с плавающей точкой в диапазоне от 0 до 1, а srand(x) может быть использовано для установки нового начального значения генерирующей программы. Если srand() не имеет аргументов, то начальное значение производится из времени дня.
Строки и строковые функции
Строка констант - это последовательность символов, заключенная в двойные кавычки, как например, "abc", "hello, everyone".Строка констант может содержать последовательности escape языка программирования Си для специальных символов.
Строковые выражения создаются путем слияния констант, переменных, имен полей, элементов массива, функций и других выражений.
Программа:
{ print NR ":" $0 }
печатает перед каждой записью ее номер и двоеточие без пробела. Три строки: номер записи, двоеточие и запись сливаются и результирующая строка печатается.
В табл. 5 приведены встроенные строковые функции, поддерживаемые awk. В этой таблице r представляет собой регулярное выражение (либо как строка, либо как /r/), s и t - строковые выражения, n и p - целые числа.
Таблица 5 Встроенные строковые функции awk
Функция |
Описание |
gsub(r, s) |
Глобальная замена s на r в текущей записи; возвращает количество замененных символов |
gsub(r,s, t) |
Глобальная замена s на r в строке t, возвращает количество замененных символов |
index(s,t) |
Возвращает позицию t в s: 0 - если t нет в s |
length(s) |
Возвращает длину s |
matgch(s,r) |
Возвращает позицию s, в которой встречается r; 0 - если r не встретилось |
split(s,a) |
Разделяет s на массив a по FS; возвращает число полей |
split(s,a,r) |
Разделяет s на массив a по r; возвращает число полей |
sprintf(fmt,expr-list) |
Возвращает expr-list, отформатированный в соответствии с форматом строки fmt |
sub(r,s) |
Замещает s на первое r в текущей записи, возвращает количество замен |
sub(r,s,t) |
Заменяет s на первое r в строке t, возвращает количество замен |
substr(s,p) |
Возвращает индекс s, начиная с позиции p |
substr(s,p,n) |
Возвращает подсказку s длиной n, начиная с позиции p |
Функции sub и gsub сформированы после команды замены в текстовом радакторе ed. Функция gsub(r,s,t) заменяет успешное появление подстрок, найденных при помощи регулярного выражения r с заменой строки s в целевой строке t. Функция gsub(r,s) является синонимом gsub(r,s,$0). Например, программа:
{ gsub(/USA/, "United States"); print }
преобразует ввод, меняя появление "USA" на "Unites States". Функция sub подобна ей, за исключением того, что она заменяет первую найденную подстроку в целевой строке.
Функция index(s,t) возвращает левую крайнюю позицию, с которой строка t начинается в s. Первый символ в строке начинается с позиции 1. Например,
index("banana", "an")
возвращает 2.
Функция length возвращает число символов в строке; так:
{ print length($0), $0 }
печатает каждую запись, а перед ней ее длину. ($0 не включает в вводную запись разделитель). Программа:
length($1) > max { max = length($1); name = $1 }
END { print name }
применительно к файлу countries распечатывает наибольшее имя страны:
Australia
Функция match(s,r) возвращает позицию в строке s, в которой появилось регулярное выражение r, либо 0, если оно не найдено. Эта функция также устанавливает две встроенные переменные RSTART и RLENGTH. RSTART принимает значение начальной позиции, найденной в строке, это значение равно возвращаемому значению. RLENGTH принимает значение длины найденной строки. (Если строка не найдена, то RSTART равно 0, а RLENGTH равно -1). Например, следующая программа ищет появление буквы i и за ней сразу или через один символ следует буква a:
{ if (match($0, /i.?a/))
{ print RSTART, RLENGTH, $0 }
Относительно файла countries получим следующий вывод:
17 2 USSR 8650 262 Asia
26 3 Canada 3852 24 North America
3 3 China 3692 866 Asia
24 3 USA 3615 219 North America
27 3 Brazil 3286 116 South America
8 2 Australia 2968 14 Australia
4 2 India 1269 637 Asia
7 3 Argentina 1072 26 South America
17 3 Sudan 968 19 Africa
6 2 Algeria 920 18 Africa
Функция sprintf(format, expr1, expr2, ..., exprn) возвращает (без печати) строку, содержащую expr1, expr2, ..., exprn, отформатированную в соответствии со спецификацией printf в строке format. Выражение:
x = sprintf("%10s %6d", $1, $2)
присваивает x строку, полученную при форматировании $1 и $2 как 10-символьных строк и десятичное число в поле шириной как минимум 6 знаков.
Функция substr(s,p,n) возвращает подстроку s, которая начинается с позиции p и имеет длину не менее n символов. Если используется функция substr(s,p), то подстрока направляется в конец s, так что она состоит из индекса s, начинающегося с позиции p. Например, мы можем сократить имена стран в файле countries до трех символов, вызвав программу:
{ $1 = substr($1, 1, 3); print }
В итоге получим:
USS 8650 262 Asia
Can 3852 24 North America
Chi 3692 866 Asia
USA 3615 219 North America
Bra 3286 116 South America
Aus 2968 14 Australia
Ind 1269 637 Asia
Arg 1072 26 South America
Sud 968 19 Africa
Alg 920 18 Africa
Обратите внимание, что установка $1 в программе приводит к тому, что awk заново вычисляет $0 и, кроме того, поля разделяются пробелами (значение по умолчанию для OFS), но не табуляцией.
Чтобы слить строки, надо просто записать их одна за другой. Например, для файла countries:
{ s = s substr($1, 1, 3) " " }
END { print s }
печатает:
USS Can Chi USA Bra Aus Ind Arg Sud Alg