Файл: Лабораторная Linux №2.doc

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Операционные системы

Добавлен: 20.10.2018

Просмотров: 1769

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа № 2

Поиск текста в файлах по образцу.

Сценарии в командном интерпретаторе BASH.

Команда test и условные операторы в сценариях

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

Продолжительность работы - 4 ч.

Теоретические сведения

Поиск текста в файлах по образцу

При составлении сценариев в ряде случаев полезно использовать функции поиска текста в файлах по образцу. Их выполняют три команды-фильтра grep, fgrep, egrep, имеющие отличия в функциональном назначении. В последних версиях командных интерпретаторов увеличилось количество общих свойств этих функций.

Общая структура этих команд следующая:

$ команда шаблон опции каталоги_файлы

Шаблоны - фрагменты текста, по которым ведется поиск в файлах. Команды имеют разный синтаксис шаблонов. Имя каталога можно не указывать, если файлы находятся в текущем каталоге. Команда fgrep работает для большего количества образцов и файлов, причем быстрее, чем grep, но она не работает с регулярными выражениями, как grep. Команда egrep объединяет возможности grep и fgrep, а также может применять в образцах расширенный набор специальных символов. В последних версиях КИ Bash все эти возможности присутствуют в команде grep.

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

^ - циркумфлекс означает начало строки в описании шаблона;

$ - знак доллара означает конец строки в описании шаблона;

. - знак точка применяется для сопоставления в образце с любым одиночным символом;

[] - квадратные скобки, используются для сравнения семантически схожих классов символов;

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

Структура команды grep следующая:

$ grep образец имя_файла

$ grep 'образец из нескольких слов' имя_файла

Опции команды grep (опции не являются обязательными):

i - выполнить поиск без учета регистра,

n - вывести номера строк, в которых найден образец,

с - вывести на стандартный вывод (обычно на терминал) количество строк, соответствующее образцу,

v - вывести строки, не содержащие образца,

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

Пример 1. Определить, есть ли в файле letter строки, начинающиеся на Hello

$ grep Hello letter

Hello, my dear frend пример результата вывода.

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


$ grep 'Hello, my dear frend' fletter letter letter2

letter:Hello, my dear frend пример результата вывода.

fletter: Hello, my dear frend

Пример 2. Поиск слова while во всех файлах с расширением cpp, расположенных в текущем каталоге:

$ grep while *.cpp

Пример 3. Для команд grep и egrep применяются следующие правила формирования шаблона, использующие регулярные выражения:

$ grep '^пеpвoе_cлoвo_cтpoки_фaйлa' имя_файла;

$ grep 'последнее слово строки файла$' имя_файла;

$ grep 'а*' - ищутся строки с повторяющимися символами а;

$ grep 'а.l' - ищутся строки, где есть словосочетания с неизвестной любой буквой, расположенной между а и l;

Прмер 3. Найти строки со словами, начинающимися с а:

$ grep 'а.'

Структура команды egrep:

$ egrep образцы список_файлов

Команда egrep объединяет возможности grep и fgrep, а также может применять в образцах расширенный набор специальных символов:

(образцы) - круглые скобки для группирования образцов;

 ‑ логический оператор И;

символ? -.поиск одного или нуля предыдущих символов;

символ+ - поиск одного или нескольких повторений предыдущего символа.

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

$ egep 'Hello\!' fileletter

Hello! - пример результата вывода

Пример 5. Найти строки с шаблоном a.x, вместо знака точка подразумевается произвольный символ:

$ egrep 'a.x' file110

$ grep 'a.x' file110

Пример 6. Найти файлы со строками, в которых есть слова, начинающиеся с символа а, или символов аа или ааа и т.д.

$ egrep 'a*' file

$ grep 'a*' file

Пример 7. Поиск слов big или pig:

$ egrep '[bp]ig' file

$ grep '[bp]ig' file

Пример 8. Поиск одного или нескольких символов t:

$ egrep 't+' file8

Пример 9. Поиск одного или 0 символов b:

$ egrep 'b?' file9

Пример 10. Поиск описаний блок-ориентированных устройств (при выполнении $ ls -l строки каталогов начинаются на символ d, строки с именами файлов начинаются на символ "короткое тире" (-), строки с именами блок-ориентированных устройств ‑ на b):

$ lsl grep '^b'

Пример 11. Поиск слов my1, my2, my3, и т.д. до my8

$ grep 'my[1-8]' file

Пример 12. Поиск слов в файле из диапазона, включающего цифры от 1 до 8 ( my1, my2, my3 до my8), и диапазона, включающего символы a, b, c mya, myb, myc

$ grep 'my[1-8a-c]' file

Пример 13. Поиск по двум шаблонам:

$ egrep 'while for /usr/include

Пример 14. Если в образец включены специальные символы, они добавляются в кавычках, так как в качестве специальных символов регулярного выражения и групповых символов командного интерпретатора используются одни и те же символы *, [].

$ lsl grep '^-'

выйдут на печать или будут отображены на экране файлы для чтения:

-rwxr-x--- user1 512 Feb 10 8 34 file1.

$ lsl grep '^d'

На экран выводится список содержимого текущего каталога:

drwxr-x--- user user2 512 Feb 12 8 32 file11

Структура команды fgrep:

$ fgrep образец большой_список_файлов

Команда fgrep не использует символы ^, $, *, , [], \ и регулярные выражения, включающие эти символы. Команда fgrep для регулярных и полных регулярных выражений не работает, но fgrep - очень быстрая команда для известных ей выражений. ОС Linux внешне не реагирует на эту команду, если встречаются непонятные ей выражения в образцах.


Процесс

Любая выполняемая команда в ОС Linux и ОС UNIX порождает процесс - задачу, выполняемую системой. Чтобы посмотреть, какие процессы идут в системе, следует набрать команду: $ ps без опций.

В первой колонке появившегося списка, представляющего собой таблицу, указан хозяин процесса UID, во второй - системный номер процесса PID, или идентификатор процесса, в третьей - время выполнения процесса, в четвёртой колонке – на какое внешнее устройство предполагается вывод, в последнем столбце списка - имя процесса, соответствующее названию команды. Порядок и количество описываемых характеристик зависит от КИ и его версии.

Задание 1. Выполните несколько упражнений по управлению процессами. Возможно, Вы сможете войти в две консоли (терминала) без регистрации, это зависит от установок в системе. Откройте их. Запустите редактор Vim в одной из них и введите небольшой текст. Не записывая текст в файл, переключитесь в другую консоль и просмотрите список всех запущенных процессов с помощью команды: $ ps (с опцией -a). Выясните, какая программа сейчас активна и занимает больше памяти.

Найдите PID для запущенного редактора Vim, для этого, если список процессов большой, используйте команды grep и ps: $ ps | grep vim.

Закройте Vim с помощью команды kill или killall. Запустите Vim ещё раз, вернувшись по истории команд на шаг обратно.

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

Многие команды ОС Linux принимают данные со стандартного ввода или передают на стандартный вывод. По умолчанию в качестве устройства для стандартного ввода используется клавиатура, для стандартного вывода - терминал. Перенаправление стандартного вывода в файл или на устройство обозначается знаком "больше" (>). Стандартный ввод может быть получен не с клавиатуры, а из файла. Оператором перенаправления стандартного ввода является знак "меньше" (<).

Пример 1. Вывести на экран содержимое файла file и записать в новый файл file1 можно, используя перенаправление стандартного ввода-вывода, представляющего байтовый поток. Чтение данных из файла file и запись в fi1le1 в командной строке осуществляются следующим образом:

$ cat < file > file1

То же самое, но только с опцией -i - проверки наличия файла filef:

$ cat < file > -i file1

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

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

$ cat file2 >> file1

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

Пример 2. Чтобы сообщения об ошибках выполнения команды cp записать в файл error, следует выполнить команду:


$ cp fileprog /k1 2> error

Чтобы добавить сообщения об ошибках в файл error, вместо знака (>) предыдущей команды нужно использовать знак добавления (>>):

$ cat fileinfo 2>> error

Ошибка могла возникнуть, если указанные файлы не существуют.

Для передачи результат выполнения команды в другую команду используется символ вертикальной черты | - так называемый программный канал. Другими словами, он передаёт выходные данные команды на вход следующей команды.

Пример 3. Передать в файл filelist список имен файлов текущего каталога, выданный командой ls. Передача данных в данном примере осуществляется по программному каналу: $ ls | cat > filelist.


Сжатие и архивирование файлов

