вырезать / grep и df -h

вырезать / grep и df -h

Как мне выполнить 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

Связанный контент