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


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.


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.