Самое удобное решение для такой задачи awk
:
df -h /dev/sda2 | awk 'NR==2{print$4}'
Или если больше разделов перечислено, можно выбрать правильную строку точкой монтирования:
df -h | awk '$1=="/dev/sda2"{print$4}'
Также просто с sed
, но менее хороший, если необходимо отладить его несколько монтирования позже:
df -h /dev/sda2 | sed -rn '2s/^((\S+)\s+){4}.*/\2/p'
df -h | sed -rn '/^\/dev\/sda2/s/^((\S+)\s+){4}.*/\2/p'
Это предполагает GNU sed
. POSIX совместимый синтаксис включает многих выход:
df -h /dev/sda2 | sed -n '2s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
df -h | sed -n '/^\/dev\/sda2/s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
Если необходимо использовать grep и сократить, можно сделать следующее:
df -h /dev/sda2 | grep sda | cut -d" " -f14
Но это довольно ужасно, так как необходимо считать пробелы (-f14), и причина @manatwork использовал awk. Вы могли использовать tr
или другие инструменты, чтобы сделать это более хорошим и смочь указать реальное поле Вы хотите для сокращения:
df -h /dev/sda2 | grep sda | tr -s " " " " | cut -d" " -f4
С другой стороны, более новый grep поддерживает вывод только частичное соответствие, и можно использовать это в сочетании с приемом удара:
df -h /dev/sda2 | grep -o '[^[:space:]]*G' | cut -d$'\n' -f3
regex мог быть более безопасным, но это найдет все поля размера и произведет их один на строку, в то время как сокращенный выбирает второе.
tr -s " "
, если Вы не хотите изменить остающееся пространство на что-то еще.... (+1), но -f2
должен быть -f3
– Peter.O
01.07.2012, 19:31
Все другие ответы здесь являются большими, но если Вы используете Bash, нет никакой потребности использовать внешние программы, такие как awk, sed, grep, сократить и т.д.
Следующая строка сделает то, что Вы хотите:
{ read; read -r _ _ _ av _; } < <(df -h /dev/sda1)
"$av" будет доступным размером на/dev/sda1
Если Вы хотите использовать только числовую часть "$av" (например, 123 в 123G), можно использовать Расширение Параметра для обрезки несоответствующей части как этот:
ir="${av##*[0-9]}"; echo "${av%$ir}"
или просто "${av%?}"
если Вы уверены, что суффикс "$av" является только одной буквой.
Если это не должно быть grep
/cut
, Вы можете получать то же информационное использование stat
. В режиме файловой системы, %a
количество свободных блоков и %s
blocksize, таким образом, %a * %s
свободное пространство в байтах, и можно сделать математику к симпатии с ним сломать его к более подходящей единице по Вашему выбору, например:
echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB