ฉันสามารถย่อตัวกรองนี้ให้สั้นลงซึ่งพบว่าขนาดของดิสก์เกิน 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-999GB และมากกว่า 100T แต่ไม่มีอะไรระหว่าง 1-99T ฉันเข้าใจไหม (terabytes ~)
hanshenrik

ใช่นั่นเป็นข้อบกพร่องอย่างหนึ่งที่ทำให้ฉันสนใจและได้พูดคุยกันในคำตอบแล้ว ฉันจึงยอมรับคำตอบในการทำตัวกรองตามขนาดไบต์แทนที่จะอ่านได้โดยมนุษย์ หากคุณใช้วิธีอื่นฉันยินดีที่จะเรียนรู้เกี่ยวกับสิ่งนั้น
chalybeum

คำตอบ:


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^30100GiB หรือ100e9/ 1e11สำหรับ 100GB


เอ่อมันฉลาดจริงๆ! กำจัดสิ่งที่ไม่ต้องการในตอนแรก คำถามหนึ่ง: คุณใช้ x * 2 ** 30 เพียงเพื่อความสอดคล้องกับไบต์? จะมีข้อเสียเปรียบในการใช้ s.th เช่น 10 ** 3
chalybeum

@ chalybeum ใช่สำหรับไบต์ ไม่คุณสามารถใช้ 10 ** 9 ค่าไม่แตกต่างกันมากนัก
muru

โปรดทราบว่า OP กำลังกรองพาร์ติชั่นในหนึ่งซับ
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 GB แทนที่ด้วย107374182400(หรือ100*1024*1024*1024) เป็น 100 GiB เนื่องจากการปัดเศษlsblkตัวเองไม่มี-bรายงาน 100G สำหรับขนาดตั้งแต่ประมาณ 99.9278 ถึง 100.0488 GiB (ด้วยเหตุผลบางประการ))

ด้วยlsblk -OJb, lsblkรายงานข้อมูลที่มีอยู่ทั้งหมดซึ่งจะช่วยให้คุณทำเลือกปรับเม็ดเล็กมากขึ้นหรือการส่งออกข้อมูลเพิ่มเติมหรือที่เกี่ยวข้องมากขึ้น

/sysนอกจากนี้คุณยังจะได้รับข้อมูลโดยตรงจาก ด้วยzsh:

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

นี่เป็นคำตอบที่แท้จริงจากกูรูไม่มีใครสามารถอ่านได้ : D
Archemar

ฉันใช้สิ่งนี้เป็นสิ่งที่ดีที่จะรู้ แต่ในขั้นตอนนี้ในการเดินทางของฉันในทุบตีฉันไม่ต้องการแนะนำความซับซ้อนเพิ่มเติมโดยใช้เครื่องมืออื่น
chalybeum

นั่นเป็นแอปพลิเคชั่นที่ดีjq(ซึ่งฉันได้เรียนรู้เมื่อไม่กี่เดือนที่ผ่านมา)
Dubu

6

ลอง

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

สิ่งนี้จะ grep และตัวกรองในเวลาเดียวกัน

  • $4 ~ /G$/ รับการยื่นด้วยขนาดใน G
  • $4+0 > 100 รับขนาดมากกว่า 100G
  • {print $1} ชื่อปริ้นท์

ตามกฎแล้วคุณไม่ควรใช้grepและawkในไพพ์เดียวกัน

เพื่อรับดิสก์เท่านั้น (และไม่มีพาร์ติชัน): awk filter

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

ที่ไหน

  • $6 == "disk" เลือกเฉพาะคอลัมน์ที่มีดิสก์

เพื่อรับดิสก์เท่านั้น (และไม่มีพาร์ติชัน): lsblk filter

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

ที่ไหน

  • --nodeps : -d, - ไม่ต้องพิมพ์ทาสหรือตัวยึด

เกือบจะมี. มันยังคงพิมพ์พาร์ติชัน แต่ฉันคิดว่าฉันจะได้รับสิ่งนั้นเมื่อฉันมีเวลาว่าง
chalybeum

1
@ chalybeum ฉันแก้ไขแล้วว่าสามารถใช้เคล็ดลับการกรองเดียวกันกับคำตอบของ muru ได้
Archemar

(แม้ว่าฉันอาจจะใช้--no-depsตัวเลือกเพื่อให้เป็นไปตามสไตล์ทั่วไปของคำตอบนั้น)
387

2
ฉันกลัวว่านี่จะไม่สามารถจับดิสก์ที่มีขนาดแสดงเป็นเทราไบต์ (หรือหน่วยที่ใหญ่กว่า)
fra-san

@ fra-san fair point และเป็นจริงสำหรับโซลูชันดั้งเดิมของฉัน ดังนั้นฉันจึงใช้บิตตัวกรองดิสก์จากที่นี่และวางไว้ในการแปลงไบต์
chalybeum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.