Для использования требуется sudo, но он работает:
судо lshw | grep -Pzo "\*-(диск|пространство имен)(\n.*)+?\s+size:.*?\(\K\d+\w+" | tr "\0" "\n" | вставить - сд/
Это дает вывод следующим образом:
1 ТБ/750 ГБ
В противном случае вы бы не знали, было ли это ТБ/ГБ/МБ, поэтому я сохранил их.
РЕДАКТИРОВАТЬ: я заметил .*
в регулярном выражении не было необходимости. Команда выше была обновлена.
Объяснение:
судо лшв
: ну... перечислите оборудование. Нам нужно sudo, чтобы увидеть диски в системе. Это будет наш источник информации.
grep -Pzo
: мы собираемся использовать регулярное выражение для получения необходимой информации
-P = активировать регулярное выражение Perl
-z = рассматривать все как одну длинную строку; это необходимо, потому что мы собираемся использовать регулярное выражение в нескольких строках.
-o = вместо того, чтобы показывать вывод и помечать результат красным, просто показать результат
регулярное выражение
(совет: удалите -o (он же -Pz) и добавьте регулярные выражения ниже одно за другим, чтобы увидеть, что происходит шаг за шагом; красный текст - это то, что соответствует регулярному выражению, поэтому вы можете шаг за шагом видеть, как мы приближаемся к желаемому результату и что каждый шаг меняет на выходе):
\*-(disk|namespace) = Найти весь текст, который является "*-disk" или "*-namespace". Нам нужно экранировать (= \) «*», потому что в регулярном выражении это означает ноль или больше, но мы этого не хотим, мы хотим искать буквальное «*».
(\n.*)+ = Продолжайте добавлять («+» = одну или несколько) строк («\n» = перейти к следующей строке; «.*» = все в этой строке) к совпавшему тексту; вы увидите, что теперь все под первым совпадением "\*-(disk|namespace)" окрашено в красный цвет.
?\s+size: = мы продолжаем добавлять строки, пока не встретим первое ("?" = не жадное, т. е. первое совпадение вместо последнего совпадения) совпадение одного или нескольких пробелов (= "\s+"; "\ s" — пробел (табуляция, пробел и т. д.); "+" — один или несколько), а затем "size:"; вы увидите, что приближались к желаемому числу на выходе.
.* = соответствует остальной части этой строки,
?\(= до первого совпадения (= ?) "(", которое нам нужно экранировать, потому что оно используется в регулярном выражении (здесь вы можете увидеть, как оно используется в первой части регулярного выражения).
\K\d+\w+ = соответствует числу (= \d) один или несколько раз (= "+") и после этого символу слова (= \w) один или несколько раз (= "+"). Теперь у нас есть нужный текст в совпадении, но мы не хотим, чтобы весь совпадающий текст до этого был в выводе, поэтому мы ставим «\K» перед желаемым текстом, чтобы удалить совпавший текст перед «\K» из выход. Это по-прежнему требуется для соответствия, просто оно не включено в вывод. Это делает все регулярное выражение перед ним положительным взглядом назад (поищите его; «положительный взгляд позади регулярного выражения Perl») с возможностями регулярного выражения.
тр "\0" "\n"
:
Вы увидите, что у нас есть нужный текст, и ничего больше или меньше.
Когда мы снова добавим -o, вы увидите, что результаты отображаются странным образом (все друг за другом).
Это потому, что они разделены нулевым символом (= \0), который вы не видите, вместо новой строки. Это артефакт опции "-z" команды grep.
Чтобы показать их в обычном списке, мы собирались заменить нулевые символы новой строкой, используя тр
.
вставить -sd/
: теперь, когда у нас есть результаты в списке, мы можем использовать команду вставки, чтобы поместить их друг после друга, используя «/» в качестве разделителя.