Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
····else { return prettygb "G" }
··}
··BEGIN {
····printf "%-37s %10s %7s %7s %8s %-s\n",
··········"Filesystem", "Size", "Used", "Avail", "Capacity", "Mounted"
··}
··!/Filesystem/ {
····size=showunit($2);
··used=showunit($3);
··avail=showunit($4);
··printf "%-37s %10s %7s %7s %8s %-s\n",
········$1, size, used, avail, $5, $6
··}
··EOF
df −k | awk −f $awkscript
··exit 0
Как это работает
Основная работа выполняется awk-сценарием, и не составило бы большого труда написать весь сценарий на awk, а не на языке командной оболочки, применив в нем функцию system() для вызова команды df. (Вообще, этот пример — идеальный кандидат, чтобы переписать его на языке Perl, но наша книга совсем не о том.)
В этом сценарии используется старый трюк, в строках и
, пришедший из языка BASIC.
Быстро ограничить количество знаков после десятичной точки при работе с числами произвольной точности можно, умножив число на степень 10, преобразовав произведение в целое число (отбросив дробную часть) и разделив результат на ту же степень 10: prettymb=(int(mb * 100)) / 100;. Этот код, например, превратит значение 7,085344324 в более привлекательное 7,08.
Некоторые версии df поддерживают флаг −h, позволяющий получить похожий вывод. Однако этот сценарий, как и многие другие в данной книге, обеспечивает более дружественный и понятный вывод в любой системе, Unix или Linux, независимо от используемой версии df.
Запуск сценария
Сценарий не имеет аргументов и может запускаться с любыми привилегиями, в том числе с привилегиями root. Чтобы исключить строки с информацией об устройствах, которые вам не интересны, используйте команду grep −v после вызова df.
Результаты
Обычная команда df выводит результаты в виде, трудном для понимания, как показано в листинге 5.7.
Листинг 5.7.В выводе по умолчанию команды df сложно разобраться
$ df
Filesystem························512-blocks Used······Available Capacity Mounted on
/dev/disk0s2······················935761728··628835600 306414128 68 %······/
devfs···························· 375········375······ 0········ 100 %···· /dev
map −hosts························0··········0········ 0········ 100 %···· /net
map auto_home···················· 0··········0········ 0········ 100 %···· /home
localhost:/mNhtYYw9t5GR1SlUmkgN1E 935761728··935761728 0········ 100 %···· /Volumes/·········································································· Mobile-·········································································· Backups
Новый сценарий использует awk для увеличения удобочитаемости и преобразует 512-байтные блоки в более понятный формат, как можно видеть в листинге 5.8.
Листинг 5.8.Простой и понятный вывод сценария newdf
$ newdf
Filesystem························Size·· Used····Avail·· Capacity Mounted
/dev/disk0s2······················446.2G 299.86G 146.09G 68 %······/
devfs···························· 187K·· 187K····0······ 100 %···· /dev
map −hosts························0······0······ 0······ 100 %
map auto_home···················· 0······0······ 0······ 100 %
localhost:/mNhtYYw9t5GR1SlUmkgN1E 446.2G 446.2G··0······ 100 %···· /Volumes/····································································Mobile-····································································Backups
Усовершенствование сценария
В этом сценарии много недостатков, и один из самых значительных — наличие версий df, включающих информацию об использовании индексных узлов (inode) и даже внутреннюю информацию о процессоре, хотя она не представляет никакого интереса (как две записи map в примере выше). Сценарий был бы намного полезнее, если бы мы удалили вывод подобной ненужной информации, поэтому в первую очередь стоить применить флаг −P в вызове df, ближе к концу сценария , чтобы удалить из вывода информацию об использовании индексных узлов. (Ее можно было бы вывести в отдельном столбце, но тогда вывод станет еще шире и форматировать его станет труднее.) Чтобы удалить записи map, достаточно воспользоваться командой grep. Просто добавьте в конец команды |grep −v "^map"
, и вы навсегда избавитесь от них.
№ 38. Определение доступного пространства на диске
Коль скоро сценарий № 37 способен упростить вывод команды df, чтобы его было легче читать и понимать, тогда на более простой вопрос об объеме доступного дискового пространства в системе тем более можно ответить с помощью сценария командной оболочки. Команда df действительно сообщает информацию для каждого диска, но для ее осмысления требуется приложить некоторые усилия:
$ df
Filesystem····1K-blocks Used···· Available Use% Mounted on
/dev/hdb2···· 25695892··1871048··22519564··8 %·· /
/dev/hdb1···· 101089····6218···· 89652···· 7 %·· /boot
none··········127744····0········127744····0 %·· /dev/shm
Более полезная версия df могла бы суммировать числа в колонке «Available» (Доступно) и выводить ее в удобочитаемом виде. Эта задача легко решается с помощью команды awk, как показано в листинге 5.9.
Код
Листинг 5.9.Сценарий diskspace, удобная обертка для df, сообщающая информацию в дружественном формате
··#!/bin/bash
··# diskspace — суммирует доступное дисковое пространство и выводит сумму
··#·· в логичном и удобочитаемом виде
··tempfile="/tmp/available.$$"
··trap "rm −f $tempfile" EXIT
··cat << 'EOF' > $tempfile
······{ sum += $4 }
··END { mb = sum / 1024
········gb = mb / 1024
········printf "%.0f MB (%.2fGB) of available disk space\n", mb, gb
······}
··EOF
··df −k | awk −f $tempfile
··exit 0
Как это работает
Сценарий diskspace опирается на временный awk-сценарий, который сохраняется в каталоге /tmp . Этот awk-сценарий вычисляет общий объем доступного дискового пространства на основе переданных ему данных и затем выводит результат в удобочитаемом формате. Результаты вызова команды df по конвейеру передаются команде awk , которая в свою очередь выполняет операции, определяемые awk-сценарием. Когда работа сценария завершается, временный awk-сценарий удаляется из каталога /tmp благодаря обработчику сигнала выхода, установленному командой trap в начале сценария.
Запуск сценария
Этот сценарий, который может запустить любой пользователь, выводит короткую строку с информацией о суммарном объеме доступного дискового пространства.
Читать дальшеИнтервал:
Закладка: