сокращение / grep и df-h

Вы хотите a sleep 10s перед dhcpd частью самое меньшее

5
01.07.2012, 17:47
4 ответа

Самое удобное решение для такой задачи 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'
7
27.01.2020, 20:32

Если необходимо использовать 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 мог быть более безопасным, но это найдет все поля размера и произведет их один на строку, в то время как сокращенный выбирает второе.

5
27.01.2020, 20:32
  • 1
    деталь: Вам только нужно tr -s " ", если Вы не хотите изменить остающееся пространство на что-то еще.... (+1), но -f2 должен быть -f3 –  Peter.O 01.07.2012, 19:31
  • 2
    я искал неправильное поле в своих тестах, спасибо. –  lynxlynxlynx 01.07.2012, 19:40

Все другие ответы здесь являются большими, но если Вы используете 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" является только одной буквой.

3
27.01.2020, 20:32

Если это не должно быть grep/cut, Вы можете получать то же информационное использование stat. В режиме файловой системы, %a количество свободных блоков и %s blocksize, таким образом, %a * %s свободное пространство в байтах, и можно сделать математику к симпатии с ним сломать его к более подходящей единице по Вашему выбору, например:

echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB
0
27.01.2020, 20:32

Теги

Похожие вопросы