Cách in tỷ lệ phần trăm sử dụng đĩa từ `df -hl`


12

Tôi biết rằng sẽ đưa df -hlra một danh sách tất cả các phân vùng của tôi với kích thước, mức độ sử dụng theo tỷ lệ phần trăm và không gian có sẵn.

Nếu tôi muốn chỉ xuất kích thước và mức sử dụng theo tỷ lệ phần trăm sda2sda3, ví dụ, làm thế nào tôi có thể yêu cầu Linux (Ubuntu) kiểm tra chúng, tổng hợp chúng và hiển thị chúng cho tôi?


1
Các câu trả lời dưới đây có thể được đơn giản hóa bằng cách thay đổi lệnh df mà họ sử dụng để đặt các đĩa trên dòng lệnh df thay vì phân tích cú pháp qua tất cả các đĩa. tức là df -hl / dev / sda [23]
mdpc

Câu trả lời:


11

Để dftính tổng, sử dụng --totalstùy chọn. Nếu bạn chỉ muốn tổng số trên một số ổ đĩa được chọn, hãy chỉ định chúng làm đối số.

Ví dụ (và đầu ra từ máy tính của tôi)

Đây là tổng số cho tất cả các gắn kết địa phương:

$ df --total -hl
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
none                  490M  660K  489M   1% /dev
none                  497M  1,5M  495M   1% /dev/shm
none                  497M  260K  496M   1% /var/run
none                  497M     0  497M   0% /var/lock
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  19G   12G  7,3G  62%

Giới hạn ở một vài ổ đĩa (lưu ý rằng nếu đường dẫn được chỉ định không phải là điểm gắn kết chính xác, điểm gắn kết chứa gần nhất được sử dụng [xem ghi chú ở cuối] ):

$ df -hl --total /home /fastdisk
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  17G   12G  5,3G  69%

hoặc sử dụng devtên:

$ df -hl --total /dev/sda1 /dev/sdb1
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
/dev/sdb1              14G   12G  2,1G  85% /
total                  17G   12G  5,3G  69%

Tùy chỉnh thêm

Nếu bạn muốn liệt kê tất cả các mount ngoại trừ các mount 'đặc biệt', bạn có thể sử dụng -xtùy chọn để loại trừ theo loại phân vùng. (Sử dụng -Ttùy chọn để hiển thị các loại.)

Cá nhân, để sử dụng tương tác, tôi sử dụng bí danh bash sau (được thêm vào ~/.bash_aliases) để loại trừ các gắn kết 'phi vật lý'.

alias df='df -h -x devtmpfs -x tmpfs -x debugfs'

Ghi chú

Việc chỉ định các đường dẫn trong các điểm gắn kết đôi khi có thể mang lại kết quả ở dạng khác nhau chỉ định đường dẫn chính xác đến điểm gắn kết. Ví dụ, trên máy tính xách tay của tôi, tôi sử dụng sshfsđể gắn máy chủ tệp (cục bộ) của mình.

df -h ~/.server-root/ ~/.server-root/disks/A ~/.server-root/disks/B
Filesystem            Size  Used Avail Use% Mounted on
johan@server:/        185G   58G  118G  33% /home/johan/.server-root
johan@server:/        1,9T  637G  1,2T  35% /home/johan/.server-root
johan@server:/        1,8T  1,1T  757G  59% /home/johan/.server-root

