СОДЕРЖАНИЕ
Поиск текста в файлах по образцу.
Сценарии в командном интерпретаторе 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. Пусть введена групповая команда: