Рейтинг:0

Как отобразить размер установленных жестких дисков

флаг in

Я хочу написать простой скрипт Linux, который будет отображать реальный размер установленного жесткого диска. Если есть SSD на 128 ГБ, lsblk показывает меньше 128. Мне нужно проверить реальный размер памяти и вывести его так: установлено 128 ГБ = скрипт выдает вывод

128

Если установлено два жестких диска, выдается вывод

128/512

Он должен работать как на дисках sata, так и на nvme.

Artur Meinild avatar
флаг vn
Вам необходимо понимать [разницу между гигабайтами и гибибайтами](https://docs.ukcloud.com/articles/other/other-ref-gib.html). Жесткий диск емкостью 128 ГБ составляет 119 ГБ (Гибибайт), что обычно сообщает ОС. Непонятно, что вы имеете в виду под «настоящим размером» — на AFAIK не существует такого понятия, как «поддельный размер».
Grzegorz Michalak avatar
флаг in
Да, я это знаю, извините. Я имею в виду гигабайты, «полный» размер жесткого диска
Artur Meinild avatar
флаг vn
Полный размер одинаков, независимо от того, в какой единице вы его сообщаете.Также есть инструменты для преобразования между [единицами измерения] (https://linux.die.net/man/1/units).
Grzegorz Michalak avatar
флаг in
Я понимаю это .. просто нужна команда для отображения размера жестких дисков в ГБ (не ГиБ)
Artur Meinild avatar
флаг vn
`lsblk -b` показывает размер в байтах, который вы затем можете извлечь и преобразовать по своему вкусу.
Grzegorz Michalak avatar
флаг in
Но как извлечь только установленные диски?
Artur Meinild avatar
флаг vn
Здесь в игру вступают ваши навыки написания сценариев. Однако по звучанию ваш скрипт не будет сильно отличаться от `lsblk` или `df` с правильными параметрами. Рассмотрим `alias dfs='\df -hl -T -x"squashfs" -x"tmpfs" | grep -v "/var/lib/docker" | (read h; echo "$h"; sort -V)'`, который отсортирован по `df`, но без томов докеров или устройств squashfs и tmpfs.
Рейтинг:1
флаг vn

Непонятно, в чем ваш вопрос. Я надеюсь, вы не хотите, чтобы кто-то написал весь сценарий, а скорее спросите, как получить числа, с которыми вы хотите работать.

Используйте lshw, это (отредактировано) вывод из моей системы, присутствуют один NVMe и один SSD.

$ lshw -c диск
  *-пространство имен               
       описание: пространство имен NVMe
       логическое имя: /dev/nvme0n1
       размер: 953 ГБ (1024 ГБ)
...
  *-диск
       описание: Диск ATA
       продукт: Samsung SSD 850
       логическое имя: /dev/sda
       размер: 931 ГБ (1 ТБ)
...
Grzegorz Michalak avatar
флаг in
Да, это хорошая команда, но я хочу, чтобы она отображала только размер и, если возможно, этот размер в скобках (1 ТБ, 1024 ГБ и т. д.)
marosg avatar
флаг vn
Его не так уж сложно разобрать и отобразить так, как вы хотите. Не ждите, что люди напишут вам весь сценарий.
Рейтинг:1
флаг in
Cas

Для использования требуется 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/: теперь, когда у нас есть результаты в списке, мы можем использовать команду вставки, чтобы поместить их друг после друга, используя «/» в качестве разделителя.

Cas avatar
флаг in
Cas
Регулярное выражение довольно сложное, но я нахожу его забавным, так что это не проблема.Я нахожу забавным, что marosg говорил о нежелании писать весь сценарий, когда я сделал это в одну трубу, так что не слушайте слишком много людей, которые жалуются, хотя я согласен, что вы всегда должны знать, что вы' делать заново, а не просто слепо копировать сценарий, который кто-то сделал для вас. Понимание того, что сделал писатель, является отличным способом обучения!
Grzegorz Michalak avatar
флаг in
Спасибо, приятно это слышать :) Можете ли вы описать, что делает каждая часть вашего скрипта?
Grzegorz Michalak avatar
флаг in
Спасибо, это здорово! Я использовал это сейчас: `lsscsi -s | awk '/N:/ {printf $NF}' | оборот | вырезать -c 3- | оборот && lsscsi -s | awk '$3 ~ /ATA/ {printf $NF}' | оборот | вырезать -c 3- | оборот `
Cas avatar
флаг in
Cas
Смотрите редактирование моего ответа!
sudodus avatar
флаг jp
+1; Но мне нужен был префикс LANG=C, чтобы ваша команда работала, потому что я не использую английский язык. Возможно, вы можете отредактировать свой ответ, чтобы включить это.
Рейтинг:0
флаг jp

Следующая однострочная команда должна делать то, что вы хотите.

for i in $(lsblk -bdno name,size|tr -s ' ' '_'); do j=${i##*_};j=$(((j+500000000)/1000000000));printf "${i%_*}\t$j\tGB\n";готово

Вы можете поместить функцию с ним в свой ~/.bashrc файл рядом с псевдонимами, чтобы запустить его с помощью короткой команды, например мои диски

function mydrives { for i in $(lsblk -bdno name,size|tr -s ' ' '_'); do j=${i##*_};j=$(((j+500000000)/1000000000));printf "${i%_*}\t$j\tGB\n";готово }

Это работает так для меня, после

источник ~/.bashrc

и во всех окнах терминала, которые вы открываете после того, как изменили ~/.bashrc файл.

У меня на компе печатает так

$ мои диски
СД 256 Гб
сдб 4001 ГБ
sr0 1 ГБ
nvme0n1 250 ГБ

Я привык к GiB (гибибайтам), поэтому часто использую простой лсблк команда

лсблк

или когда я хочу больше деталей и иметь широкое окно терминала

lsblk-fm

или иным образом

lsblk -м

Команда, соответствующая тому, что я предложил вам, но с мибибайтами, гибибайтами, тибибайтами (с основанием 2, а не с основанием 10), будет

$ lsblk -dno имя, размер
сда 238,5Г
сдб 3,7т
ср0 1024M
nvme0n1 232,9G

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.