Dapatkah saya mempersingkat filter ini, yang menemukan ukuran disk lebih dari 100G?

12

Tujuan saya adalah mendapatkan disk lebih besar dari 100G dari lsblk.

Saya membuatnya bekerja, tapi ini aneh. Saya cukup yakin itu bisa dipersingkat. Entah dengan menggunakan sesuatu yang sama sekali berbeda dari lsblk, atau mungkin saya bisa memfilter angka yang dapat dibaca manusia langsung dengan awk.

Inilah yang saya kumpulkan:

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

Ini output hanya bagian sdx dan nvmexxx dari disk yang lebih besar dari 100G. Apa yang saya butuhkan.

Saya senang dengan itu, tetapi saya ingin belajar lebih banyak dari Anda Guru urus

Chalybeum
sumber
antara 100-999GB dan lebih besar dari 100T, tapi tidak ada antara 1-99T, saya kira? (terabytes ~)
hanshenrik
Ya itu adalah salah satu kelemahan yang menyelinap perhatian saya dan sudah dibahas dalam jawaban. Karena itu saya menerima jawaban untuk melakukan filter berdasarkan ukuran byte dan bukan dapat dibaca manusia. Jika Anda menggunakan metode lain, saya akan dengan senang hati mempelajarinya.
chalybeum

Jawaban:

28

Anda dapat menentukan bentuk output yang Anda inginkan dari lsblk:

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

Opsi yang digunakan :

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

Maka penyaringan lebih mudah:

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

Dalam kasus Anda, itu akan menjadi 100*2^30100GiB atau 100e9/ 1e11untuk 100GB.

muru
sumber
Uhhh, itu pintar! Menyingkirkan apa yang tidak dibutuhkan sejak awal. Satu pertanyaan: Anda menggunakan x * 2 ** 30 hanya untuk konsistensi dengan byte? Apakah akan ada kekurangan untuk menggunakan s.th. suka 10 ** 3?
chalybeum
@ Chalybeum ya, untuk byte. Tidak, Anda dapat menggunakan 10 ** 9. Nilai tidak banyak berbeda.
muru
Perhatikan bahwa OP memfilter partisi dalam satu-liner.
UncleCarl
@UncleCarl mencatat
muru
1
Perhatikan bahwa dalam kasus tertentu dari 100G batas awk ini juga dapat disingkat menjadi egrep '\d{12,}'untuk menghapus garis dengan <12 digit secara berurutan. Awk tentu saja lebih universal.
Gnudiff
18

Anda juga dapat mengetahui lsblkoutput dalam format JSON dan melakukan pemfilteran dengan jq:

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

Atau:

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

Untuk membatasi entri tipe disk.

( 1e11menjadi 100 GB. Ganti dengan 107374182400(atau 100*1024*1024*1024) untuk 100 GiB. Karena pembulatan, lsblkitu sendiri tanpa -blaporan 100G untuk ukuran mulai dari sekitar 99,9278 hingga 100,0488 GiB (untuk beberapa alasan))

Dengan lsblk -OJb, lsblkmelaporkan semua informasi yang tersedia yang memungkinkan Anda melakukan seleksi yang lebih halus atau menghasilkan lebih banyak informasi yang relevan.

Anda juga dapat memperoleh informasi langsung dari /sys. Dengan zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2
Stéphane Chazelas
sumber
Ini adalah jawaban yang benar dari seorang Guru, tidak ada yang akan bisa membacanya. : D
Archemar
Saya menganggap ini baik untuk diketahui. Tetapi pada tahap perjalanan saya di bash ini saya tidak ingin memperkenalkan kompleksitas lebih lanjut dengan menggunakan alat lain.
chalybeum
Itu aplikasi yang bagus jq(yang saya pelajari hanya beberapa bulan yang lalu).
Dubu
6

mencoba

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

ini akan grep dan filter pada saat yang bersamaan.

  • $4 ~ /G$/ diarsipkan dengan ukuran dalam G
  • $4+0 > 100 dapatkan ukuran lebih dari 100G
  • {print $1} cetak NAME

sebagai aturan Anda seharusnya tidak perlu menggunakan grepdan awkdalam pipa yang sama.

untuk mendapatkan hanya disk (dan tanpa partisi): awk filtering

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

dimana

  • $6 == "disk" pilih hanya kolom dengan disk

untuk mendapatkan hanya disk (dan tanpa partisi): lsblk filtering

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

dimana

  • --nodeps : -d, --nodeps tidak mencetak budak atau pemegang
Archemar
sumber
Hampir sampai. Itu masih mencetak partisi. Tapi saya pikir saya bisa mendapatkan itu ketika saya punya waktu luang sedikit.
chalybeum
1
@ Chalybeum saya memperbaikinya, trik penyaringan yang sama dapat diterapkan untuk jawaban muru.
Archemar
(Meskipun saya mungkin akan menggunakan --no-depsopsi, sesuai dengan gaya umum jawaban itu)
muru
2
Saya khawatir ini akan gagal untuk menangkap disk yang ukurannya ditampilkan dalam terabyte (atau unit yang lebih besar).
fra-san
@ titik adil fra-san dan juga berlaku untuk solusi asli saya. Jadi saya mengambil sedikit filter disk dari sini dan memasukkannya ke dalam konversi byte.
chalybeum