chỉ hiển thị các dòng df có mức sử dụng fs nhiều hơn 80%


8
root@SERVER ~$ df
Filesystem  512-blocks  Free    %Used   Iused   %Iused  Mounted on
/dev/YXCV   655360      365632  45% 6322    13% /
/dev/ASDF   3801088     670648  83% 41759   32% /usr
/dev/ASR    1048576     500496  53% 5555    9%  /var

Làm cách nào tôi có thể chuyển dfđầu ra của lệnh để chỉ hiển thị các dòng có mức sử dụng nhiều hơn 80%?

ví dụ: nó sẽ chỉ hiển thị:

/dev/ASDF   3801088     670648  83% 41759   32% /usr

Câu trả lời:


20

Giả sử bạn không có tên thiết bị chứa khoảng trắng (điều này gây khó khăn khi phân tích cú pháp đầu ra của df):

df -P | awk '0+$5 >= 80 {print}'

Điều chỉnh số trường nếu bạn muốn sử dụng dfđịnh dạng đầu ra của triển khai thay vì định dạng POSIX.

Nếu không có 0+, sự so sánh sẽ là từ vựng ( 9%khi đó sẽ lớn hơn 80). Bằng cách sử dụng +toán tử số học nhị phân, chúng tôi buộc $5phải chuyển đổi thành một số (vì vậy 9%trở thành 9) và so sánh là số. Sử dụng + toán tử đơn nguyên (như trong awk '+$5 >= 80') hoạt động trong một số awktriển khai nhưng không phải trong các triển khai truyền thống (những cái được viết bởi A, W và K) trong đó toán tử đó bị bỏ qua.


df -P | awk '$5 >= 80 {print}'làm việc cho tôi: bạn có thể bao gồm một lưu ý về lợi ích của việc sử dụng substr? Cảm ơn bạn.
jasonwryan

@jasonwryan: Tôi không nhớ rõ liệu awk có bỏ qua các ký tự không phải là số khi giải thích một chuỗi dưới dạng số hay không. Nó thực sự, vì vậy thực sự không cần phải xóa dấu vết %một cách rõ ràng.
Gilles 'SO- ngừng trở nên xấu xa'

1
'$5 >= 80 công trình, tức là nó bỏ qua dấu vết %, nhưng < > ==không hoạt động theo cách tương tự ... trong khi phiên bản trừ (chỉnh sửa trước) dường như hoạt động trong hầu hết các tình huống so sánh, nhưng nó quá thất bại khi so sánh với < 100... Tôi đoán đó là bởi vì đó là so sánh một chuỗi con ..
Peter.O

@fred: Ồ, tôi hiểu rồi. Chuyển đổi số không bỏ qua hậu tố không phải là số, nhưng các toán tử so sánh hoạt động trên các chuỗi, vì vậy ở đây toán tử thực hiện so sánh chuỗi trừ khi cả hai chuỗi đều là số. Cách tốt nhất là buộc chuỗi thành một số (với +toán tử).
Gilles 'SO- ngừng trở nên xấu xa'

Bảy năm sau ... +1.
RonJohn

0

Không quá thanh lịch, nhưng hoạt động. Vui lòng thay thế ext4 bằng fs của riêng bạn (hoặc bằng grep và trong trường hợp có nhiều). Cũng thay thế 10 bằng giá trị ngưỡng của riêng bạn.

for fs in `cat /proc/mounts | grep ext4 | awk ' { print $2 }' | tr '\n' ' '` ;  do SPC=$( df $fs | awk 'END{ print $(NF-1) }' | sed 's/[^0-9]*//g' ) ; if [ $SPC -gt 10 ]; then  echo "$fs used more than 10";  fi done

Điều này rất hữu ích trong trường hợp bạn cần tích hợp nó trong một tập lệnh.
Spike.WD

-1

Tôi đồng ý với ddeimeke nhưng giải pháp này chỉ hoạt động với 80 đến 89% không hiển thị 93% chẳng hạn.

Để làm điều này (ví dụ> 70%):

df -k | egrep "([70,80,90][0-9]|100)%"

Điều đó sẽ không làm việc như mong đợi. Ý bạn là egrep "([789][0-9]|100)%"sao
phản ứng

-2
df | egrep "([89][0-9]|100)%"

sẽ thực hiện các mẹo.


3
và điều gì xảy ra khi tôi có 92% miễn phí trên một điểm gắn kết?
LanceBaynes

1
Nó hoạt động tốt cho 92%; nó hoạt động tốt trong 80 đến 100% ... Tôi khá bối rối về lý do tại sao ai đó đánh dấu nó xuống .... có thể đó là do dfđầu ra của tôi khác .... Aha! Tôi vừa kiểm tra: đầu ra mặc định của tôi chỉ hiển thị Filesystem 1K-blocks Used Available Use% Mounted on... vì vậy nó chỉ phụ thuộc vào đầu ra của bạn là gì (như được đề cập trong câu trả lời của Gilles) .. Nếu có một %cột thứ hai (như trong câu hỏi), một dấu vết .*%sẽ hoạt động: df | egrep "([89][0-9]|100)%.*%".. . Bây giờ tôi hiểu tại sao ai đó đánh dấu xuống ...
Peter.O
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.