Czy mogę skrócić ten filtr, który znajdzie dyski o rozmiarach powyżej 100G?

12

Moim celem jest zdobycie dysków większych niż 100G z lsblk.

Mam to działa, ale jest niezręczne. Jestem prawie pewien, że można to skrócić. Albo używając czegoś zupełnie innego niż lsblk, albo może mogę filtrować liczby czytelne dla ludzi bezpośrednio za pomocą awk.

Oto, co zestawiłem:

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

Wyprowadza tylko część sdx i nvmexxx dysków większych niż 100G. Właśnie tego potrzebuję.

Jestem z tego zadowolony, ale chętnie dowiem się więcej od ciebie Guru us

chalbebeum
źródło
między 100-999 GB a większym niż 100T, ale nic pomiędzy 1-99T, jak sądzę? (terabajty ~)
hanshenrik
Tak, to jedna wada, która zwróciła moją uwagę i została już omówiona w odpowiedziach. Dlatego zaakceptowałem odpowiedź, aby wykonać filtr oparty na rozmiarze bajtu zamiast na czytelnym dla człowieka. Jeśli masz inną metodę, chętnie się o tym dowiem.
chalybeum,

Odpowiedzi:

28

Możesz określić formę wyjścia, z której chcesz lsblk:

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

Zastosowane opcje :

-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.

Dzięki temu filtrowanie jest łatwiejsze:

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

W twoim przypadku byłoby to 100 100*2^30GiB lub 100e9/ 1e11100 GB.

muru
źródło
Uhhh, to sprytne! W pierwszej kolejności wyeliminowanie niepotrzebnych rzeczy. Jedno pytanie: używasz x * 2 ** 30 tylko dla spójności z bajtami? Czy korzystanie z s.th. miałoby wadę jak 10 ** 3?
chalybeum
@chalybeum tak, dla bajtów. Nie, możesz użyć 10 ** 9. Wartości nie różnią się zbytnio.
muru
Zauważ, że OP odfiltrowuje partycje w jednowarstwowym.
UncleCarl
@UncleCarl odnotował
mur
1
Zauważ, że w tym szczególnym przypadku awk graniczny 100G można również skrócić, egrep '\d{12,}'aby usunąć linie z <12 cyframi w sekwencji. Awk jest oczywiście bardziej uniwersalny.
Gnudiff
18

Możesz również powiedzieć, lsblkaby wyświetlać w formacie JSON i wykonać filtrowanie za pomocą jq:

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

Lub:

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

Aby ograniczyć do wpisów typu disk.

( 1e11jest 100 GB. Zamień na 107374182400(lub 100*1024*1024*1024) dla 100 GiB. Ze względu na zaokrąglanie, lsblksam bez -braportów 100G dla rozmiarów od około 99,9278 do 100,0488 GiB (z jakiegoś powodu))

Dzięki lsblk -OJb, lsblkzgłasza wszelkie dostępne informacje, które pozwala zrobić więcej grzywną drobnoziarnisty wyboru lub wyjście bardziej lub bardziej przydatnych informacji.

Możesz również uzyskać informacje bezpośrednio z /sys. Z zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2
Stéphane Chazelas
źródło
To jest prawdziwa odpowiedź od guru, nikt nie będzie w stanie jej przeczytać. : D
Archemar
Uważam to za miło wiedzieć. Ale na tym etapie mojej podróży w bash nie chcę wprowadzać dalszej złożoności, używając innego narzędzia.
chalybeum
To fajna aplikacja jq(o której dowiedziałam się kilka miesięcy temu).
Dubu
6

próbować

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

to będzie grepować i filtrować w tym samym czasie.

  • $4 ~ /G$/ otrzymaj rozmiar G w
  • $4+0 > 100 uzyskać rozmiar powyżej 100G
  • {print $1} Nazwa wydruku

z reguły nigdy nie powinno być potrzeby stosowania grepi awkw samej rury.

aby uzyskać tylko dysk (i bez partycji): filtrowanie awk

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

gdzie

  • $6 == "disk" wybierz tylko kolumnę z dyskiem

aby uzyskać tylko dysk (i bez partycji): filtrowanie lsblk

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

gdzie

  • --nodeps : -d, --nodeps nie drukuje niewolników ani posiadaczy
Archemar
źródło
Prawie na miejscu. Nadal drukuje partycje. Ale myślę, że mogę sobie poradzić, kiedy mam trochę wolnego czasu.
chalybeum
1
@chalybeum Naprawiłem tę samą sztuczkę filtrowania w odpowiedzi Muru.
Archemar
(Chociaż prawdopodobnie skorzystałbym z tej --no-depsopcji, zgodnie z ogólnym stylem tej odpowiedzi)
mur
2
Obawiam się, że nie uda się złapać dysków, których rozmiar jest pokazany w terabajtach (lub większych jednostkach).
fra-san
@ fra-san rzetelny punkt i dotyczy to również mojego oryginalnego rozwiązania. Więc biorę bit filtru stąd i umieszczam go w konwersji bajtów.
chalybeum