Чи можу я скоротити цей фільтр, який знайде розміри диска понад 100G?


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. Саме те, що мені потрібно.

Я задоволений цим, але бажаю дізнатися більше від вас Гуру 😉


між 100-999 Гб і більше 100 Т, але нічого між 1-99 Т, я припускаю? (терабайти ~)
hanshenrik

Так, це одна вада, яка підкрала мою увагу і вже обговорювалася у відповідях. Тому я прийняв відповідь зробити фільтр на основі байтового розміру замість людського для читання. Якщо ви іншого способу, я з радістю дізнаюся про це.
халібей

Відповіді:


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*2^30за 100GiB або 100e9/ 1e11для 100GB.


Ух, це розумно! В першу чергу відмивайте те, що не потрібно. Одне питання: Ви використовуєте x * 2 ** 30 тільки для узгодження з байтами? Чи буде недолік використовувати s.th. як 10 ** 3?
халібей

@chalybeum так, для байтів. Ні, ви можете використовувати 10 ** 9. Значення не сильно відрізняються.
муру

Зауважте, що ОП фільтрує перегородки в однострої.
UncleCarl

@UncleCarl зазначив
muru

1
Зауважте, що в цьому конкретному випадку 100G кордону awk також можна скоротити, egrep '\d{12,}'щоб видалити рядки з <12 цифрами в послідовності. Звісно, ​​Awk універсальніший.
Gnudiff

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.

( 1e11На 100 Гб. Замінити 107374182400(або 100*1024*1024*1024) на 100 гинув. З - за округлення, lsblkсебе без -bзвітів 100G для розмірів в діапазоні приблизно від 99.9278 до 100.0488 гинув (з деяких причин))

З lsblk -OJb, lsblkповідомляє всю доступну інформацію , яка дозволяє зробити більш оштрафували-зернистий вибір або вихід більш актуальнішою інформацію.

Ви також можете отримати інформацію безпосередньо від /sys. З zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2

Це правдива відповідь Гуру, ніхто її не зможе прочитати. : D
Архемар

Я сприймаю це як приємне знати. Але на цьому етапі моєї подорожі в баш не хочу вносити подальші складності, використовуючи ще один інструмент.
халібей

Це приємне застосування jq(про яке я дізнався лише кілька місяців тому).
Дубу

6

спробуйте

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

це одночасно буде знімати та фільтрувати.

  • $4 ~ /G$/ подати з розміром у G
  • $4+0 > 100 отримати розмір понад 100G
  • {print $1} друкувати NAME

як правило, вам ніколи не потрібно використовувати grepі awkв одній трубі.

щоб отримати тільки диск (і не розділ): awk фільтрація

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, --конечки не друкують рабів або держателів

Майже там. Він досі друкує розділи. Але я думаю, що можу відстати від цього, коли матиму трохи вільного часу.
халібей

1
@chalybeum Я вирішив, що той самий фокус з фільтруванням можна застосувати до відповіді Муру.
Архемар

(Хоча, мабуть, я б скористався --no-depsваріантом відповідно до загального стилю цієї відповіді)
muru

2
Я боюся, що це не вдасться схопити диски, розмір яких зображено в терабайт (або більших одиницях).
фра-сан

@ fra-san справедлива точка, і це справедливо для мого оригінального рішення. Тож я беру сюди бітковий фільтр і вкладаю його в перетворення байтів.
халібей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.