Máy chủ gốc ( /) được gắn kết tại ~/.server-root. Tuy nhiên, trên máy chủ, các đĩa được gắn vào /disks/*, mà df(trên máy tính xách tay) không 'biết'.

Rõ ràng dfcó thể liệt kê việc sử dụng đĩa trên các mount khác nhau trên máy chủ, nếu được cung cấp các đường dẫn thích hợp. Tuy nhiên, nó hiển thị cùng một hệ thống tập tin và cài đặt trên bộ dữ liệu và cài đặt trên các đường dẫn, vì (tôi tin) đó là điểm gắn kết duy nhất (liên quan đến giá trị sshfsgắn kết này ) trong bảng gắn kết hạt nhân cục bộ.


Một điều nữa: Không thực sự liên quan đến câu hỏi, nhưng liên quan đến câu trả lời trước cho câu hỏi.

Thêm các số bằng một awktập lệnh (hoặc tương tự), giống như một số câu trả lời được đăng trước đó, không phải là một ý tưởng tốt khi sử dụng -hcờ. Điều này là do xử lý đặc biệt là cần thiết. Bạn không thể chỉ làm size+=$2;cho một lĩnh vực nằm 418Mtrên một hàng và 12Gtrên một lĩnh vực khác và nhận được một cái gì đó hữu ích từ nó.

Ví dụ với awk, thêm 500Mvào 10.2Gnăng suất

$ echo -e '500M\n10.2G' | awk '{size+=$1;} END{print size;}'
510.2

510,2 của cái gì?

Rõ ràng có một vấn đề ở đây. Vì vậy, chỉ là một mẹo cần nhớ , khi thực hiện tính toán (tự động) trên đầu ra của df (và các số khác có thể sử dụng số 'con người có thể đọc được' ) . Thay vào đó, hãy đảm bảo rằng bạn không sử dụng -hcờ và đầu vào cho tập lệnh tính toán, thay vào đó, được chuẩn hóa (ví dụ: theo byte, khối, KB hoặc bất cứ thứ gì) và thực hiện 'chia tỷ lệ hiển thị' ở cuối. Trong hầu hết các ngôn ngữ lập trình và lập trình, không khó để thêm một cái gì đó như:

If value < threshold Then
  print (value),"B"
Else If value < 1024*threshold Then
  print (value/1024),"kB"
Else If value < 1024*1024*threshold Then
  print (value/1024/1024),"MB"
(and so on...)

trong đó giá trị tính bằng byte và ngưỡng là giá trị theo thứ tự 1000. Kết quả của phương pháp này là bạn có thể dễ dàng điều chỉnh nó để tạo ra các giá trị in (không bao gồm tiền tố) trong một phạm vi mong muốn và với một số chữ số có nghĩa lựa chọn. So với trường hợp với các tiện ích tiêu chuẩn có -hcông tắc, trong đó định dạng thường được cố định.

Tất nhiên, phép tính này thường có thể được thực hiện hiệu quả và / hoặc thanh lịch hơn, nhưng đó là một câu hỏi cho ngôn ngữ cụ thể được viết bằng. Thành thật mà nói, nếu nó được sử dụng trong tập lệnh người dùng chỉ chạy bây giờ và sau đó để xem tương tác một số thông tin, hiệu quả không thực sự là một mối quan tâm.


4

Tôi nghĩ rằng bạn muốn tổng của cả hai sizeuse%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t

Ditto, giống như trên.
dùng32398

@ user32398: Có sự khác biệt anh chàng.
pradeepchhetri

Cuối câu trả lời của tôi cho câu hỏi này, tôi đã giải thích một chút về lý do tại sao không sử dụng cách tiếp cận awk đơn giản (chỉ size+=$1) cho câu hỏi này. Phương pháp này thực sự không tương thích với -htùy chọn df.
Johan E

2

Bạn sẽ sử dụng một công cụ như awk :

df -hl | awk '/^\/dev\/sd[ab]/ { sum+=$5 } END { print sum }'

Ở đâu:

  • /^\/dev\/sd[ab]/là một mẫu để chỉ lọc những dòng bắt đầu bằng /dev/sdahoặc/dev/sdb
  • { sum+=$5 } thêm trường thứ năm cho bất kỳ kết quả khớp nào của mẫu trên

Bạn có thể tìm thấy một số awktài liệu tham khảo hữu ích trên wiki Awk.info .


Tôi nghĩ rằng nó không đủ để tổng hợp%, nhưng cảm ơn tôi đã có ý tưởng.
dùng32398

1
sudo df -hl | grep 'mountdirname' | awk '{print $5}'

1
Ông yêu cầu size, % usedavailable. Không chỉ% được sử dụng. Ngoài ra @mdpc có một phương pháp tốt hơn để chọn ra ổ đĩa, nhưng nếu bạn muốn mô hình khớp với awk thì có thể làm điều đó: df -hl | awk '/sda2/{print $2,$5,$4}'
jesse_b

0

Nếu bạn muốn có thông báo, tôi sẽ thực hiện với IFTTT, Telegram và WebHooks (Tất cả đều miễn phí)

#!/bin/bash
diskusage=$(df -H | grep -vE '^Filesystem|tmpfs|cdrom|mmcblk0p1' | awk '{ print $5 " " $1 }'| cut -f1 -d '%')
hostname=$(hostname)
tolerance=(85)
date=$(date)

if [[ "$diskusage" -gt "$tolerance" ]]
        then
        echo ""
        echo total disk usage is $diskusage%
        echo ""
        curl -X POST -H "Content-Type: application/json" -d '{"value1":"--Alert--","value2":"Total disk usage is '$diskusage'% ","value3":"Host information: '$hostname' "}' https://maker.ifttt.com/trigger/{alert}/with/key/PutYourKeyHEre
fi
echo ''
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date >> /var/log/IFTTT/checkdiskspace.log
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.