Добавлен: 20.10.2018
Просмотров: 1773
Скачиваний: 5
СОДЕРЖАНИЕ
Поиск текста в файлах по образцу.
Сценарии в командном интерпретаторе BASH.
Команда test и условные операторы в сценариях
Поиск текста в файлах по образцу
Программные каналы, перенаправление входных и выходных потоков данных
Переменные командного интерпретатора
Командный язык командных интерпретаторов
Сценарии командного интерпретатора и создание собственных команд
Комментарии и командные оболочки
Встроенные переменные сценариев
Лабораторная работа № 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):
$ ls –l 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. Если в образец включены специальные символы, они добавляются в кавычках, так как в качестве специальных символов регулярного выражения и групповых символов командного интерпретатора используются одни и те же символы *, [].
$ ls –l grep '^-'
выйдут на печать или будут отображены на экране файлы для чтения:
-rwxr-x--- user1 512 Feb 10 8 34 file1.
$ ls – l 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. Пусть введена групповая команда: