มันต้องใช้ sudo แต่ใช้งานได้:
sudo lshw | grep -Pzo "\*-(ดิสก์|เนมสเปซ)(\n.*)+?\s+ขนาด:.*?\(\K\d+\w+" | tr "\0" "\n" | วาง - เอสดี/
มันให้ผลลัพธ์ดังนี้:
1TB/750GB
ไม่เช่นนั้นคุณจะไม่ทราบว่าเป็น TB/GB/MB หรือไม่ นั่นคือเหตุผลที่ฉันเก็บไว้
แก้ไข: ฉันสังเกตเห็น .*
ไม่จำเป็นต้องใช้ regex คำสั่งด้านบนได้รับการปรับปรุง
คำอธิบาย:
sudo lshw
: อืม... รายชื่อฮาร์ดแวร์ เราต้องการ sudo เพื่อดูไดรฟ์ในระบบ นี่จะเป็นแหล่งข้อมูลของเรา
grep -Pzo
: เราจะใช้ regex เพื่อรับข้อมูลที่จำเป็น
-P = เปิดใช้งาน perl regex
-z = ถือว่าทุกอย่างเป็นหนึ่งบรรทัดยาว สิ่งนี้จำเป็นเนื่องจากเรากำลังจะใช้ regex หลายบรรทัด
-o = แทนที่จะแสดงผลลัพธ์และทำเครื่องหมายผลลัพธ์เป็นสีแดง เพียงแค่แสดงผลลัพธ์
regex
(เคล็ดลับ: ลบ -o (a.k.a -Pz) และเพิ่ม regexes ด้านล่างทีละรายการเพื่อดูว่าเกิดอะไรขึ้นทีละขั้นตอน ข้อความสีแดงคือสิ่งที่ regex จับคู่ คุณจึงเห็นทีละขั้นตอนว่าเราเข้าใกล้กันมากขึ้น สู่ผลลัพธ์ที่ต้องการและสิ่งที่ทุกย่างก้าวเปลี่ยนสู่ผลลัพธ์):
\*-(disk|namespace) = ค้นหาข้อความทั้งหมดที่เป็น "*-disk" หรือ "*-namespace" เราต้องหลีกเลี่ยง (= \) "*" เพราะใน regex หมายถึงศูนย์หรือมากกว่านั้น แต่เราไม่ต้องการแบบนั้น เราต้องการค้นหาตัวอักษร "*"
(\n.*)+ = เพิ่ม ("+" = หนึ่งบรรทัดขึ้นไป) ต่อไปเรื่อยๆ ("\n" = ไปที่บรรทัดถัดไป ".*" = ทุกอย่างในบรรทัดนั้น) ในข้อความที่ตรงกัน; คุณจะเห็นว่าตอนนี้ทุกอย่างภายใต้การจับคู่ครั้งแรกของ "\*-(disk|namespace)" เป็นสีแดง
?\s+size: = เราเพิ่มบรรทัดต่อไปเรื่อย ๆ จนกว่าเราจะเจอช่องว่างแรก ("?" = ไม่โลภหรือที่รู้จักกันว่าการจับคู่แรกแทนที่จะเป็นการจับคู่สุดท้าย) ของช่องว่างอย่างน้อยหนึ่งช่อง (= "\s+"; "\ s" คือช่องว่าง (แท็บ เว้นวรรค ฯลฯ); "+" คือหนึ่งหรือมากกว่า) แล้วตามด้วย "ขนาด:"; คุณจะเห็นว่าผลลัพธ์นั้นเข้าใกล้ตัวเลขที่ต้องการมากขึ้น
.* = จับคู่ส่วนที่เหลือของบรรทัดนั้น
?\( = จนกว่าจะถึงคู่แรก (= ?) ของ "(" ซึ่งเราต้องหลีกเลี่ยงเพราะใช้ใน regex (คุณสามารถดูได้ว่าใช้ในส่วนแรกของ regex ที่นี่)
\K\d+\w+ = จับคู่ตัวเลข (= \d) อย่างน้อยหนึ่งครั้ง (= "+") และหลังจากนั้น อักขระคำ (= \w) อย่างน้อยหนึ่งครั้ง (= "+") ขณะนี้เรามีข้อความที่ต้องการในการจับคู่ แต่เราไม่ต้องการให้ข้อความที่ตรงกันทั้งหมดก่อนหน้านั้นในเอาต์พุต เราจึงใส่ "\K" ก่อนข้อความที่ต้องการเพื่อลบข้อความที่ตรงกันก่อน "\K" จาก ผลลัพธ์. ยังคงต้องจับคู่ แต่ไม่รวมในเอาต์พุต สิ่งนี้ทำให้ regex ทั้งหมดที่อยู่ข้างหน้าเป็น lookbehind ในเชิงบวก (look it up; "positive lookbehind perl regex") ด้วยความสามารถของ regex
tr "\0" "\n"
:
จะเห็นว่าเราได้ข้อความที่ต้องการตรงกันแล้ว ไม่มากก็น้อย
เมื่อเราเพิ่ม -o อีกครั้ง คุณจะเห็นว่าผลลัพธ์แสดงออกมาในลักษณะแปลกๆ (เรียงตามกัน)
นั่นเป็นเพราะมันคั่นด้วยอักขระว่าง (= \0) ซึ่งคุณมองไม่เห็น แทนที่จะขึ้นบรรทัดใหม่ นี่คือสิ่งประดิษฐ์ของตัวเลือก "-z" ของ grep
เพื่อแสดงในรายการปกติ กำลังจะแทนที่อักขระ null ด้วยการขึ้นบรรทัดใหม่โดยใช้ ท
.
วาง -sd/
: ตอนนี้เรามีผลลัพธ์เป็นรายการแล้ว เราสามารถใช้คำสั่ง paste เพื่อวางผลลัพธ์ไว้หลังกัน โดยใช้ "/" เป็นตัวแบ่ง