Архивирование выполняется для объединения файлов в один пакет, что часто необходимо для пересылки большого количества небольших файлов по сети, а также для архивирования. Группа файлов имеет меньший объем, чем сумма объемов файлов, что особенно заметно, когда файлы однотипные и их достаточно много. При сетевой пересылке быстрее обработать группу файлов, чем каждый по-отдельности. Сжатие выполняется для уменьшения размеров файлов, предназначено для хранения и пересылки больших файлов, его алгоритмы аналогичны алгоритмам сжатия, используемым в приложениях ОС Windows.

Задание 2. Для изучения возможностей команд архивирования и сжатия проделайте следующие упражнения. Имена файлов и каталогов можете использовать свои.

1. Создайте в каталоге k1 подкаталог k2, включите в него файлы file1, file2, file3. Заархивируйте (без сжатия) командой tar эти 3 файла, архив поместить в том же каталоге, что и файлы:

$ tar cvf имя_каталога/имя_apxивa.tar имена_файлов

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

2. Добавьте в архив еще один файл (из ранее созданных или доступных в системе):

$ tar rvf имя_каталога/имя_apxивa.tar имя_файла.

5. Извлеките файл file3 из архива и поместите в каталог k1:

$ tar xvf имя_архива.tar file3 -C /home/user5/k1/

6. Просмотрите файлы, хранящиеся в архиве:

$ tar tvf имя_каталога/имя_apxивa.tar

7. Сжатие файлов наиболее часто выполняется командой-утилитой gzip, распаковывание - утилитой guzip Сжатые файлы имеют имя такое же, как у файла, расширение - .gz.

Опции команды gzip: v сообщает степень сжатия каждого файла в процентах, где опция -число, которое устанавливает степень сжатия, число от 1 до 9, чем больше число, тем больше степень сжатия, тем дольше выполняется сжатие; по умолчанию степень сжатия равна 6. Команда gzip является утилитой, поскольку имеет большие функциональные возможности. Опция -h выдаёт перечень справочной информации по ним.

Попробуйте сжать Ваш файл, как указано в примере использования утилиты: $ gzip -7 file3


Для распаковывания вместо guzip можно использовать gzip с опцией d. Файлы сжатия и архивирования имеют расширения. Известная уже команда $ ls выводит список имён файлов с их расширениями.

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

$ zcat file3.gz | more

9. Архивированные файлы можно сжимать, в результате получаются файлы, имеющие расширение .tar.gz.

$ gzip имя_каталога/имя_apxивa.tar

$ ls - посмотреть расширение вновь созданного файла.

10. Сначала выполните сжатие, затем архивирование:

$ tar czf archfZ.tar file2

По опции z сначала выполняется сжатие, затем архивирование.

Просмотрите результат: $ ls

11. Сжатие файлов по другому алгоритму сжатия выполняется командой bzip2, восстановление ‑ командой bunzip2, расширения файлов архивов при этом bz2.

Перенесите файл filel в каталог myx/katal, выполните сжатие, если команда есть в системе, просмотрите файлы, выполните восстановление файла: $ bzip2 myx/katal/filel

$ ls -l

$ bunzip2 myx/katal/filel.bz2

12. Посмотрите в справочнике man информацию о командах сжатия zip и compress и на своих примерах проверьте их работу. Форматы их файлов .zip и .Z соответственно. Новые файлы добавить в архив. Опция r команды tar добавляет файлы в архив. Просмотреть созданные структуры, используя команду ls с соответствующими опциями.


Группировка команд

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

знак ; - определение последовательности выполнения команд;

знак & - асинхронное (фоновое) выполнение предшествующей команды;

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

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

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

Пример 1. Найти в системе файл с именем file2. Команду поиска find использовать в фоновом режиме, поиск вести, начиная от корневого каталога /; затем выполнить команду определения путевого каталога pwd, определяющего, где находится пользователь, в обычном режиме.

$ find / -name file2 -print & ввод команды find

818 на терминал выведен номер (PID) фонового процесса

$ pwd ввод команды pwd

/mnt/floppy/laba2 результат работы pwd

$ возвращение в shell

/home/student12/lab/file2 результат работы find

Для группировки команд также могут использоваться фигурные, обозначаемые знаком {}, и круглые, обозначаемые знаком (), скобки. Рассмотрим примеры, сочетающие различные способы группировки. Пусть k1, k2 и k3 - некоторые команды.

Пример 2. Пусть введена групповая команда: