Обычная команда 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 в начале сценария.
Читать дальше