วิธีการจับเปอร์เซ็นต์การใช้งานดิสก์ของพาร์ติชันเป็นจำนวนเต็ม?


16

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

ฉันเคยใช้df --output=pcent /mount/pointแต่จำเป็นต้องตัดแต่งเอาต์พุตเนื่องจากมีส่วนหัวที่ไม่จำเป็นการเว้นวรรคเดียวก่อนค่าและสัญลักษณ์% ตามค่าดังนี้:

Use%
 83%

ในกรณีนี้ผลลัพธ์ที่ฉันต้องการก็83คือ ฉันไม่ได้ตระหนักถึงข้อเสียเปรียบใด ๆ ที่จะใช้ผลลัพธ์ของdfแต่ฉันยินดีที่จะยอมรับวิธีการอื่น ๆ ที่ไม่พึ่งพา


1
ทำไมไม่แยกมันง่ายๆ?
Jacob Vlijm

1
ฉันไม่เห็นข้อเสียเปรียบคุณสามารถลบส่วนหัวด้วย df แล้ว | tr -dc '0-9'

ฉันยืนถูกต้องฉันไม่พบสวิตช์เพื่อลบส่วนหัวออกจาก df

ฉันอ่านหน้าคนและหน้าข้อมูลและไม่พบมันอย่างใดอย่างหนึ่ง @ bc2946088 การตะโกนที่ดีที่ต้องพิจารณาtrฉันได้รับหัวของฉันยุ่งกับความคิดที่ไม่ดี
Arronical

3
ฉันได้ค้นหาการลบตัวเลือกส่วนหัวด้วย โดยทั่วไปนักพัฒนา GNU นั้นไม่ค่อยเต็มใจที่จะใช้ มีการร้องขอคุณสมบัติแล้วและพวกเขาก็ตอบว่าไม่
Sergiy Kolodyazhnyy

คำตอบ:


19

ฉันจะใช้ ...

df --output=pcent /mount/point | tr -dc '0-9'

ไม่แน่ใจว่า sed เร็วกว่าหรือเปล่า แต่ฉันจำค่า sed ไม่ได้เลย


1
ใช้timeเพื่อทดสอบมันออกมาว่าเร็วพอ ๆ
Arronical

4
@ ผิดปกติเว้นแต่ว่าเอาต์พุตของคุณจะ waaaaaaaaaaaay มากกว่า 100% ฉันสงสัยว่าคุณจะเห็นความแตกต่างมาก : P
muru

@ เกี่ยวกับสิ่งที่ muru พูด; เวลาขอร้องนั้นมีแนวโน้มที่จะครอง
CVn

1
ในกรณีนี้จะง่ายต่อการอ่านกว่าtr sed
Paddy Landau

7

นี่คือวิธีแก้ปัญหา awk:

$ df --output=pcent /mnt/HDD | awk -F'%' 'NR==2{print $1}'   
 37

โดยทั่วไปสิ่งที่เกิดขึ้นที่นี่คือเราใช้อักขระ '%' เป็นตัวคั่นฟิลด์ (ตัวคั่นคอลัมน์) และพิมพ์คอลัมน์แรก $ 1 เฉพาะเมื่อจำนวนระเบียนเท่ากับสอง ( NR==2ส่วน)

หากเราต้องการใช้bashเครื่องมืออย่างเดียวเราสามารถทำสิ่งนี้:

bash-4.3$ df --output=pcent / | while IFS= read -r line; do 
>     ((c++)); 
>     [ $c -eq 2 ] && echo "${line%\%*}" ;
> done
 74

และเพื่อความสนุกสนานทางเลือกsedผ่านกลุ่มการจับภาพและ-rสำหรับ regex แบบขยาย:

df --output=pcent | sed -nr '/[[:digit:]]/{s/[[:space:]]+([[:digit:]]+)%/\1/;p}'

6

sed วิธีการแก้

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d ลบบรรทัดแรก
  • ; เพื่อแยกคำสั่ง
  • s/^ // ลบช่องว่างออกจากจุดเริ่มต้นของบรรทัด
  • s/%//ลบ%เครื่องหมาย

6

คุณสามารถไพพ์ไปยัง a grepที่เพิ่งแยกตัวเลข:

df --output=pcent /mount/point | grep -o '[0-9]*'

ดูสด:

$ echo "Use%
> 83%" | grep -o '[0-9]*'
83

1

ฉันพบเซิร์ฟเวอร์ที่ --output = pcent ยังไม่ได้ใช้งานดังนั้นฉันจึงใช้เอาต์พุตปกติกรองตามคอลัมน์ตามด้วย regex: df /mount/point | awk '{print $5}' | tr -dc '0-9'


1
คุณควรเพิ่ม -P หรือ - พกพาไปที่ df; มิฉะนั้นถ้า / mount / point ยาวขึ้นมันจะขึ้นบรรทัดใหม่และคุณได้ค่าที่ผิด
SvennD

1

Bash โซลูชันสองขั้นตอน

เมื่อปีที่แล้วฉันคิดว่าฉันเสนอวิธีการแก้ปัญหาโดยใช้มัน

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • บรรทัดที่ 1 จับส่งออกไปยังตัวแปรdfDF_PCT
  • บรรทัดที่ 2 ตัดทุกอย่างที่ไม่ใช่ตัวเลขDF_PCTและแสดงบนหน้าจอ
  • ความได้เปรียบเหนือคำตอบที่ยอมรับคือการป้อนบรรทัดหลังจากเปอร์เซ็นต์ ( 5ในกรณีนี้) ถูกสร้างขึ้น

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