Tôi có thể rút ngắn bộ lọc này, tìm thấy kích thước đĩa trên 100G không?


12

Mục tiêu của tôi là lấy các đĩa lớn hơn 100G từ lsblk.

Tôi có nó làm việc, nhưng nó vụng về. Tôi khá chắc chắn rằng nó có thể được rút ngắn. Hoặc bằng cách sử dụng một cái gì đó hoàn toàn khác với lsblk, hoặc có lẽ tôi có thể lọc trực tiếp các số có thể đọc được của con người bằng awk.

Đây là những gì tôi kết hợp lại:

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

Nó chỉ xuất ra phần sdx và nvmexxx của các đĩa lớn hơn 100G. Chính xác những gì tôi cần.

Tôi hài lòng với nó, nhưng tôi rất muốn học hỏi thêm từ bạn Gurus


từ 100-999GB đến lớn hơn 100T, nhưng không có gì giữa 1-99T, tôi đoán vậy? (terabyte ~)
hanshenrik

Vâng, đó là một lỗ hổng khiến tôi chú ý và đã được thảo luận trong các câu trả lời. Do đó, tôi chấp nhận câu trả lời để thực hiện bộ lọc dựa trên kích thước byte thay vì con người có thể đọc được. Nếu bạn của một phương pháp khác, tôi sẽ rất vui khi biết về điều đó.
chalybeum

Câu trả lời:


28

Bạn có thể chỉ định hình thức đầu ra mà bạn muốn từ lsblk:

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

Tùy chọn được sử dụng :

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

Sau đó, việc lọc dễ dàng hơn:

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

Trong trường hợp của bạn, đó là 100*2^30100GiB hoặc 100e9/ 1e11100 GB.


Uhhh, thật thông minh! Làm sạch những gì không cần thiết ở nơi đầu tiên. Một câu hỏi: Bạn đang sử dụng x * 2 ** 30 chỉ để thống nhất với các byte? Sẽ có nhược điểm để sử dụng s.th. thích 10 ** 3?
chalybeum

@chalybeum có, cho byte. Không, bạn có thể sử dụng 10 ** 9. Các giá trị không khác nhau nhiều.
muru

Lưu ý rằng OP đang lọc các phân vùng trong một lớp lót.
ChúCarl

@UncleCarl lưu ý
muru

1
Lưu ý rằng trong trường hợp cụ thể này, awk ranh giới 100G cũng có thể được rút ngắn egrep '\d{12,}'để xóa các dòng có <12 chữ số trong một chuỗi. Awk tất nhiên là phổ quát hơn.
Gnudiff

18

Bạn cũng có thể yêu lsblkcầu xuất ra ở định dạng JSON và thực hiện lọc với jq:

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

Hoặc là:

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

Để giới hạn các mục của loại disk.

( 1e11là 100 GB. Thay thế bằng 107374182400(hoặc 100*1024*1024*1024) cho 100 GiB. Vì làm tròn, lsblkbản thân không có -bbáo cáo 100G cho các kích thước từ khoảng 99.9278 đến 100.0488 GiB (vì một số lý do))

Với lsblk -OJb,lsblk báo cáo tất cả các thông tin có sẵn cho phép bạn thực hiện lựa chọn chi tiết hơn hoặc xuất ra nhiều thông tin liên quan hơn.

Bạn cũng có thể lấy thông tin trực tiếp từ /sys. Với zsh:

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

Đây là một câu trả lời thực sự từ một Đạo sư, không ai có thể đọc nó. : D
Archemar

Tôi coi đây là một điều tốt đẹp để biết. Nhưng ở giai đoạn này trong hành trình của tôi trong bash, tôi không muốn giới thiệu sự phức tạp hơn nữa bằng cách sử dụng một công cụ khác.
chalybeum

Đó là một ứng dụng hay của jq(mà tôi mới biết về vài tháng trước).
Dubu

6

thử

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

điều này sẽ grep và lọc cùng một lúc.

  • $4 ~ /G$/ được nộp với kích thước trong G
  • $4+0 > 100 có kích thước hơn 100G
  • {print $1} in TÊN

như một quy tắc bạn không bao giờ cần phải sử dụng grepawktrong cùng một đường ống.

để chỉ nhận đĩa (và không có phân vùng): lọc awk

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

Ở đâu

  • $6 == "disk" chỉ chọn cột với đĩa

để chỉ nhận đĩa (và không có phân vùng): lọc lsblk

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

Ở đâu

  • --nodeps : -d, --nodeps không in nô lệ hoặc chủ sở hữu

Gần đến rồi. Nó vẫn in phân vùng. Nhưng tôi nghĩ rằng tôi có thể có được đằng sau đó khi tôi có một chút thời gian rảnh.
chalybeum

1
@chalybeum Tôi đã sửa lỗi đó, cùng một mẹo lọc có thể được áp dụng cho câu trả lời của muru.
Archemar

(Mặc dù tôi có thể sử dụng --no-depstùy chọn, phù hợp với phong cách chung của câu trả lời đó)
muru

2
Tôi e rằng điều này sẽ không bắt được các đĩa có kích thước được hiển thị bằng terabyte (hoặc đơn vị lớn hơn).
fra-san

@ fra-san điểm công bằng và cũng đúng với giải pháp ban đầu của tôi. Vì vậy, tôi lấy bit bộ lọc đĩa từ đây và đặt nó vào chuyển đổi byte.
chalybeum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.