Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Работа с файлами и каталогами ⇐ ПредыдущаяСтр 2 из 2
Чтобы выдать список всех имен файлов текущего каталога, можно с равным успехом использовать либо команду «echo *», либо команду ls без параметров. Имена будут выданы в одну строку и разделены пробелами. Если нужен иной (не текущий) каталог, можно указать его имя, например: «echo home/student/*» или «ls home/student». Команда «ls -l» выдает имена файлов по одному в строке, сопровождая имена основной информацией о файлах. Если нужно выдать лишь имена файлов, соответствующие некоторому шаблону, то следует указать в команде требуемый шаблон, например: «ls a*[123]» – выдать все имена файлов, начинающиеся с буквы a и заканчивающиеся одной из цифр 1, 2 или 3. Команда cat выдает уже не имена, а содержимое заданных файлов. Например, «cat * > sumfile» означает: «объединить содержимое всех файлов текущего каталога и записать результат в файл sumfile». Рассмотрим в качестве объекта экспериментов файл /etc/passwd. Ниже приведено несколько строк из этого файла.
Root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:/var/adm: operator:x:11:0:operator:/root: games:x:12:100:games:/usr/games: nobody:x:99:99:Nobody:/: Student:x:501:501:Student:/home/student:/bin/bash Каждая запись состоит из 7 полей, разделенных двоеточиями. Чтобы, например, отсортировать файл по полным именам пользователей (поле 5), следует выполнить команду «sort –k 5,5 –t ':' /etc/passwd». Чтобы выдать только строки, касающиеся пользователей, для которых при входе не запускается никакой шелл, можно использовать команду «grep ':$' /etc/passwd» (ищутся строки, в которых последним символом является двоеточие). Чтобы выделить из списка только имена входа пользователей, можно воспользоваться командой «cut –f 1 /etc/passwd». Чтобы выдать данные о трех первых по алфавиту пользователях, можно использовать конвейер: «sort /etc/passwd | head –n 3» Определить трех пользователей системы, чьи домашние каталоги с содержащимися в них файлами занимают больше всего дискового пространства Все домашние каталоги имеют вид /home/имя_пользователя. Список всех домашних каталогов можно задать как /home/*. Получить объемы использованного дискового пространства позволяет команда du. В данном случае нас интересуют только суммарные значения, без разбивки по подкаталогам, поэтому следует задать ключ –s. Выполнив команду du в интерактивном режиме, можно обнаружить, что первый столбец выдаваемых данных содержит числа (количество занимаемых блоков), а второй столбец, отделенный знаком табуляции, содержит имена каталогов. Требуется отсортировать выдачу по убыванию числового значения в первом столбце. Для этого подойдет команда «sort -rn». Чтобы выбрать первые три строки в отсортированном списке, можно использовать команду «head –n 3». Связывая все эти команды в один конвейер, можно записать: du –s /home/* | sort –rn | head –n 3 Однако полученные в результате три строки будут содержать данные примерно такого вида:
Home/student Home/dr Home/user1 Чтобы отрезать ненужные начала строк, можно, например, подсчитать, что имена пользователей всегда содержатся во втором поле строки и начинаются с седьмой позиции этого поля. Можно дополнить конвейер двумя командами cut, первая из которых вырезает из строки второе поле, а вторая вырезает символы, начиная с седьмого:
Дадим скрипту имя lstree. Синтаксис вызова скрипта будет следующий: Lstree начальный_каталог
Для выдачи вложенной структуры каталогов удобнее всего использовать рекурсивный вызов скрипта lstree. Скрипт будет иметь два параметра: первый – начальный каталог, второй, предназначенный только «для служебного пользования» – строка из нескольких точек, используемая для сдвига вправо при выдаче вложенных каталогов. Предполагается, что при первом вызове второй параметр задаваться не будет. Разумеется, это не очень корректное решение, зато самое простое. Более аккуратным решением было бы внутри скрипта определить рекурсивную функцию, но в данной работе функции шелла не рассматриваются. Ниже приведен текст скрипта lstree.
#!/bin/bash newdir=$1 indent=$2 [ -n $newdir ] && cd $newdir for i in * ; do echo $indent$i; if [ -d $i ] && [ -x $newdir ] ; then lstree $i "$indent.." fi Done Две переменные newdir и indent введены только для наглядности как копии позиционных параметров $1 и $2. В начале работы скрипта, если задан непустой первый параметр, выполняется переход в задаваемый им каталог. Следует напомнить, что изменение текущего каталога будет действовать только на время выполнения скрипта. Далее в цикле выдаются имена всех файлов нового текущего каталога, сдвинутые вправо на строку, состоящую из точек indent. Если очередной файл является каталогом и для него имеется право на «выполнение» (для каталога это право позволяет сделать каталог текущим), то для него рекурсивно вызывается тот же скрипт lstree, ему передается имя каталога в качестве первого параметра и строка сдвига, расширенная на две точки, в качестве второго параметра. Работа с учетными записями пользователей
По заданному имени входа пользователя выдать, в зависимости от указанного ключа, либо его полное имя, либо идентификатор пользователя, либо идентификатор группы пользователя. Допускается задание сразу нескольких ключей. Пусть скрипт носит имя userinfo, а допустимые ключи – n (полное имя), u (идентификатор пользователя) и g (идентификатор группы). Синтаксис вызова:
userinfo [-nug] имя_входа Ниже приведен текст скрипта.
#!/bin/bash info= While getopts nug option ; do case $option in n) info=$info” `grep '^'$2 /etc/passwd | cut –f 5 –d :`” u) info=$info” `grep '^'$2 /etc/passwd | cut –f 3 –d :`” g) info=$info” `grep '^'$2 /etc/passwd | cut –f 4 –d :`” *) echo Bad option: $option esac Done echo $info Требуемая информация выбирается из системного файла /etc/passwd с помощью команды grep, при этом искомой строкой является имя входа ($2). Символ ^ перед именем заставляет искать имя только в начале строки. Этим гарантируется невозможность ложного сравнения в случае, когда имя пользователя случайно совпадает с частью какой-либо совсем другой строки файла passwd. Используется вызов конвейера в обратных апострофах, чтобы собрать стандартный вывод в переменной info. При вырезании нужного поля из строки файла passwd учитывается, что разделителем полей в этом файле является двоеточие. Приведенное решение не идеально. В случае нескольких ключей команда grep будет вызываться несколько раз ради поиска одной и той же строки. Лучше было бы получить строку один раз, запомнить ее в переменной, а затем только вырезать из этой переменной нужные подстроки. Это можно сделать, либо используя конструкцию «документ здесь» в качестве стандартного ввода команды cut, либо используя для выделения подстроки из переменной команду expr, которая не рассматривалась в данном пособии.
Практическая часть Порядок выполнения работы: По номеру варианта определить номера задач, для которых разработать shell – программы. Привести в отчете код и тестирование программы с различными наборами данных.
Задачи
Контрольные вопросы 1. Какие функции выполняет командный интерпретатор Shell? 2. Какое назначение имеют shell - файлы? 3. Как создать shell - файл и сделать его выполняемым? 4. Какие типы переменных используются в shell - файлах? 5. В чем заключается анализ цепочки символов? 6. Какие встроенные команды используются в shell - файлах? 7. Как производится управление программами? 8. Назовите операторы создания циклов. 9. Как задаются и выполняются простые и сложные команды? |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 504. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |