Làm thế nào để nắm bắt tỷ lệ phần trăm sử dụng đĩa của một phân vùng như một số nguyên?


16

Tôi muốn một phương pháp để nắm bắt việc sử dụng đĩa của một phân vùng cụ thể, bằng cách sử dụng thư mục nơi phân vùng được gắn kết. Đầu ra chỉ nên là một số nguyên không có phần đệm hoặc ký hiệu sau, vì tôi muốn lưu nó vào một biến.

Tôi đã sử dụng df --output=pcent /mount/point, nhưng cần phải cắt đầu ra vì nó có một tiêu đề không cần thiết, phần đệm không gian đơn trước giá trị và ký hiệu% theo sau giá trị như sau:

Use%
 83%

Trong trường hợp này, đầu ra tôi muốn chỉ đơn giản là 83. Tôi không nhận thấy bất kỳ nhược điểm nào khi sử dụng đầu ra của df, nhưng rất vui khi chấp nhận các phương pháp khác không dựa vào nó.


1
Tại sao không chỉ đơn giản là phân tích nó?
Jacob Vlijm

1
Tôi cũng không thấy nhược điểm, bạn có thể xóa tiêu đề bằng df rồi | tr -dc '0-9'

Tôi đứng chính xác, tôi không thể tìm thấy công tắc để loại bỏ tiêu đề khỏi df.

Tôi đã đọc trang người đàn ông, và trang thông tin và không thể tìm thấy nó @ bc2946088, tiếng hét tốt để xem xét tr, tôi đã nhận được trong đầu một mớ hỗn độn với những ý tưởng sed và awk.
Arronical 10/11/2016

3
Tôi cũng đã tìm cách loại bỏ tùy chọn tiêu đề. Về cơ bản các nhà phát triển GNU không muốn triển khai nó. Đã có những yêu cầu tính năng, và họ chỉ nói không.
Sergiy Kolodyazhnyy

Câu trả lời:


19

Tôi sẽ sử dụng ...

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

Không chắc chắn nếu sed nhanh hơn, nhưng tôi không bao giờ nhớ các giá trị sed.


1
Sử dụng timeđể kiểm tra nó đi ra là nhanh như sed.
Arronical

4
@Arronical trừ khi đầu ra của bạn là waaaaaaaaaaaay lớn hơn 100%, tôi nghi ngờ bạn sẽ thấy nhiều sự khác biệt. : P
muru

@Arronical Những gì muru nói; thời gian gọi có khả năng chi phối.
một CVn

1
Trong trường hợp này, trdễ đọc hơn sed.
Paddy Landau

7

Đây là giải pháp tuyệt vời:

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

Về cơ bản điều xảy ra ở đây là chúng tôi coi ký tự '%' là dấu tách trường (dấu phân cách cột) và chỉ in cột đầu tiên $ 1 khi số lượng bản ghi bằng hai ( NR==2phần)

Nếu chúng ta muốn sử dụng bashcác công cụ chỉ dùng một lần, chúng ta có thể làm một cái gì đó như thế này:

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

Và để giải trí, thay thế sedthông qua nhóm chụp và -rcho regex mở rộng:

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

6

sed giải pháp

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d xóa dòng đầu tiên
  • ; để tách các lệnh
  • s/^ // xóa một khoảng trắng từ đầu dòng
  • s/%//xóa %dấu

6

Bạn có thể chuyển sang một grepchữ số chỉ trích xuất:

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

Xem trực tiếp:

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

1

Tôi đã gặp một máy chủ nơi --output = pcent chưa được triển khai, vì vậy tôi đã sử dụng đầu ra bình thường, được lọc theo cột, theo sau là regex: df /mount/point | awk '{print $5}' | tr -dc '0-9'


1
Bạn nên thêm -P hoặc - khả năng di động vào df; mặt khác, nếu / mount / point kéo dài, nó sẽ ngắt dòng và bạn nhận được giá trị sai.
SvennD

1

Giải pháp hai bước Bash

Là một người hâm mộ cuồng nhiệt (Borne Again SHell) năm ngoái tôi nghĩ tôi sẽ đề xuất một giải pháp sử dụng nó.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • Dòng 1 nắm bắt dfđầu ra để biến DF_PCT.
  • Dòng 2 loại bỏ mọi thứ không phải là chữ số DF_PCTvà hiển thị trên màn hình.
  • Lợi thế hơn câu trả lời được chấp nhận là nguồn cấp dữ liệu sau khi tỷ lệ phần trăm ( 5trong trường hợp này) được tạo.

1

Đây là một giải pháp khác:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
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.