Более полные сведения о UNIXe Этот текст подготовлен НПО "КЛОТО" Оглавление 1. Сведения о процессах и системных вызовах . . . . . . . . 2. Атрибуты процессов . . . . . . . . . . . . . . . . . . . 2.1. Наследуемые файлы . . . . . . . . . . . . . . 2.2. Идентификатор пользователя (UID) и идентифи- катор группы (GID) . . . . . . . . . . . . . . 3. Команды UNIXа . . . . . . . . . . . . . . . . . . . . . 3.1. Контекстный поиск и преобразование текста . . 3.2. Арифметический язык для вычислений с произ- вольной точностью . . . . . . . . . . . . . . 3.3. Изменение прав доступа к файлам . . . . . . . 3.4. Сравнение содержимого двух файлов . . . . . . 3.5. Построчное сравнение двух текстовых файлов . . 3.6. Простые арифметические вычисления с произволь- ной точностью . . . . . . . . . . . . . . . . 3.7. Вывести аргументы командной строки на стан- дартный вывод . . . . . . . . . . . . . . . . 3.8. Разложение целого числа на простые сомножители 3.9. Определение типа файла . . . . . . . . . . . . 3.10. Поиск файлов . . . . . . . . . . . . . . . . 3.11. Контекстный поиск в текстовом файле . . . . . 3.12. Определение идентификатора пользователя и идентификатора группы . . . . . . . . . . . . 3.13. Аварийное завершение процесса . . . . . . . . 3.14. Информация о состоянии процессов . . . . . . 3.15. Сортировка и/или слияние файлов . . . . . . . 3.16 Подсчет количества символов, слов и строк в файле . . . . . . . . . . . . . . . . . . . .  * 1. Сведения о процессах и системных вызовах *  Системные вызовы - это интерфейс между программами и ядром UNIXа. Ядро UNIXа обеспечивает разделение процессора между вы- полняющимися программами, осуществляет управление памятью и другими устройствами, реализует файловую систему. Системные вы- зовы могут использоваться всеми без исключения программами. Программа, находящаяся в стадии выполнения, называется процессом. Так, shell, ожидающий ввода команды, является про- цессом. Все команды UNIXа (кроме встроенных команд shellа) являют- ся обычными программами. Поэтому, получив команду, не являющую- ся встроенной, shell должен вызвать на выполнение программу и передать ей аргументы из командной строки. Для этого shell де- лает следующее: он разделяется на две копии (используя систем- ный вызов fork), отличающиеся лишь тем, что каждая может опре- делить, кем она является: процессом-предком или процессом-по- томком. При этом процессу-потомку достаются по наследству все атрибуты процесса-предка: открытые файлы, переменные окружения, текущая директория и др. Затем процесс-предок переходит в сос- тояние ожидания завершения процесса-потомка (используя систем- ный вызов wait), если только процесс-потомок не был запущен асинхронно. Процесс-потомок издает системный вызов exec, по ко- торому ядро UNIXа подменяет программу, определяющую поведение процесса, и передает ей управление и список аргументов. Наследование атрибутов объясняет, почему так легко можно переназначить стандатный ввод-вывод. Перед тем, как передать управление новой программе, shell (процесс-предок) переназнача- ет свой стандартный ввод-вывод, который и достанется новой программе. Завершив выполнение, процесс-потомок произведет "самоубий- ство" (издав для этого системный вызов exit). При этом все отк- рытые в нем файлы будут закрыты и сам он прекратит существова- ние. Если завершился процесс, у которого были потомки, то эти потомки станут потомками "всеобщего предка", т.е. процесса, за- пущенного при входе в систему. Завершение процесса-потомка при- водит к пробуждению процесса-предка, который получает информа- цию о том, который из процессов-потомков завершил свое сущест- вование и код его завершения. После этого процесс-предок унич- тожит все следы существования процесса-потомка и продолжит вы- полнение своей программы. Каждый процесс при его порождении получает уникальный но- мер, называемый PID (process ID). Номер его процесса-предка - PPID (parent PID). Эти номера можно получить, воспользовавшись командой ps (см. 3.14).  * 2. Атрибуты процессов *  При порождении нового процесса, последний наследует от процесса-предка большинство атрибутов. К ним относятся открытые файлы, переменные окружения, текущая директория, идентификатор пользователя и идентификатор группы и т.д. 2.1. Наследуемые файлы Все файлы, которые были открыты в процессе, издавшем сис- темный вызов fork, будут унаследованы потомком. Если какой-ли- бо из этих процессов решит закрыть один из таких файлов, то доступа к файлу лишится только он сам. Файл может быть доступ- ным и более чем двум процессам-родственникам, если порождено более одного процесса-потомка. При этом все они разделяют единственный указатель на файл. 2.2. Идентификатор пользователя (UID) и идентификатор группы (GID) Для каждого процесса определены права доступа к различным файлам с помощью идентификатора пользователя и идентификатора группы, которые имеет пользователь, запустивший процесс (узнать их можно командой id (см. 3.12)). Эти идентификаторы являются целыми числами и их установка производится в момент входа в систему. Идентификатор пользователя и идентификатор группы, ус- тановленные для процесса, передаются им по наследству всем по- томкам. На самом деле с каждым процессом, кроме действующего иден- тификатора пользователя и действующего идентификатора группы, связаны еще реальный идентификатор пользователя и реальный идентификатор группы. Первые два используются при проверке раз- решения на доступ к файлам, а вторые два определяют пользовате- ля, от имени которого выступает процесс. В большинстве случаев эти идентификаторы совпадают. Однако могут быть установлены такие коды защиты файла, что при обраще- нии к нему (напр. mail, rmdir) переустанавливается либо реаль- ный идентификатор пользователя, либо реальный идентификатор группы, либо и тот и другой, и, таким образом, пользователь по- лучает возможность производить действия от имени пользователя с большими правами.  * 3. Команды UNIXа *  awk - контекстный поиск и преобразование текста bc - арифметический язык для вычислений с произвольной точностью chmod - изменение прав доступа к файлам cmp - сравнение содержимого двух файлов comm - построчное сравнение двух текстовых файлов dc - простые арифметические вычисления с произвольной точ- ностью echo - вывести аргументы командной строки на стандартный вы- вод factor - разложение целого числа на простые сомножители file - определение типа файла find - поиск файлов grep - контекстный поиск в текстовом файле id - определение идентификатора пользователя и идентифика- тора группы kill - аварийное завершение процесса ps - информация о состоянии процессов sort - сортировка и/или слияние файлов wc - подсчет количества символов, слов и строк в файле 3.1. awk - Контекстный поиск и преобразование текста Формат команды: awk [ -Fc ] [ -f ] [ <прог> ] [ <параметры> ] [ <файлы> ] awk сканирует каждый входной файл в поиске строк, удовлет- воряющих какому-либо из шаблонов, определенных в <прог>. Шабло- ны могут либо быть заданы непосредственно в качестве <прог>, либо быть записаны в файл progfile и обработаны командой awk -f progfile [ <файлы> ] Если шаблоны указаны в командной строке, то они должны быть заключены в одинарные кавычки ('). awk могут быть переданы па- раметры в форме x=... y=... и т.д. Примеры см. в конце описа- ния. Файлы читаются в указанном порядке. Если не указано ни од- ного файла, то строки вводятся из стандартного ввода. Файл с именем "-" обозначает стандартный ввод. Ввод для awk делится на записи, разделяемые специальным разделителем. По умолчанию это , и тогда awk обраба- тывает ввод построчно. Разделитель записей можно изменить, пе- реопределив переменную RS. Каждая запись делится на поля, ограниченные разделителями полей. По умолчанию это пробелы. Этот разделитель можно изме- нить, установив переменную FS равной символу c или указав флаг -Fc. Шаблоны командной строки доступны по именам $1, $2, ...; $0 - вся входная строка. Если разделитель записей нулевой, то на самом деле им является пустая строка. Для каждого образца, указанного в <прог>, определяется действие. Указанное действие будет произведено с каждой стро- кой, или полем внутри нее, которая удовлетворяет этому шаблону. Оператор <образец-действие> имеет вид: <шаблон> { <действие> } Каждая строка проверяется на совпадение с каждым шаблоном. При каждом совпадении выполняются все указанные действия. После сравнения со всеми образцами вводится следующая строка и про- цесс сравнения повторяется. Может быть опущен либо шаблон, либо действие, но не оба вместе. Если для данного шаблона не указаны действия, то строка просто копируется в вывод. Если для дейст- вия не определен шаблон, то оно будет выполняться для каждой входной строки. Строки, не удовлетворяющие ни одному образцу, игнорируются. Действие есть последовательность операторов. Так как шаб- лоны и действия могут быть опущены, то, чтобы различать их в программе, последние надо брать в фигурные скобки. Оператор есть одна из конструкций: if ( <условие> ) <оператор> [ else <оператор> ] while ( <условие> ) <оператор> for ( <выражение>; <условие>; <выражение> ) <оператор> break continue [ <оператор> ] ... <переменная> = <выражение> print [ <список выражений> ] [ > <выражение> ] printf <формат> [ , <список выражений> ] [ > <выражение> ] next (пропустить оставшиеся шаблоны и перейти к следующей строке) exit (пропустить оставшиеся строки) Операторы завершаются точкой с запятой, или правой скобкой. Пустой <список выражений> означает всю строку. Выражения строятся из строковых или числовых величин с помощью операций +, -, *, /, % и конкатенации (обозначается пробелом). В выражениях также можно использовать операторы языка C: ++, --, +=, -=, *=, /=, %=. Переменные инициализируются пустой строкой. Переменные могут также быть элементами массива (обоз- начается x[i]) или полями. Индексы массива не обязаны быть це- лыми. Константные строки должны быть заключены в двойные кавыч- ки ("). Оператор print выводит свои аргументы в стандартный вывод (или в файл, если определена часть '> <выражение>'), разделяя их текущим разделителем полей и завершая каждую запись текущим разделителем записей. Оператор printf делает то же самое, но под управлением формата (формат совпадает с форматом функции printf языка C). Встроенная функция length возвращает длину своего аргумен- та, рассматривая его как строку; если аргумент опущен, то возв- ращается длина текущей строки. Определены также следующие встроенные функции: exp, log, sqrt и int (int возвращает целую часть своего аргумента). Функция substr(s, m, n) возвращает n-символьную подстроку строки s, начиная с позиции m. Функция sprintf(<формат>, <выражение>, <выражение>, ...) преобразует выражения в соответствии с указанным форматом (см. printf) и возвращает полученную строку. Шаблон - это логическая комбинация (с помощью !, || ,&& и скобок) регулярных выражений (см. grep (egrep)), заключенных в слэши (/), и относительных выражений (см. ниже). Отдельное ре- гулярное выражение в шаблоне относится ко всей строке. Регуляр- ные выражения могут быть и в относительных выражениях. Шаблон может состоять из двух образцов, разделенных запятой; при этом указанные действия выполняются для всех строк между строкой, удовлетворяющей первому шаблону, и строкой, удовлетворяющей второму шаблону. Относительное выражение - это одна из следующих конструк- ций: <выражение> <опер_сравн> <регул_выражение> <выражение> <опер_отношения> <выражение> где <опер_отношения> - любая из шести операций отношения языка C, <опер_сравн> - это ~ (содержится) или !~ (не содержится). <Условие> - это арифметическое выражение, относительное выражение или их логическая комбинация. Для выполнения каких-либо действий перед первой или после последней строки определены специальные шаблоны BEGIN и END. Например, для использования символа c в качестве разделителя полей можно либо запустить программу с флагом -Fc, либо указать BEGIN { FS = c } Остальные специальные переменные: NF - количество полей в текущей записи NR - порядковый номер текущей записи FILENAME- имя файла, из которого в данный момент произ- водится ввод OFS - разделитель полей при выводе (по умолчанию - пробел) ORS - разделитель записей при выводе (по умолчанию ) OFMT - формат вывода чисел (по умолчанию %.6g) Примеры. 1) Вывести строки файла first, в которых более 72 символов awk 'length > 72' first 2) Вывести первые два поля файла second в обратном порядке awk '{ print $2, $1 }' second 3) Сложить числа, стоящие в первом столбце файла third, и вы- вести сумму и среднее Первый вариант: В файле prog: { s += $1 } END { print "sum is", s, "average is", s/NR } Командная строка: awk -f prog third Второй вариант: awk '{ s += $1 } END { print "sum -",s,"average -",s/NR }' third 4) Вывести поля файла fourth в обратном порядке awk '{ for (i = NF; i > 0; --i) print $i }' fourth 5) Вывести все строки файла fifth, находящиеся между парами start/stop awk '/start/,/stop/' fifth 6) Вывести те строки файла sixth, у которых первое поле не сов- падает с первым полем предыдущей строки awk '$1 != prev { print; prev = $1 }' sixth 7) Распечатать файл seventh, вставляя номер страницы, начиная с пятой, после слова "Page" В файле program: /Page/ { $2 = n++; } { print } Командная строка: awk -f program n=5 seventh 3.2. bc - Арифметический язык для вычислений с произвольной точностью Формат команды: bc [ -c ] [ -l ] [ <файл> ... ] bc - интерактивный процессор для C-подобного языка, позво- ляющего производить арифметику неограниченной точности. Ввод производится из указанных файлов, а затем со стандартного вво- да. Флаг -l означает подключение математической библиотеки для операций произвольной точности. Ниже описывается синтаксис языка bc. L означает любую из букв [a-z], E - выражение, S - оператор. Комментарии строки, заключенные в /* и */. Имена простая переменная: L элемент массива: L [ E ] слова "ibase","obase","scale" Другие операнды числа произвольной длины, возможно со знаком и десятич- ной точкой ( E ) sqrt ( E ) length ( E ) количество значащих десятичных цифр scale ( E ) количество десятичных цифр после запя- той L ( E, ..., E ) Операции + - * / % ^ (% - остаток, ^ - возведение в степень) ++ -- (увеличение и уменьшение на 1; префикс- ные и постфиксные) == <= >= != <> = =+ =- =* =/ =% Операторы E { S; ... ; S } if ( E ) S while ( E ) S for ( E; E; E ) S пустой оператор break quit Определение функции define L ( L, ..., L ) { auto L, ..., L S; ...; S return ( E ) } Функции, определенные в -l библиотеке: s(x) - sin(x) c(x) - cos(x) e(x) - exp(x) l(x) - ln(x) a(x) - arctan(x) j(n,x) - функция Бесселя Все аргументы функциям передаются по значению. Значение оператора, являющегося выражением, печатается, если он не является частью оператора присваивания. Операторы могут разделяться как ; так и . Присваивание scale определяет точность выполнения операций. Присваивание ibase и obase определяет систему счисления для ввода и вывода соот- ветственно. Одна и та же буква может быть одновременно использована как имя простой переменной, имя массива и имя функции. Все пе- ременные являются глобальными. Переменные, описанные как "auto", создаются при входе в функцию. При использовании масси- вов в качестве аргументов функций или при описании их как авто- матических, за именем массива могут следовать пустые квадратные скобки. bc - препроцессор для dc, который он запускает автомати- чески, если только не указан флаг -c (только компиляция). Пример. Вывести sqrt(x) для первых 10 целых чисел. /* определяется точность вычислений */ scale = 20 /* определяется функция */ define r(a) { auto x,y y = a + 1 x = y + 1 while ( y < x ) { x = y y = 0.5 * ( x + a / x ) } return (y) } /* вычисляется значение */ for ( i = 1; i <= 10; i++ ) r(i) /* выход */ quit Замечания. Оператор for должен иметь все три E. Quit интерпретируется при вводе, а не при выполнении. 3.3. chmod - Изменение прав доступа к файлам Формат команды: chmod права файлы Режим доступа к указанным файлам изменяется в соответствии с указанными правами. Права могут быть указаны в абсолютном или в символьном виде. Абсолютный вид - восьмеричное число, являющееся логическим ИЛИ следующих режимов: 04000 - при выполнении переустановить UID пользовате- ля на UID файла 02000 - при выполнении переустановить GID пользовате- ля на GID файла 00400 - доступен для чтения владельцем 00200 - доступен для записи владельцем 00100 - доступен для выполнения владельцем 00040 - доступен для чтения членами группы 00020 - доступен для записи членами группы 00010 - доступен для выполнения членами группы 00004 - доступен для чтения прочими пользователями 00002 - доступен для записи прочими пользователями 00001 - доступен для выполнения прочими пользователями Например, чтобы установить права, позволяющие владельцу читать и писать в файл, а членам группы и прочим пользователям только читать, надо сложить 0400, 0200, 0040 и 0004. Таким об- разом команда будет иметь вид: chmod 644 file Символьный вид: [ <кому> ] <опер> <право> Часть <кому> есть комбинация букв u (владелец), g (группа) и o (прочие). Если часть <кому> опущена или указано a, то это эквивалентно ugo. <опер> может быть: + - разрешить право доступа, - - запре- тить право доступа, = - запретить все права доступа для указан- ных категорий пользователей. <право> - любая комбинация из букв r (читать), w (писать), x (выполнять), s (устанавливать UID или GID). Опустить часть <право> можно только если <опер> есть = для запрещения всех прав. Если надо сделать более одного указания об изменении прав, то, при использовании символьного способа задания прав доступа, в <права> не должно быть пробелов, а указания должны разделять- ся запятыми. Например, команда chmod u+w,go+x file добавит для владельца право писать в файл, а для членов группы и прочих пользователей - право выполнять файл. Права устанавли- ваются в указанной последовательности (слева направо). Изменить права доступа к файлу может только его владелец (или суперпользователь). Для просмотра прав доступа и контроля при их изменении используйте команду ls -l file (права переустановки UID и GID отмечаются буквой s на месте со- ответствующей буквы x: маленькой буквой s, если соответствующая категория пользователей имеет право x, и большой S - если не имеет). Примеры. Пусть файл file имеет права: -rw-rw-rw-, то есть доступен всем на чтение и запись. 1) Запретить запись в файл для прочих пользователей chmod o-w file ( -rw-rw-r-- ) 2) Сделать файл выполняемым chmod +x file ( -rwxrwxr-x ) 3) Лишить членов группы всех прав на доступ к файлу, за исклю- чением чтения chmod g=+r file ( -rwx-w-r-x ) 4) Разрешить переустанавливать UID пользователя на UID файла chmod u+s file ( -rws-w-r-x ) 3.4. cmp - Сравнение содержимого двух файлов Формат команды: cmp [-l] [-s] file1 file2 Сравниваются файлы file1 и file2 (если file1 заменен зна- ком -, то используется стандартный ввод). По умолчанию, cmp не дает никаких сообщений, если файлы совпадают; если файлы отли- чаются, то сообщаются номер строки и позиция в ней, в которой находится первый несовпадающий символ. Если один из файлов яв- ляется началом другого, то выдается сообщение: cmp: EOF on <имя файла> где <имя файла> - более короткий файл. Назначение ключей: -l - вывести номер байта (десятичное) и различающиеся бай- ты (восьмеричное) для каждого несоответствия -s - ничего не печатать, а только вернуть код возврата: если файлы совпадают - 0, если различаются - 1, если пропущен аргумент или доступ для чтения к одному из файлов запрещен - 2. 3.5. comm - Построчное сравнение двух текстовых файлов Формат команды: comm [ - [ 123 ] ] file1 file2 Comm читает файлы file1 и file2 и выводит результаты в три колонки: 1. Строки, имеющиеся только в file1 2. Строки, имеющиеся только в file2 3. Строки, имеющиеся в обоих файлах Знак - на месте имени файла означает стандартный ввод. Флаги 1,2 или 3 подавляют вывод соответствующих колонок. Так, comm -12 выводит строки, общие для двух файлов; comm -23 - имеющиеся только в file1, но отсутствующие в file2; comm -123 не выводит ничего. 3.6. dc - Простые арифметические вычисления с произвольной точностью Формат команды: dc [ файл ] dc - пакет для арифметических вычислений с произвольной точностью. Обычно он оперирует в десятичной системе с целыми, однако можно задать системы счисления для ввода, для вывода, точность вычислений. Общая структура dc - стековый калькулятор, использующий обратную польскую запись. Если аргумент указан, то сначала ввод производится из файла, а потом из стандартного ввода. bc, препроцессор для dc, поддерживает инфиксную нотацию и C-подобный синтаксис для определения функций и управляющих структур в программах (см. 3.2). dc распознает следующие конструкции: <число> - значение числа помещается в стек. <число> - непрерыв- ная строка цифр 0-9. В начале ее может стоять знак подчеркивания (_) для ввода отрицательного числа. <число> может содержать десятичную точку. +-/*%^ - верхние два числа стека складываются (+), вычитаются (-), умножаются (*), берется остаток (%) или второе от вершины число возводится в степень, определяемую числом, находящимся в вершине стека. Оба операнда извлекаются из стека и результат помещается обратно в стек. Показатель степени должен быть целым числом. sx - извлекается вершина стека и помещается в регистр с именем x, где x - любой символ. Если указано S, то x рассматривается как стек и результат помещается в его вершину. lx - значение, хранящееся в регистре x, помещается в стек. Регистр x не меняется. Изначально все регистры иници- ализируются нулем. Если указано L, то регистр расс- матривается как стек и его вершина извлекается и по- мещается в главный стек. d - вершина стека удваивается p - выводится вершина стека (не изменяясь). P извлекает вершину стека и выводит ее как строку. f - печатает все элементы стека. q - завершает работу программы. x - вершина стека рассматривается как команда для dc и выполняется X - вершина стека заменяется количеством цифр в ней после запятой [ ... ] - строка, заключенная в скобки, помещается в вершину стека. x =x -два верхних элемента стека извлекаются и сравнивают- ся. Если они удовлетворяют указанному условию, то со- держимое регистра x рассматривается как команда dc и выполняется. v - верхний элемент стека заменяется квадратным корнем из него. Если он был целым, то корень также округляется. ! - остальная часть строки интерпретируется как команда shellа c - очистить стек i - вершина стека извлекается и используется как основа- ние системы счисления при вводе. I помещает использу- емое при вводе основание системы счисления в вершину стека. o - вершина стека извлекается и используется как основа- ние системы счисления при выводе. O помещает исполь- зуемое при выводе основание системы счисления в вер- шину стека. k - извлекается вершина стека и используется как неотри- цательный масштабный множитель: количество знаков после запятой при выводе, при умножении, делении и возведении в степень. z - в стек помещается количество его элементов Z - число в вершине стека заменяется его длиной (без уче- та десятичной точки и знака минус). ? - со стандартного ввода вводится одна строка и исполня- ется. Пример. Вывести первые 10 значений n! [la1+dsa*pla10>y]sy 0sa1 lyx Сообщения x is unimplemented - x - восьмеричное значение stack empty - в стеке меньше элементов, чем требу- ется Out of pushdown - стек переполнен Nesting Depth - слишком большой уровень вложенности 3.7. echo - Вывести аргументы командной строки на стандартный вывод Команда echo выводит на стандартный вывод свои аргументы, разделяя их пробелами и заканчивая строку . Кроме то- го, поддерживаются следующие договоренности: \b - установить курсор в левый верхний угол экрана \c - не заканчивать строку \f - конец страницы \n - перевод строки \r - возврат каретки \\ - бэкслеш \0xx - от одной до трех восьмеричных цифр, с 0 в на- чале, представляющие код ASCII символа 3.8. Разложение целого числа на простые сомножители Формат команды: factor [ <число> ] При запуске без аргументов вводит числа из стандартного ввода. Максимально допустимое число - 2ƒЕƒЖ (~ 7.2*10ƒБƒЖ). Ввод отрицательных чисел приводит к сообщению: Ouch! а нечисловых символов к завершению программы. Время вычислений пропорционально корню из числа и макси- мально, если число является простым или квадратом простого. 3.9. file - Определение типа файла Формат команды: file [ -f ffile ] <аргумент> ... Команда file проводит серию тестов для каждого аргумента, считая его именем файла, пытаясь классифицировать его. Если файл текстовый, то file пытается по первым 512 байтам опреде- лить язык программирования. При задании флага -f следующий за ним файл должен содер- жать список файлов, подлежащих исследованию. 3.10. find - Поиск файлов Формат команды: find <список поиска> <выражение> Find рекурсивно просматривает директории для каждого эле- мента списка поиска, отыскивая файлы, удовлетворяющие логичес- кому <выражению>, записанному с помощью приведенных ниже прими- тивов. В их описаниях n используется как целое десятичное чис- ло, +n означает больше, чем n, -n - меньше, чем n. -name <файл> истина, если текущий файл удовлетворяет шаблону <файл> -perm onum истина, если код защиты файла в точности равен onum (см. chmod) -type c истина, если тип файла c, где c - b, c, d, p, или f - блок- или символьноориентированный спе- циальный файл, директория, канал (pipe) или обычный файл -links n истина, если файл имеет n связей -user uname истина, если UID файла совпадает с uname -group gname истина, если GID файла совпадает с gname -size n[c] истина, если файл занимает n блоков (по 512 байт). Если указана буква c, то размер файла задается в символах -atime n истина, если файл не читался в последние n дней -mtime n истина, если файл не модифицировался в послед- ние n дней -ctime n истина, если права доступа к файлу не менялись в последние n дней -exec cmd истина, если после выполнения команды cmd возв- ращается нулевой код возврата. Cmd может закан- чиваться точкой с запятой, которая должна быть экранирована. Аргумент команды {} заменяется именем текущего файла -ok cmd то же, что и exec, за исключением того, что перед выполнением cmd запрашивается подтвержде- ние и cmd выполняется только при ответе y -print всегда истина; выводит имя файла (выражение) истина, если истинно заключенное в скобки выра- жение (скобки должны быть экранированы) Примитивы могут комбинироваться с помощью следующих опера- ций (в порядке уменьшения приоритета): 1) Отрицание (! - унарная операция NOT) 2) Конкатенация (операция AND, обозначается пробелом) 3) Выбор (-о - операция OR) Пример. Удалить все файлы с именами a.out или *.o, которые не открывались в течение недели: find / \( -name a.out -o -name '*.o' \) -atime +7 -exec rm {} \; 3.11. grep - Контекстный поиск в текстовом файле Контекстный поиск в текстовом файле выполняют три програм- мы: grep, egrep и fgrep. Формат команд: grep [ флаги ] выражение [ файлы ] egrep [ флаги ] [ выражение ] [ файлы ] fgrep [ флаги ] [ строки ] [ файлы ] Команды просматривают входные файлы (по умолчанию стан- дартный ввод) в поиске строк, удовлетворяющих шаблону. Обычно, каждая найденная строка копируется в стандартный вывод. Шаблоны для grep могут быть только регулярными выражениями (см. "Ин- терпретатор командного языка shell); он использует компактный недетерминированный алгоритм. egrep использует быстрый детерми- нированный алгоритм и поддерживает в качестве шаблонов более совершенные регулярные выражения. Шаблоны в смысле fgrep явля- ются строковыми константами; fgrep быстр и компактен. Программами обрабатываются следующие флаги: -v выводятся все строки, кроме удовлетворяющих шаблону -x выводятся только удовлетворяющие шаблону строки (только для fgrep) -c выводится только количество удовлетворяющих шаблону строк -i при сравнении считать большие и маленькие буквы совпа- дающими -l выводить только имена файлов, в которых есть удовлетво- ряющие шаблону строки -n перед каждой строкой ставить ее номер в файле -b перед каждой строкой ставить номер блока, в котором она найдена. Это используется для определения блока на дис- ке по контексту -s подавлять сообщения об ошибках, типа "несуществующий" или "закрытый для чтения файл" (только для grep) -e выражение то же самое, что и одиночный аргумент <выражение>, но удобно, если <выражение> начинается со знака - (не ра- ботает с grep) -f файл регулярное выражение (egrep) или список строк (fgrep) читаются из файла Во всех случаях, имя файла, в котором есть удовлетворяющие шаблону строки, выводится. Для экранирования символов $, *, [, ^, |, (, ) и \ лучше всего заключать <выражение> в одинарные кавычки '...'. fgrep ищет строки, содержещие одну из <строк>. egrep рассматривает регулярные выражения так же, как и shell (см.) (кроме \( и \) ), но, кроме того: 1. Регулярное выражение, заканчивающееся знаком +, означает од- но или более вхождение его в регулярное выражение. 2. Регулярное выражение, заканчивающееся знаком ?, означает од- но или ни одного вхождение его в регулярное выражение. 3. Два регулярных выражения, разделенные знаком | или , удовлетворяют строке, которой удовлетворяет один из них. 4. Регулярное выражение для группирования может заключаться в скобки. egrep не обрабатывает конструкции типа [a-z]. Если была получена хотя бы одна строка, удовлетворяющая шаблону, возвращается код завершения 0, если не найдено ни од- ной такой строки - 1, при наличии синтаксических ошибок или при наличии файла, недоступного для чтения, (даже если были найдены удовлетворяющие шаблону строки) - 2. 3.12. id - Определение идентификатора пользователя и идентификатора группы Формат команды: id Команда id выдает на стандартный вывод сообщение, содержа- щее UID, GID и соответствующие текстовые имена для текущего процесса. 3.13. kill - Аварийное завершение процесса Формат команды: kill [ -<номер сигнала> ] pid ... kill посылает сигнал 15 указанному процессу. Таким спосо- бом обычно можно завершить процесс, который не отлавливает или не игнорирует сигналы. Номера процессов можно узнать по команде ps (см. 3.14). Номер асинхронно запущенного процесса сообщается shellом при его запуске. Процесс, которому посылается сигнал, должен принадлежать пользователю. Если номер сигнала указан явно, то вместо сигнала 15 посылается он. Команда kill -9 ... убивает процесс, если, конечно, для убийства хватает прав. (О номерах сигналов см. "Интерпретатор командного языка shell") 3.14. ps - Информация о состоянии процессов Формат команды: ps [ флаги ] ps выводит информацию об активных процессах. По умолчанию, информация дается только о процессах, ассоциированных с данным терминалом. Командой ps обрабатываются следующие флаги: -e вывости информацию обо всех процессах -f генерировать полный листинг -l генерировать листинг в длинном формате -t <терминал> выводить информацию только о процессах, связанных с <терминалом> ( <терминал>, это ttyА или console) -p <процесс> выводить информацию только об указанном процессе -u выводить информацию только о процессах, чей UID или входное имя пользователя указано -g выводить информацию только о процессах, GID которых указано Ниже приводятся заголовки колонок листинга и объясняется их содержимое; буквы l и f означают, появляется ли эта колонка при длинном или полном формате листинга; all означает, что дан- ная колонка выводится при любых значениях ключей. F (l) флаги (восьмеричные), сумма которых дает следу- ющие сведения о процессе: 01 в памяти 02 системный процесс 04 в ожидании завершемия ввода-вывода процесс фиксирован в памяти 10 своппирован 20 трассируется другим процессом 40 другие флаги трассировки S (l) Статус процесса: 0 не существует S спящий процесс W ждущий процесс R выполняющийся процесс I выполняется прерываемый системный вызов Z завершенный процесс T остановленный (stopped) процесс X процесс закачивается в память UID (f,l) UID владельца процесса; имя входа в систему вы- водится при указании опции -f PID (all) номер процесса PPID (f,l) номер процесса-предка C (f,l) использование процессора для планирования STIME (f) время запуска процесса PRI (l) приоритет процесса; большее число означает меньший приоритет NI (l) поправка к приоритету ADDR (l) адрес процесса в памяти (указатель на таблицу сегментов), если программа резидентная, иначе дисковый адрес SZ (l) размер образа задачи в блоках WCHAN (l) событие, из-за которого ожидает процесс; для выполняющихся процессов не указывается TTY (all) терминал, с которого был запущен процесс TIME (all) время выполнения процесса CMD (all) имя программы; если указан флаг -f, то выводит- ся полное имя Процесс имеющий предка и завершившийся, но еще ожидаемый этим предком, обозначается . При указании флага -f ps пытается определить имя и аргу- менты, с которыми процесс был создан в памяти или области своп- пинга. Если это не удается, имя процесса заключается в квадрат- ные скобки. 3.15. sort - Сортировка и/или слияние файлов Формат команды: sort [ - cmu ] [ -ooutput ] [ -ykmem ] [ -zrecsz ] [ -dfiMnr ] [ -btx ] [ +pos1 [ -pos2 ]] [ files ] Sort сортирует строки всех указанных файлов одновременно и выводит результат на стандартный вывод. Если имена файлов не указаны, или если в качестве имени файла указан -, информация поступает из стандартного ввода. Сравнения производятся на основе одного или более полей, получаемых из каждой вводимой строки. По умолчанию, такое поле одно и им является сама строка; строки упорядочиваются лекси- кографически в соответствии с кодами набора символов ASCII. Следующие флаги изменяют порядок работы: -c проверить, является ли входной файл уже отсортированным согласно заданным правилам -m только слить файлы; считать их уже отсортированными -u из всех совпадающих строк выводить только одну -ooutput указанное имя является именем файла, в который надо направить вывод; этот файл может совпадать с одним из файлов ввода. Между -o и output могут быть пробелы -ykmem по умолчанию sort использует определенный системой объ- ем памяти; при задании этого флага будет использовано kmem килобайт. Если это число больше или меньше пре- дельно допустимых значений, то будет установлено соот- ветствующее предельное значение. Так, -y0 гарантирует использование минимального объема памяти. По договорен- ности, -y (без аргументов) устанавливает максимальный объем памяти -zrecsz при длине строки больше, чем принято в системе, выпол- нение sort завершается аварийно. Во избежание этого можно указать максимальную длину строки recsz в байтах. Следующие флаги устанавливают способ упорядочения строк: -d "словарный" порядок: при сравнении являются значимыми только буквы, цифры и пробелы -f преобразовывать прописные буквы в строчные -i игнорировать символы с кодами, не лежащими в пределах 040-0176 -M преобразовать первые три символа в прописные и сравнить их с условием того, что "JAN" < "FEB" < ... < "DEC". Остальные значения этих полей считать меньшими "JAN". Этот флаг подразумевает флаг -b (см. далее) -n строки чисел, возможно содержащие пробелы, знак -, де- сятичную точку, сортируются по значениям этих чисел. Этот флаг подразумевает флаг -b (см. далее) -r обратный порядок сортировки Запись +pos1 -pos2 означает, что поле сравнения будет на- чинаться в позиции pos1 и кончаться в позиции pos2. Если -pos2 опущено, то подразумевается конец строки. Указание pos1 и pos2 включает в себя понятие поля - мини- мальной последовательности символов, завершающейся разделителем полей или . По умолчанию, таким разделителем считает- ся первый встреченный пробел в последовательности пробелов. Все остальные пробелы из этой последовательности считаются входящи- ми в следующее поле (например, все пробелы в начале строки вхо- дят в первое поле). Разделители полей могут быть заданы следую- щими флагами: -tx использовать в качестве разделителя полей символ x; каждое вхождение x явля