Как мне выполнить grep или вырезать «173G» в разделе «Verf»?
Мне это нужно для написания сценариев Unix в школе.
jonas@jonaspc:~/$ df -h /dev/sda2
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda2 293G 121G 173G 42% /media/Windows
решение1
Наиболее удобным решением такой задачи является 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'
решение2
Если вам необходимо использовать grep и cut, вы можете сделать следующее:
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 поддерживает вывод только частичного совпадения, и вы можете использовать это в сочетании с трюком bash:
df -h /dev/sda2 | grep -o '[^[:space:]]*G' | cut -d$'\n' -f3
Регулярное выражение может быть безопаснее, но оно найдет все поля размера и выведет их по одному в строке, тогда как cut выберет второе.
решение3
Все остальные ответы здесь великолепны, но если вы используетеБаш, нет необходимости использовать внешние программы, такие как awk, sed, grep, cut и т. д.
Следующая строка сделает то, что вам нужно:
{ read; read -r _ _ _ av _; } < <(df -h /dev/sda1)
"$av"будет доступен размер на /dev/sda1
Если вы хотите использовать только числовую часть"$av"(например123в 123G) можно использоватьРасширение параметровчтобы обрезать ненужную часть следующим образом:
ir="${av##*[0-9]}"; echo "${av%$ir}"
или просто "${av%?}"
если вы уверены, что суффикс"$av"всего одна буква.
решение4
Если это не обязательно должно быть grep
/ cut
, вы можете получить ту же информацию с помощью stat
. В режиме файловой системы %a
это количество свободных блоков и %s
размер блока, то есть %a * %s
свободное пространство в байтах, и вы можете выполнить с ним математические действия по своему усмотрению, чтобы преобразовать его в более подходящую единицу по вашему выбору, например:
echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB