त्रुटि -geसंख्यात्मक नहीं होने के एक तर्क के कारण है । चूंकि $ALERTहमेशा संख्यात्मक होता है, $usepअपराधी होना चाहिए। जिस तरह से आप संख्यात्मक dhपरिणाम $usepनहीं होने के परिणामस्वरूप पार्स करते हैं, उसके साथ कई समस्याएं हैं ।
फाइलसिस्टम की लंबाई के आधार पर, dhइसका उत्पादन कई लाइनों पर विभाजित हो सकता है। आंशिक फ़िल्टर आपके फ़िल्टर में परिणाम और निरर्थक डेटा में पकड़े जाएंगे। इस व्यवहार से बचने और पार्स करने योग्य आउटपुट प्राप्त करने के लिए dh, -Pविकल्प पास करें ।
इसके अलावा dfएक हेडर लाइन प्रिंट करता है जिसके परिणामस्वरूप फिर से निरर्थक डेटा होगा।
आपका फ़िल्टर बहुत जटिल है। मैं जाग के एक पास का उपयोग करेंगे। उस मामले के लिए, आप awk के अंदर प्रतिशत पर फ़िल्टरिंग कर सकते हैं (लेकिन मैंने इसे निम्न स्क्रिप्ट में नहीं किया है)।
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
NR==1पहली पंक्ति से मेल खाता है, इसलिए NR==1 {next}पहली पंक्ति को छोड़ देता है। अगली कुछ पंक्तियाँ कुछ फाइल सिस्टम को बाहर करती हैं (ध्यान दें कि आपका विवरण कहता है कि आप abc:/xyz/pqrइसमें रुचि रखते हैं , लेकिन आपका कोड इसे छोड़ देता है)। अंतिम awk लाइन %इसे प्रिंट करने से पहले प्रतिशत कॉलम से निकाल देती है।
सभी फाइल सिस्टम के बारे में एक ही मेल भेजना अच्छा होगा। इस बार मैं जाग में सभी विश्लेषण कर रहा हूँ।
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi