Можно ли сократить этот фильтр, который находит диски размером более 100 ГБ?

12

Моя цель - получить диски больше 100G от lsblk.

У меня это работает, но это неловко. Я почти уверен, что это можно сократить. Либо с помощью чего-то совершенно отличного от lsblk, либо, возможно, я могу фильтровать удобочитаемые числа напрямую с помощью awk.

Вот что я собрал:

lsblk | grep disk | awk '{print$1,$4}' | grep G | sed 's/.$//' | awk '{if($2>100)print$1}'

Он выводит только часть дисков sdx и nvmexxx размером более 100G. Именно то, что мне нужно.

Я доволен этим, но хочу учиться у вас больше, Гуру 😉

chalybeum
источник
между 100-999GB и больше чем 100T, но ничего между 1-99T, я полагаю? (терабайт ~)
19
Да, это один недостаток, который привлек мое внимание и уже обсуждался в ответах. Поэтому я принял ответ, чтобы сделать фильтр на основе размера байта, а не для чтения человеком. Если у вас другой метод, я буду рад узнать об этом.
chalybeum

Ответы:

28

Вы можете указать желаемую форму вывода lsblk:

% lsblk -nblo NAME,SIZE
mmcblk0   15931539456
mmcblk0p1   268435456
mmcblk0p2 15662038528

Используемые параметры :

-b, --bytes
      Print the SIZE column in bytes rather than in human-readable format.

-l, --list
      Use the list output format.

-n, --noheadings
      Do not print a header line.

-o, --output list
      Specify which output columns to print.  Use --help to get a list of  all  supported
      columns.

Тогда фильтрация будет проще:

% lsblk -nblo NAME,SIZE | awk '$2 > 4*2^30 {print $1}' # greater than 4 GiB
mmcblk0
mmcblk0p2

В вашем случае это было бы для 100 ГБ 100*2^30или 100e9/ 1e11для 100 ГБ.

Мур
источник
Ухх, это умно! Отсеять то, что не нужно в первую очередь. Один вопрос: вы используете x * 2 ** 30 только для согласованности с байтами? Будет ли недостаток использовать s.th. как 10 ** 3?
chalybeum
@chalybeum да, для байтов. Нет, вы можете использовать 10 ** 9. Значения не сильно отличаются друг от друга.
19
Обратите внимание, что OP отфильтровывает разделы в одну строку.
UncleCarl
@UncleCarl отметил
Muru
1
Обратите внимание, что в этом конкретном случае границы 100G awk также можно сократить, egrep '\d{12,}'чтобы удалить строки с <12 цифрами в последовательности. Awk, конечно, более универсален.
Гнудифф
18

Вы также можете указать lsblkвывод в формате JSON и выполнить фильтрацию с помощью jq:

$ lsblk -Jb | jq -r '..|select(.size? >= 1e11).name'
sda
sda2

Или:

$ lsblk -Jb | jq -r '..|select(.type? == "disk" and .size? >= 1e11).name'
sda

Ограничить записи типа disk.

( размер 1e11100 ГБ. Замените на 107374182400(или 100*1024*1024*1024) для 100 ГиБ. Из-за округления lsblkсам без -bотчетов 100 ГБ для размеров в диапазоне от 99,9278 до 100,0488 ГБ (по некоторым причинам))

С помощью lsblk -OJb, lsblkсообщает всю доступную информацию, которая позволяет вам сделать более точный выбор или выводить более или более релевантную информацию.

Вы также можете получить информацию непосредственно от /sys. С zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2
Стефан Шазелас
источник
Это верный ответ от Гуру, никто не сможет его прочитать. : D
Archemar
Я считаю, что это приятно знать. Но на данном этапе моего путешествия в bash я не хочу вносить дополнительную сложность, используя еще один инструмент.
chalybeum
Это хорошее приложение jq(о котором я узнал всего несколько месяцев назад).
Dubu
6

пытаться

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

это будет grep и фильтровать одновременно.

  • $4 ~ /G$/ получить с размером в G
  • $4+0 > 100 получить размер более 100G
  • {print $1} печать ИМЯ

Как правило, вы никогда не должны использовать grepи awkв одной трубе.

получить только диск (и без раздела): awk filtering

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 && $6 == "disk"  {print $1}'

где

  • $6 == "disk" выбрать только колонку с диском

получить только диск (и без раздела): фильтрация lsblk

lsblk --nodeps| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

где

  • --nodeps : -d, --nodeps не печатать рабов или владельцев
Archemar
источник
Почти готово. Он по-прежнему печатает разделы. Но я думаю, что смогу справиться с этим, когда у меня будет немного свободного времени.
chalybeum
1
@chalybeum Я исправил это, тот же трюк с фильтрацией можно применить к ответу Муру.
Archemar
(Хотя я бы, вероятно, воспользовался этой --no-depsопцией, в соответствии с общим стилем этого ответа)
Muru
2
Я боюсь, что это не сможет поймать диски, размер которых указан в терабайтах (или больше единиц).
Фра-Сан -
@ Фра-сан справедливо, а также верно для моего оригинального решения. Итак, я взял бит фильтра диска и поместил его в преобразование байтов.
chalybeum