воскресенье, 16 марта 2008 г.

Очеловечиваем лицо df

Давным давно мне хотелось df с человеческим лицом. Если быть более точным, то хотелось как-то увеличить размер первой колонки с файловой системой. На моей системе вывод df выглядел так:
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/hda1 6,1G 4,4G 1,8G 72% /
udev 10M 116K 9,9M 2% /dev
/dev/hda4 22G 14G 7,8G 63% /home
shm 252M 0 252M 0% /dev/shm
/var/data/stardict-dicts.sqfs
44M 44M 0 100% /usr/share/stardict/dic
/var/data/portage.sqfs
40M 40M 0 100% /usr/portage
homeserv:/mnt/sja-129G/gentoo/distfiles
130G 106G 24G 82% /var/distfiles

Как видно, строки со слишком длинными файловыми системами разбиты на 2 части, а мне хотелось непременно в одной.
Изучив исходные коды утилиты, я выяснил, что под файловую систему отводится 20 символов, и изменить это никак нельзя. Нужен был какой-то скрипт, который бы читал вывод df и очеловечивал его.
И этот скрипт был написан! Причём всё с помощью sed - давно хотел освоить эту утилиту, но всё как-то не было оказии.
Вот собственно и скрипт:
# !/bin/sh
df -h | sed -ne '
# if first symbol not space - begin normal line
/^[^ ]/{
# add 20 spaces after first 20 - expand normal string
s/\(.\{20\}\)/\1 /
# exchange with hold space
x
# if hold space non empty - print it
/./p
# goto end
b e
}
# if begin with space - continue of previous line
/^ /{
s/^ \{20\}//
# prepare first part of string
x
# remove added 20 spaces
s/\(.\{20\}\) \{20\}/\1/
# patttern doesnt 40 symbols ?
:a
/.\{40\}/ ! {
s/\(.*\)/\1 /
b a
}
x
# add current line to hold space
H
# next 3 lines remove \n and extra spaces from hold space
x
s/\n//
x
}
:e
# if last line - flush data from hold space if it here
${
# get hold space and print, it it non empty
x
/./p
}
'

Ну да, выглядит страшненько, но зато полон коментариев и работает! Теперь я созерцаю вывод таким:
Файловая система                          Разм  Исп  Дост  Исп% смонтирована на
/dev/hda1 6,1G 4,4G 1,8G 72% /
udev 10M 116K 9,9M 2% /dev
/dev/hda4 22G 14G 7,8G 63% /home
shm 252M 0 252M 0% /dev/shm
/var/data/stardict-dicts.sqfs 44M 44M 0 100% /usr/share/stardict/dic
/var/data/portage.sqfs 40M 40M 0 100% /usr/portage
homeserv:/mnt/sja-129G/gentoo/distfiles 130G 106G 24G 82% /var/distfiles

Комментариев нет: