Подсистема управления вводом-выводом



 7.1 Подсистема управления вводом-выводом. Описание. http://lib.ru/BACH/chap10.txt

 7.2 Взаимодействие драйверов с программной и аппаратной средой. http://lib.ru/BACH/chap10.txt - тамже пункт 10.1

 7.3 Файлы устройств и пространства имен. http://www.uchi-it.ru/6/4/5.html

 7.4 Классификация драйверов и устройств в/в. http://sait.tti.sfedu.ru/electro_book/OS/OS/glava_2.html

 7.5 Клонирование устройств.

 7.6 Драйвера модульно-поточной архитектуры (STREAMS).

 7.7 Системные функции и взаимодействие с драйверами http://citforum.ru/operating_systems/bach/glava_90.shtml#_11_1_2

 7.8 Структура драйвера. http://www.frolov-lib.ru/books/bsp.old/v18/ch6.html

Пользователи операционной системы UNIX и программная оболочка ksh.

 8.1 Идентификация и авторизация пользователя.

 8.2 Структура файлов /etc/passwd и /etc/group. Атрибуты пользователя.

 

II.   Вторая группа вопросов: Инструментальные средства ОС UNIX

Инструментальные средства ОС UNIX

 1.1 Структура системы встроенной электронной помощи и команда man.

Встроенной системой электронной помощи является командой man. Вводить ее надо с параметром - именем другой команды или ключевым словом, например, man passwd. В ответ пользователь получает описание соответствующей команды или информацию по теме, обозначенной ключевым словом. Поскольку информация часто не помещается на одном экране, можно пользоваться клавишами [PageUp] и [PageDown], или клавишей пробела. Нажатие клавиши [q] в любой момент приводит к выходу из режима просмотра и возврату в режим ввода команд. В большинстве случаев информация выдается по-английски.

 

Команда man является основным способом подсказки во всех UNIX-системах. Страницы руководства man в Linux делятся на следующие секции:

· команды пользователя

· системные команды

· библиотечные вызовы

· устройства

· форматы файлов

· игры

· разное

· kernel internals

· Tcl/Tk commands

 

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

 1.2 Интерпретатор ksh. Файлы инициализации, служебные и системные переменные.

Командный интерпретатор Korn shell (ksh), совместим с sh по командам и содержит ряд возможностей csh, имеет средства редактирования команд, введенных ранее.

 

Скриптами(файлами) инициализации являются .profile и kshrc.

 

Служебные и системные переменные также называются предопределенными переменными. Они сдержатся в среде окружения командного процессора независимо от установок, которые может сделать пользователь в стартовых скриптах. Имена предопределенных переменных среды окружения во всех командных процессорах пишутся символами верхнего регистра: PATH, USER, TERM, PS1, PS2... В именах переменных среды окружения используются буквы латинского алфавита. Посмотреть список всех переменных окружения можно по команде set.

 

REPL - Переменная по умолчанию для встроенной команды read.

 

RANDOM - Каждый раз при ссылке на этот параметр генерируется случайное целое число. Присваивание этой переменной значения обновляет генератор случайных чисел.

SECONDS - Эта переменная зависит от количества секунд, прошедших со старта оболочки. При присваивании переменной значения это количество прибавляется к приписанному значению, и расширенное значение = приписанное значение + число секунд с момента присваивания.

PS3 - Значение этой переменной используется как приглашение для команды select.

PS4 - Это приглашение, выводимое перед высвечиванием командной строки, когда установлена опция -x (см. раздел 4.5).

PWD - Текущий рабочий каталог, установленный командой cd.

OLDPWD - Предыдущий рабочий каталог, установленный командой cd.

TMOUT - Если заданное значение больше 0, оно рассматривается как количество секунд ожидания ввода после высвечивания первичного приглашения. Если ввод по истечении этого времени не произошел, Bash завершает работу.

 1.3 Встроенные команды и функции программной оболочки ksh.

fc [-e имя_редактора] [-nlr] [первая] [последняя]

fc -s [pat=rep] [команда]

Команда фиксации. В первой форме ряд команд от первой до последней выбирается из списка истории. И первая, и последняя могут быть указаны как строка (чтобы обнаружить самую последнюю команду, начинающуюся с этой строки) или как число (индекс в списке истории, где отрицательное число используется как смещение числа текущей команды). Если последняя команда не указана, ей присваивается первая. Если первая не указана, ей присваивается предыдущая команда для редактирования и -16 для внесения в список. Если дан флаг -l, команды выносятся в виде списка на стандартный вывод. Флаг -n хранит номера команд при составлении списка. Флаг -r меняет порядок списка на обратный. Иначе редактор, заданный в имя_редактора, вызывается файлом, содержащим эти команды. Если имя_редактора не дано, используется значение следующего расширения переменной: ${FCEDIT:-${EDITOR-vi}}. Если задано значение FCEDIT, используется оно, если значение EDITOR оно, если не задано ни то, ни другое, используется vi. Редактирование завершено, когда команды редактирования отображены на экране и выполнены.

Во второй форме "команда" перевыполняется после каждого случая pat, - в некоторых командах он заменен на rep.

Полезно использовать псевдоним r='fc -s' с командой fc, таким образом при наборе r cc выполняется последняя команда, начинающаяся с сс, и при наборе r перевыполняется последняя команда (см. раздел 3.4. "Псевдонимы").

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

typeset - команда typеset обеспечивает согласованность с оболочкой Корна, однако она сделана как рудимент команды declare.

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

Функции описываются с испольэованием следующего синтаксиса:

[function] имя () { список команд; }

Это описывает функцию с именем "имя". Тело функции - "список команд", эаключенный в фигурные скобки. Этот список запускается всегда, когда "имя" указывается как имя команды. Выходное состояние функции - выходное состояние последней команды, выполняемой в теле.

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

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

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

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

- — обычный файл;

d — каталог;

b — файл блочного устройства;

c — файл символьного устройства;

s — доменное гнездо (socket);

p — именованный канал (pipe);

l — символическая ссылка (link).

Далее следуют три группы по три символа, которые и определяют права доступа к файлу соответственно для владельца файла, для группы пользователей, которая сопоставлена данному файлу, и для всех остальных пользователей системы. Права доступа для владельца определены как rwx, что означает, что владелец (root) имеет право читать файл (r), производить запись в этот файл (w), и запускать файл на выполнение (x).

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

chmod wXp имя-файла

где вместо символа w подставляется

· либо символ u (т.е. пользователь, который является владельцем);

· либо g (группа);

· либо o (все пользователи, не входящие в группу, которой принадлежит данный файл);

· Вместо X ставится:

· либо + (предоставляем право);

· либо – (лишаем соответствующего права);

· либо = (установить указанные права вместо имеющихся),

Вместо p — символ, обозначающий соответствующее право:

r (чтение);

w (запись);

x (выполнение).

Команды chown и chgrp

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

 1.5 Команда find и применение метасимволов при подстановке имен файлов.

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

Общий синтаксис команды find имеет следующий вид:

find [список_каталогов] критерий_поиска

Параметр "список_каталогов" определяет, где искать нужный файл. Можно сократить объем поиска, если задать вместо одного корневого каталога список из нескольких каталогов (естественно, тех, в которых может находиться искомый файл).

Началом "критерия_поиска", определяющего, что именно должна искать программа find, считается первый аргумент, начинающийся на "-", "(", ")"', "," или "!". Все аргументы, предшествующие "критерию_поиска", трактуются как имена каталогов, в которых надо производить поиск. Если не указано ни одного пути, поиск производится только в текущем каталоге и его подкаталогах.

Чаще всего шаблоны имен файлов строятся с помощью специальных символов "*" и "?". Значок "*" используется для замены произвольной строки символов. В Linux

"*" — соответствует всем файлам, за исключением скрытых;

".*" — соответствует всем скрытым файлам (но также текущему каталогу "." и каталогу уровнем выше "..": не забывайте об этом!);

"*.*" — соответствует только тем файлам и каталогам, которые имеют "." в середине имени, или оканчиваются на точку;

"p*r" — соответствует и "peter" и "piper";

"*c*" — соответствует и "picked" и "peck".

Значок ?заменяет один произвольный символ, поэтому index?.htm будет соответствовать именам index0.htm, index5.htm и indexa.htm.

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

[user]$ find /home/kos -name *.tmp -print

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

 1.6 Ввод и вывод данных в интерпретаторе ksh, потоки в/в, дескрипторы файлов.

Существует три потока ввода-вывода

· стандартный ввод (standard input или stdin). По этому каналу данные передаются программе;

· стандартный вывод (standard output или stdout). По этому каналу программа выводит результаты своей работы;

· стандартный поток сообщений об ошибках (standard error или stderr). По этому каналу программы выдают информацию об ошибках.

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

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

ad

1.Оператор read получает строку ввода и разбирает ее на отдельные элементы в соответствии с символами разделителями, установленными переменной IFS. Его работа аналогична функции scanf языка C.

2.Оператор используется print для вывода данных (или echo).

3.Оператор используется exec для управления потоками ввода/вывода, если необходимо использование потоков, отличных от stdin (0), stdout(1), stderr (2). Его работа аналогична функции fopen языка C.

4.Не обязательно открывать файл оператором exec, чтобы читать из файла или записывать в него. Можно использовать операторы перенаправления потоков ввода/вывода ( |, <, > )

.

 1.7 Порядок выполнения команд, операторы ||, &&, (), {}.

{} - группирующий скобки

() - объединяющие скобки

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

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

Операторы && и || являются управляющими операторами. Если в командной строке стоит command1 && command2, то command2 выполняется в том, и только в том случае, если статус выхода из команды command1 равен нулю, что говорит об успешном ее завершении. Аналогично, если командная строка имеет вид command1 || command2, то командаcommand2 выполняется тогда, и только тогда, когда статус выхода из команды command1 отличен от нуля.

 1.8 Регулярные выражения и символы экранирования. Семейство команд grep.

В 1940-х и 1950-х годах – изучение простейших машин, которые получили название “конечные автоматы”. Такие автоматы были предложены в качестве модели функционирования человеческого мозга. Этим моделям было дано формальное описание при помощи алгебры, которую назвали “регулярные множества”. Математическая форма записи для регулярных множеств получила название “регулярные выражения”.

 

Регулярные выражения используются для расширенного контекстного поиска и модификации текста. Поддержка регулярных выражения реализована во многих текстовых редакторах, таких как vi, ex и emacs, в программах поиска текста grep/egrep, в потоковых редакторах sed и awk, в языках программирования Perl, PHP, Pyton, Java и т.д. Они широко применяются в программах синтаксического анализа (parser programs).

 

Семейство команд grep состоит из команд grep, egrep и fgrep. Все три команды осуществляют поиск в файле текста на соответствие регулярному выражению и выдают найденные строки на стандартное устройство вывода. Команда egrep является расширенной версией команды grep и позволяет использовать более широкий набор метасимволов при формировании регулярного выражения. Существует свободно распространяемая версия команды grep - GNU grep, которая обычно входит в поставку ОС Linux. В ОС Sun Solaris такая реализация команды находится в каталоге /usr/xpg4/bin. GNU версия команды grep поддерживает расширенный набор метасимволов регулярных выражений, стандарт POSIX и дополнительные ключевые слова командной строки. В семейство также входит рекурсивная реализация - rgrep, которая позволяет работать с полным деревом каталога.

 

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

 1.9 Управляющие конструкции интерпретатора ksh и проверка условий.

Простая команда — это последовательность слов, разделенная пробелами. Первое слово является именем команды, которая будет выполняться, а остальные будут переданы ей как аргументы. Имя команды передается ей как аргумент номер 0 (т.е. имя команды является значением $0). Значение, возвращаемое простой командой — это ее статус завершения, если она завершилась нормально, или (восьмеричное) 200+статус, если она завершилась аварийно.

Список — это последовательность одного или нескольких конвейеров, разделенных символами ;, &, && или || и быть может заканчивающаяся символом ; или &. Из четырех указанных операций ; и & имеют равные приоритеты, меньшие, чем у && и ||. Приоритеты последних также равны между собой. Символ ; означает, что конвейеры будут выполняться последовательно, а &amp; — параллельно. Операция && (||) означает, что список, следующий за ней будет выполняться лишь в том случае, если код завершения предыдущего конвейера нулевой (ненулевой).

Команда — это либо простая команда, либо одна из управляющих конструкций. Кодом завершения команды является код завершения ее последней простой команды.

цикл «if»

оператор вывода

условный оператор

цикл «while»

функции

зарезервированные слова

специальные функции

 1.10 Обработка параметров командной строки, команды shift и getopts.

После того как пользователь ввел команду и нажал Enter для запуска, bash начинает ее обработку.

Обработка команды производится в несколько этапов:

· Раскрытие скобок;

· Замена тильды;

· Подстановка переменных и параметров;

· Командная подстановка;

· Разбиение;

· Замена шаблонов.

Порядок проведения этапов обработки командной строки важен.

Getopts

Мощный инструмент, используемый для разбора аргументов, передаваемых сценарию из командной строки. Это встроенная команда Bash, но имеется и ее "внешний" аналог /usr/bin/getopt, а так же программистам, пишущим на C, хорошо знакома похожая библиотечная функция getopt. Она позволяет обрабатывать серии опций, объединенных в один аргумент и дополнительные аргументы, передаваемые сценарию (например, scriptname -abc -e /usr/local).

С командой getoptsочень тесно взаимосвязаны скрытые переменные. $OPTIND -- указатель на аргумент (OPTion INDex) и $OPTARG (OPTion ARGument) -- дополнительный аргумент опции. Символ двоеточия, следующий за именем опции, указывает на то, что она имеет дополнительный аргумент.

Обычно getoptsупаковывается в цикл while, в каждом проходе цикла извлекается очередная опция и ее аргумент (если он имеется), обрабатывается, затем уменьшается на 1 скрытая переменная $OPTIND и выполняется переход к началу новой итерации.

  Опциям (ключам), передаваемым в сценарий из командной строки, должен предшествовать символ "минус" (-) или "плюс" (+). Этот префикс (- или +) позволяет getoptsотличать опции (ключи) от прочих аргументов. Фактически,getoptsне будет обрабатывать аргументы, если им не предшествует символ – или +, выделение опций будет прекращено как только встретится первый аргумент. Типичная конструкция цикла whileс getoptsнесколько отличается от стандартной из-за отсутствия квадратных скобок, проверяющих условие продолжения цикла. Пример getopts, заменившей устаревшую, и не такую мощную, внешнюю команду getopt.

 1.11 Потоковый редактор awk. Шаблоны и процедуры. Работа с полями и записями.

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

 

Шаблоны представляют собой произвольную логическую комбинацию расширенных регулярных выражений и относительных выражений (relational expressions). С каждым шаблоном в программе может быть связано действие, выполняемое, когда строка файла сопоставляется с шаблоном. Набор пар шаблон-действие можно вводить непосредственно какпрограмму, а можно и в файле, который указывается с помощью опции -f файл_программы. Входные файлы читаются последовательно; если файлы не указаны, читается стандартный входной поток. Имя файла - обозначает стандартный входной поток. Каждая входная строка сопоставляется с шаблоном каждой пары шаблон- действие; для каждого сопоставившегося шаблона выполняется соответствующее действие. Любой аргумент вида переменная=значение рассматривается как присваивание, а не как имя файла, и выполняется в момент, когда он должен был бы открываться, если бы представлял собой имя файла. Опция -v, за которой идет конструкция переменная=значение, представляет собой присваивание, которое должно быть сделано перед выполнением программы; можно задавать любое количество опций -v.

 

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

Шаблонами считаются конструкции вида:
/regular expression/ relational expression pattern-matching expression pattern,pattern BEGIN END

Пара шаблон-действие имеет вид: шаблон { действие }

 

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

Встроенные функции

Команды управления обработкой

 

Каждая сканируемая строка input рассматривается как состоящая из полей, разделенных разделительными символами (по умолчанию – пробел). Строка может содержать максимально до 100 полей.

На поля можно ссылаться из AWK программы следующим образом:

$1 - Первое поле;

... и так далее...

$0 - Ссылается на всю строку целиком.

 1.12 Операторы и встроенные переменные awk. Передача переменных из ksh в awk.

Операторы заканчиваются точкой с запятой, новой строкой или закрывающей фигурной скобкой. Пустой список_выражений означает всю входную строку. Выражения будут иметь строковые или числовые значения, в зависимости от строения, и строятся с использованием операторов +, -, *, /, %, ^ и конкатенации (выполняемой при записи подряд). В выражениях также можно использовать операторы ++, --, +=, -=, *=, /=, %=, ^=, >, >=, <, <=, ==, !=, ?:.

Оператор print выдает аргументы в стандартный выходной поток или в файл, если указано >выражение, или по конвейеру, если указано|команда. Аргументы разделяются текущим разделителем выходных полей и завершаются разделителем выходных записей. Оператор printf форматирует свой список_выражений в соответствии с указанным форматом. Встроенная функция close(выражение) закрывает указанный файл или поток, задаваемый выражением.

Математические функции atan2, cos, exp, log, sin, sqrt являются встроенными.

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

ARGC - Число аргументов в командной строке. Это число не включает параметры программы gawk или текст программы на языке gawk.

ARGIND - Содержит индекс в массиве ARGV имени текущего файла.

ARGV - Массив аргументов командной строки. Индекс может быть от 0 до ARGC-1.

CONVFMT - Содержит формат преобразования чисел, по умолчанию %.6g.

ENVIRON - Массив содержащий значения текущего окружения. Это ассоциативный массив, индексами которого являются имена соответствующих переменных окружения. Например, значением ENVIRON["HOME"] может быть /home/shevel.

ERRNO - Содержит код ошибки, если она возникла во время ввода.

FILENAME - Содержит текущее имя вводного файла.

FNR - Содержит текущий номер записи в текущем вводном файле.

FS - Содержит символ разделителя полей.

IGNORECASE - Если содержит не нулевое значение, то все поисковые операции awk производятся без уч©та регистра, в котором введена конкретная буква. Следует заметить, что это верно в основном для набора символов ISO 8859-1 Latin-1.

NF - Количество полей, на которые разбита текущая строка.

NR - Количество записей обработанных до текущего момента.

OFMT - Выводной формат для чисел. По умолчанию %.6g.

OFS - Символ разделителя полей на выводе.

RS - Символ разделителя записей на вводе.

RT - Терминатор записи. gawk устанавливает RT равным последовательности входного потока, которая удовлетворяет символу или регулярному выражению определ©нному в RS.

RSTART - Индекс первого символа, найденного функцией match() или 0, если нет соответствия.

RLENGTH - Длина строки найденной с помощью функции match() или -1, если ничего не найдено.

SUBSEP - Символ используемый для разделения нескольких индексов в элементах массива. по умолчанию значение SUBSEP равно.

 1.13 Потоковый редактор sed. Команды p, a, i, c, d, s, w, r, q, l. Примеры.

SED - неинтерактивный текстовый редактор, предназначенный для пакетного редактирования файлов. Полезен для:

Редактирования очень больших файлов;

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

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

SED копирует строку из input (стандартный или указываемый набор файлов) в PATTERN SPACE (некоторая область), и к этой строке применяет все команды, адреса которых попадают в PATTERN SPACE . Затем PATTERN SPACE копируется вoutput .

Команда имеет формат:

sed [ -n ] [ -e script ] [ -f sfile ] [ files ]

Команда копирует файлы (по умолчанию со стандартного входа) на стандартный выход, редактирует их в соответствии со своими(!) командами, размещенными в "script" (в командном файле или строке редактора [а не shell!]). По флагу "-f" берет берет файл команд из файла "sfile"; Если есть только опция "-e script", то флаг "-e" можно опустить. Флаг "-n" подавляет вывод (происходящий по умолчанию).

a \Добавить текст, где каждое вхождение новой строки начинается со знака обратного слэша.

i \Вставить текст, где каждое вхождение новой строки начинается со знака обратного слэша.

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

r Добавить текст прочитанный из файла.

p Распечатать текущую область шаблона.

c \ Заместить выбранные строки текстом, где каждое вхождение новой строки начинается со знака обратного слэша.

d Удалить заданную область шаблона. Начать следующий цикл.

l Огласить текущую строку в "визуально однозначной" форме.

s/регулярное_выражение/замена/ Попытаться разыскать регулярное_выражение (regexp) в области шаблона. Если это удалось, то заместить эту часть с заменой.Замена может содержать специальный символ & для обращения к той части области шаблона, которая является соответствием, и специальные управляющие последовательности, от \1 до \9, для обращения к соответствующим разыскиваемым под-выражениям врегулярном_выражении.

w Записать текущую область шаблона в файл.

 

s/to/by/w changes - Заменить в тексте первое вхождение "to" в каждой строке, если таковое есть, на "by" и измененные строки сохранить в файле "changes" .

/iiii/s/[Oo]lga/ Olga V.Galina/p - Заменить в тексте, в строках, где встречается вхождение "iiii" , первое вхождение подстроки "olga" или "Olga" на " Olga V.Galina" , при этом измененные строки выводить на печать.

s/[.,;:?]/*sign& *sign& **/g - Заменить в тексте каждое вхождение одного из знаков ".,;:?" в строку на "*sign& *" , где & будет тем знаком, который стоял прежде, например, "." на "*sign.*" , "?" на "*sign?*" и т. д.

 1.14 Сортировка файлов. Команда sort.

sort - сортирует строки текстовых файлов

Отправляет результат сортировки содержимого указанных ФАЙЛОВ (всех ФАЙЛОВ) на стандартный поток вывода. Все указываемые в командной строке файлы объединяются.

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

-b, --ignore-leading-blanks игнорировать пробелы в начале сортируемых полей или начале ключей

-d, --dictionary-order воспринимать в составе ключей лишь буквы (латинского алфавита), цифры и пробелы, игнорируя все прочие символы

-f, --ignore-case во время сортировки преобразует строчные (маленькие) в соответствующие прописные (большие) буквы, т.е. выполняется сортировка нечувствительная к регистру символов

-g, --general-numeric-sort выполнять сравнение в соответствии с общим числовым значением (используют совместно с параметром -b). Это численная сортировка, при которой дополнительно распознаётся экспоненциальное представление чисел (например, 9.1019e7)

-i, --ignore-nonprinting в ключах рассматриваются только печатаемые (ASCII) символы, а остальные игнорируются

-M, --month-sort выполнять сравнение по трёх-символьным сокращениям англоязычных названий месяцев, т.е. (незнакомое) < `JAN' < ... < `DEC'

-n, --numeric-sort числовая сортировка, т.е. сравнение ведётся по числовому значению (используют совместно с параметром -b)

-r, --reverse сортировка выполняется в обратном порядке (по убыванию)

-c, --check проверяет сортировался ли указанный файл. Если да, то не выполняет сортировку, иначе выводит сообщение об ошибке

-k, --key=ПОЗ1[,ПОЗ2] выбирает ключ сортировки, начиная с позиции ПОЗ1 и заканчивая позицией ПОЗ2 (включительно). Номера полей и смещения символов указываются, начиная с 1

-m, --merge объединяет ранее отсортированные ФАЙЛЫ, которые не сортируются повторно

-o, --output=ФАЙЛ выводит результат в указанный файл ФАЙЛ вместо стандартного вывода

-s, --stable стабилизирует сортировку, не выполняя сравнения последней пересортировки

-S, --buffer-size=РАЗМЕР под основной буфер в памяти использует область размером РАЗМЕР

-t, --field-separator=СИМВОЛ использовать СИМВОЛ в качестве разделителя полей

-T, --temporary-directory=КАТАЛОГ использует указанный КАТАЛОГ для временных файлов, игнорируя переменную окружения $TMPDIR или /tmp; составные параметры могут указывать на различные каталоги

-u, --unique уникальная сортировка: игнорирует повторяющиеся строки. Обычно применяют с параметром -c для проверки сортированных файлов с целью прерывания выполнения, если встретится несколько одинаковых строк подряд; без -c выводится только первая строка из одинаковых

-z, --zero-terminated вместо символа новой строки (newline), завершает строки двоичным 0

--help вывести справку о программе, её параметрах и завершить работу

--version вывести информацию о версии программы и завершить работу

 1.15 Проверка уникальности строк и отдельных полей. Команда uniq.

uniq - выводит или пропускает повторяющиеся строки

Удаляет все кроме одной повторяющиеся строки из ВВОДА (или стандартного ввода) и печатает на ВЫВОД (или стандартный вывод).

Обязательные аргументы для длинных ключей обязательны и для коротких.

-c, --countвыводить число повторов в начале каждой строки

-d, --repeatedвыводить только повторяющиеся строки

-D, --all-repeated[=delimit-method] печатать все повторяющиеся строки delimit-method={none(по умолчанию),prepend,separate} Разделение делается по пустым строкам.

-f, --skip-fields=N не сравнивать первые N полей

-i, --ignore-caseигнорировать регистр при сравнении

-s, --skip-chars=N не сравнивать первые N знаков

-u, --uniqueвыводить только неповторяющиеся строки

-w, --check-chars=N сравнивать только первые N символов в строке

--helpпоказать справку и выйти

--versionпоказать информацию о версии и выйти

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

 1.16 Объединение файлов. Команда join.

join - объединяет строки двух файлов в общее поле

Для каждой пары строк ввода с одинаковыми общими полями, записывает строку в стандартный вывод. По умолчанию общее поле считается первым, поля разделяются пробельными знаками. Если один из ФАЙЛОВ задан как -, читает стандартный ввод.

-a НОМЕР

печатать не имеющие пары строки из файла с заданным номером (1 или 2)

-e СТРОКА

замещать при выводе пустые строки указанной СТРОКОЙ

-i, --ignore-case игнорировать регистр букв при сравнении полей

-j ПОЛЕ

эквивалентно `-1 ПОЛЕ -2 ПОЛЕ'

-o ФОРМАТ

выводить в соответствии с ФОРМАТОМ

-t СИМВОЛ

использовать СИМВОЛ как разделитель поля ввода и поля вывода

-v НОМЕР

как -a НОМЕР, но не печатать имеющие пары строки

-1 ПОЛЕ

считать общим заданное ПОЛЕ файла 1

-2 ПОЛЕ

считать общим заданное ПОЛЕ файла 2

--help

показать справку и выйти

--version

показать информацию о версии и выйти

Если не задан -t СИМВОЛ, используются пробельные символы для разделения, иначе поля разделяются по СИМВОЛУ. Каждое ПОЛЕ является порядковым номером, начиная с 1. ФОРМАТ - это одно или несколько разделяемых запятыми или пробельными знаками описаний формата в виде `НОМЕР_ФАЙЛА.ПОЛЕ' или `0'. По умолчанию ФОРМАТ выводит общее поле, остальные поля из ФАЙЛА1 и остальные поля из ФАЙЛА2, разделенные СИМВОЛОМ.

Важно: ФАЙЛ1 и ФАЙЛ2 должны быть отсортированы по общим полям.

 1.17 Вставка текста. Команда paste.

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

Обязательные аргументы для длинных опций обязательны и для сокращённых опций.

-d, --delimiters=СПИСОК

использовать символы из СПИСКА вместо символа табуляции

-s, --serial

вставлять один файл за раз, а не параллельно с другим

--help

Вывести справку и выйти

--version

Вывести информацию о версии и выйти

 1.18 Команды tee, tr, wc, cut, split, diff, comm, sleep, pwd, set, type, file, du, df, kill, ps, eval.

1. Tee выводит на экран, или же перенаправляет, выходной материал команды и копирует его в файл или в переменную.

tee [ -a ] [ -i ] [ File ... ]

File Один, или более, файл который примет данные от tee.

-a Дописать выходящие данные в конец файла, не переписывая его содержимого

-i Игнорировать ошибки.

 

2.Tr - утилита для преобразования символов. Утилита tr копирует стандартный входной поток в стандартный выходной, подставляя или удаляя некоторые символы. Заданные опции и операнды строка1 и строка2 управляют происходящим преобразованием по ходу копирования отдельных символов и последовательностей символов.

-c, -C Дополняет набор символов, задаваемый строкой 1.

-d Удаляет все вхождения символов, указанных в строке 1.

-s Заменяет повторяющиеся вхождения символа одним символом.

 

3. wc Эта команда предназначена для подсчёта количества строк, символов и слов в указанных файлах. Команда имеет следующий формат:

wc [-clmw] file ...

Можно использовать следующие опции:

-c Вывод только количества байт.

-l Вывод только количества строк.

-m Вывод только количества символов. Отличается от числа байт при многобайтной кодировке.

-w Вывод только количества слов.

 

4 .Cut - выводит выбранные части строк (столбцы) каждого заданного файла

Команда cut выделяет столбцы текста (части строк) из каждого ФАЙЛА и отправляет в стандартный поток вывода. Столбец определяется либо по смещению в символах, либо по смещению в байтах, которое является тем же самым, что и смещение в символах, либо по разделителям.

-b, bytes=СПИСОК выводит только байты из позиций, указанных в СПИСКЕ. Символы <Tab> (табуляции) и backspace (возврат на символ) трактуются подобно другим символам и занимают один байт.

-c,--characters=СПИСОК выводит только символы из позиций, указанных в СПИСКЕ. С одной стороны очень похожа на опцию -b, но в случае интернационализации может отличаться.

-d, --delimiter=РАЗДЕЛИТЕЛЬ задает РАЗДЕЛИТЕЛЬ колонок (полей) входного файла вместо символа табуляции. Применяется совместно с опцией -f.

-f, --fields=СПИСОК выводит только столбцы (поля), перечисленные в СПИСКЕ. По умолчанию столбцы разделяются символами табуляции. Если не задана опция -s, выводит любые строки, которые не содержат символ-разделитель.

-s, --only-delimited не выводит строки, в которых отсутствует разделитель полей. Применяется совместно с опцией -f.

-n не разбивает на части многобайтовые символы (игнорируется).

--output-delimiter=РАЗДЕЛИТЕЛЬ разделяет указанным РАЗДЕЛИТЕЛЕМ поля выходного потока. Применяется совместно с опцией -f. По умолчанию используется разделитель полей входного файла (потока).

--help вывести справку о программе, её опциях и завершить работу.

--version вывести информацию о версии программы и завершить работу.

Одновременно можно использовать только одну из опций -b, -c или -f.

 

5.split - команда, копирующая файл и разбивающая его на отдельные файлы заданной длины. В качестве аргументов ей надо указать имя исходного файла и префикс имен выходных файлов. Имена выходных файлов будут составляться из этого префикса и двух дополнительных букв аа, ab, ас и т. д. (без пробелов и точек между префиксом и буквами). Если префикс имен файлов не задан, то по умолчанию используется х, так что выходные файлы будут называться хаа, xab и т. д.

split [КЛЮЧ] [ВХОД [ПРЕФИКС]] ПРЕФИКСab, …;
по умолчанию размер части равен 1000 строк, а ПРЕФИКС равен «x». Если ФАЙЛ не задан или задан как «-», читает стандартный ввод.

Аргументы, обязательные для длинных ключей, обязательны и для коротких:

-a, --suffix-length=Н использовать суффиксы длины Н (по умолчанию 2)

-b, --bytes=ЧИСЛО записывать в каждый выходной файл заданное ЧИСЛО байт

-C, --line-bytes=ЧИСЛО записывать не более заданного ЧИСЛА байт из строки

-d, --numeric-suffixes использовать числовые, а не алфавитные суффиксы

-l, --lines=ЧИСЛО записывать в каждый выходной файл заданное ЧИСЛО строк

--verbose печатать сообщение в стандартный поток ошибок перед открытием очередного выходного файла

--help показать эту справку и выйти

--version показать информацию о версии и выйти

 

 

6.diff - ищет различия между двумя файлами

В простейшем случае diff сравнивает содержимое двух файлов, from-файла и to-файла. Имя файла - означает, что текст должен читаться из стандартного ввода. В специальном случае diff - - сравнивает копию стандартного ввода с ней же.

Если from-файл -- это каталог, а to-файл -- нет, то diff сравнивает файл from-файл/to-файл с файлом to-file. Точно так же для случая, когда from-файл -- это не каталог, а to-файл -- каталог. Файл, который не является каталогом, не должен быть -.

Если и from-файл, и to-файл -- каталоги, то diff сравнивает соответствующие файлы в обоих каталогах, в алфавитном порядке; данное сравнение будет выполняться рекурсивно, если задана опция -r или опция --recursive . Diff никогда не сравнивает сырое содержимое каталогов, как если бы они были файлами. Полностью заданный файл не может быть стандартным вводом, потому что стандартный ввод не имеет имени и понятие ``файл с таким же именем'' не применяется.

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

 

7.comm - построчно сравнивает два файла

Сравнивает сортированные файлы ФАЙЛ1 и ФАЙЛ2 построчно.

Команда, запущенная без опций, выводит три столбца. Первый столбец содержит строки, уникальные для ФАЙЛА1, второй столбец - строки, уникальные для ФАЙЛА2, третий столбец содержит общие для обоих файлов строки.

-1 не отображать строки, уникальные для ФАЙЛА1

-2 не отображать строки, уникальные для ФАЙЛА2

-3 не отображать общие для обоих файлов строки

--help отображение этой справки

--version вывод информации о версии

 

8.sleep - задежка на указанное время

Остановиться на указанное ЧИСЛО секунд. СУФФИКС может принимать значения `s' для секунд (по умолчанию), `m' для минут, `h' для часов и `d' для дней. Хотя большинство реализаций требуют указания ЧИСЛА, как целого значения, здесь ЧИСЛО может быть числом с плавающей запятой.

--help выдает эту информацию и заканчивает работу

--version выдает информацию о версии и заканчивает работу

 

 

9. Команда pwd (print working directory– печать pабочего каталога) позволяет узнать имя текущего каталога.Утилита pwd использует следующие переменные окружения: PWD Логическое имя текущего рабочего каталога.

 

10. set ХРЕН ЗНАЕТ

11. type ХРЕН ЗНАЕТ

 

12. file определение типа файла.

file [-zL] [-f file] file ...

-f file: Считывает из указанного файла список файлов для проверки.

-L : Определяет тип файлов, указанных по ссылке.

-z : Определяет тип файлов, находящихся в сжатых файлах.

 

du - оценка места на диске, занимаемого файлом

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

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

 

Df - отчёт об использовании дискового пространства

выдаёт отчёт о доступном и использованном дисковом пространстве на файловых системах.

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

 

Kill - посылает сигнал процессу или выводит список допустимых сигналов

Посылает сигнал процессу или выводит список допустимых сигналов

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

-s,--signal=СИГНАЛ, -СИГНАЛ имя или номер посылаемого сигнала

-l,--list вывести имена сигналов или вывести имя сигнала, соответствующее номеру, и наоборот

-t, --table вывести информацию о сигналах в виде таблицы

--help вывести справку и закончить работу

--version вывести информацию о версии и закончить работу

СИГНАЛ может указываться в виде имени (например, `HUP') или номера (например, `1'). Также в качестве СИГНАЛА можно указывать код выхода который программа должна сообщить системе при завершении.

PID - числовой идентификатор процесса. Если число отрицательное, оно определяет группу процесса.

 

Ps - выводящая отчёт о работающих процессах.

Опции, отбирающие процессы для отчёта:

-A: все процессы;

-a: связанные с конкретным терминалом, кроме главных системных процессов сеанса, часто используемая опция;

-N: отрицание выбора;

-d: все процессы, кроме главных системных процессов сеанса;

-e: все процессы;

T: все процессы на конкретном терминале;

a: процессы, связанные с текущим терминалом, а также процессы других пользователей;

r: информация только о работающих процессах;

x: процессы, отсоединённые от терминала.

 

 

eval — Аргументы читаются и соединяются в единую команду. Эта команда затем читается и выполняется командным интерпретатором, а ее статус выхода возвращается в качестве значения команды eval. Если аргументов нет или все аргументы пустые, команда eval возвращает 0.

 1.19 Выполнение команд в фоновом режиме. Команды crontab, at, &, nohup, nice, priocntl

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

command &

Примечание. Интерактивные команды shell (например, read) нельзя запускать в фоновом режиме.

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

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

CRONTAB - используется для добавления, удаления или выведения списка таблиц, используемых для управления демоном cron(8). Каждый пользователь может иметь свои собственные файлы crontab(5), и, хотя эти файлы доступны в /var/cron/tabs они не предназначены для редактирования напрямую.

Первая форма команды используется для установки нового crontab файла из указанного файла или стандартного ввода, если в качестве имени файла используется `-'.

AT - разрешает относительно сложные спецификации времени. Программа принимает время в формате ччмм или чч:мм для запуска задачи в указанное время дня (если это момент уже прошел, используется следующий день.) Можно также указывать midnight полночь ), noonполдень ), или teatime (16:00), можно указывать после времени ``AM'' или ``PM'' для запуска задачи утром или вечером. Можно также указать, в какой день задача будет запущена, указав дату в форме название-месяца день а также (по желанию) год или введя дату в форме ДД.ММ.ВВГГ ДД.ММ.ГГ ММ/ДД/ВВГГ ММ/ДД/ГГММДДВВГГ или ММДДГГ

Год должен быть указан двумя или четырьмя цифрами. Если год указан двумя цифрами, используется ближайшая дата в будущем, которая может находиться в следующем веке, кроме случая, когда указан прошлый год, что считается опечаткой. Формат даты должен совпадать с форматом времени дня. Можно использовать время в форме [`now (сейчас)' ] + число единиц-временигде единицей-времени могут быть минуты часы дни или недели можно указать at запустить задачу сегодня, добавив после времениtoday (сегодня), и запустить задачу завтра, добавив после времени tomorrow (завтра).

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

Запустить КОМАНДУ, игнорирующую сигналы завершения.

--help Вывести справку и выйти

--version Вывести информацию о версии и выйти

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

nice - запускает программу с заданием приоритета.

Запускает КОМАНДУ с указанием приоритета ее выполнения. Без указания КОМАНДЫ выдает текущий приоритет работы. ADJUST по умолчанию равен 10. Диапазон приоритетов расположен от -20 (наивысший приоритет) до 19 (наименьший).

-ADJUST увеличивает приоритет на ADJUST

-n, --adjustment=ADJUST то же, что и -ADJUST

--help выдает эту информацию и заканчивает работу

--version выдает информацию о версии и заканчивает работу

 

priocntl - выдача или установка параметров планировщика для указанных процессов.

Команда priocntl выдает или устанавливает параметры планировщика (scheduling parameters) для указанного процесса или процессов. Ее можно также использовать для выдачи текущей информации о конфигурации планировщика процессов системы или выполнения команды с явно заданными параметрами планировщика.

Процессы разбиваются на разные классы, для каждого из которых применяются свои правила планирования. В настоящее время поддерживаются следующие классы: процессы реального времени, процессы с разделением времени и интерактивные процессы. Характеристики этих классов и специфические опции, которые они поддерживают, описаны ниже в подразделах "Процессы реального времени", "Процессы с разделением времени" и "Интерактивные процессы" раздела "ИСПОЛЬЗОВАНИЕ". При наличии соответствующих прав доступа, команда priocntl позволяет изменить класс и другие параметры планировщика для работающего процесса. В стандартной конфигурации готовые к работе процессы реального времени выполняются перед любыми другими процессами. Поэтому неправильное использование процессов реальнго времени может существенно снизить производительность системы. Если указывается список_идентификаторов, он должен задаваться в командной строке последним, а элементы этого списка должны разделяться пробелами. Если список_идентификаторов не задан, аргумент тип_идентификатора со значением pid, ppid, pgid, sid,taskid, class, uid, gid или projid задают, соответственно, идентификатор процесса, идентификатор родительского процесса, идентификатор группы процессов, идентификатор сеанса, идентификатор задания, класс, идкентификатор пользователя, идентификатор группы или идентификатор проекта самой команды priocntl.

 1.20 Создание и монтирование файловой системы. Команды mkfs, mount, umount, fsck.

mkfs - создаёт новую файловую систему Linux

mkfs используется для создания файловой системы Linux на некотором устройстве, обычно в разделе жёсткого диска. В качестве аргумента filesys для файловой системы может выступать или название устройства (например, /dev/hda1, /dev/sdb2) или точка монтирования (например, /, /usr, /home). Аргументом blocks указывается количество блоков, которые выделяются для использования этой файловой системой.

По окончании работы mkfs возвращает 0 - в случае успеха, а 1 - при неудачной операции.

В общем случае, mkfs является простым конечным интерфейсом к доступным под Linux модулям создания файловых систем, в которых вторая часть сложных имён (mkfs.fstype) как раз и определяет вызываемый модуль. Поиск специфического модуля создания файловой системы осуществляется примерно в следующей последовательности каталогов: /sbin, /sbin/fs, /sbin/fs.d, /etc/fs, /etc. Точный список каталогов определяется во время компиляции, но как минимум содержит /sbin и /sbin/fs, а завершается каталогами, которые перечислены в переменной окружения PATH. Для детальной информации по созданию специфических файловых систем, пожалуйста просмотрите соответствующие электронные справочные страницы (man).

mount, umount - подключает и отключает файловые системы

mount подключает файловую систему, определяемую source (обычно это имя является названием устройства, но может также быть именем каталога или dummy), к каталогу, заданному в target.

umount и umount2 отключает (самую последнюю) файловую систему, подключенную к target.

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

Значения для аргумента filesystemtype поддерживаемые ядром, перечислены в /proc/filesystems (например: "minix", "ext2", "msdos", "proc", "nfs", "iso9660" и т.п.). остальные типы могут стать доступными, если будут загружены соответствующие модули.

 

fsck — команда UNIX, которая проверяет и устраняет ошибки в файловой системе.

fsck используется для проверки и, в случае необходимости, исправления ошибок одной или нескольких файловых систем. filesys может быть именем устройства (например, /dev/sda7), точкой монтирования этого блочного устройства (/, /mnt/sda7 и т. д.), меткой раздела или UUID-индексом. Обычно fsck параллельно проверяет данные на разныхфизических дисках, чтобы сократить общее время, необходимое для полной проверки всех дисков.

Если файловых систем не указано и не указана опция -A, то fsck по порядку проверит файловые системы, указанные в /etc/fstab. Это эквивалентно опции -As. Код, возвращаемый fsck, является суммой следующих условий:

0 — нет ошибок

1 — ошибки файловой системы исправлены

2 — необходима перезагрузка системы

4 — ошибки файловой системы не исправлены

8 — в процессе проверки произошли ошибки

16 — неверное использование команды либо синтаксическая ошибка

32 — fsck была прервана пользователем

128 — ошибка разделяемых объектов

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

 

 


Дата добавления: 2018-04-04; просмотров: 411; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!