【发布时间】:2018-01-12 14:46:06
【问题描述】:
只需要做一些我可以自己处理的基本事情,但结果我对我得到的结果表示怀疑......
我需要在两个不同服务器上的特定文件系统上使用 df 命令生成总计。
ssh server1 df -mP | egrep "/dev/md10|/dev/md11" | sort ; ssh server1 df -mP --total | grep "total" | egrep -v "/dev/md10|/dev/md11
结果:
/dev/md10 183004016 87303581 95700436 48% /si001c1
/dev/md11 183004016 165986430 17017587 91% /si001c2
total 366565396 253332843 113232554 70%
然后我在第二台服务器上使用相同的命令来获取总数。我的问题,我得到的总计似乎不正确(我不确定)以及如何通过使用单行命令或作为 bash 中的基本脚本结合使用相同的命令来生成总计。感谢您的帮助。
更新: 这是遵循@EdmCoff 指南后的更新。
printf "Grand total: " ; (ssh server1 df -m /dev/md11 ; ssh server2 df -m /dev/md1*) | awk 'a+=$2;b+=$3;c+=$4;d+=$5/3} END {print a" "b" "c" "d%}'
结果:
Grand total: 549012050 501832399 47179652 92%
构建一个脚本(重新完成):
#!/bin/bash
(ssh server1 df -m --no-sync "/dev/md11" ; ssh server2 df -m --no-sync "/dev/md1*") | sed -e /^Filesystem/d | sort > df_udsall
#(cat df_udsall)
printf "\nUDS:\nserver1 & server2\n"
printf "Mounted on Free space Disk usage Use"%%" Disk state"
while read df_udsall
do
USAGE=$(echo $df_udsall ; echo $grand_total) | awk '{print $5}' | cut -d"%" -f1
if [[ "$USAGE" -ge " 95" ]]
then
STATUS='CRITICAL'
elif [[ "$USAGE" -ge " 90" ]]
then
STATUS='WARNING'
else
STATUS='OK'
fi
printf "$(echo $df_udsall | awk '{print $6, $4, $3, $5}' > df_udsall_stats)"
column -t df_udsall_stats | perl -ne 'chomp ; printf "\n%-18s %8s %12s %6s %-2s", split / +/' ; printf "`echo -ne $STATUS`"
done < df_udsall
printf "\n\nGrand total " ; cat df_udsall | awk '{b+=$4;c+=$3;d+=$5/3} END {print b" "c" "d "%"}' > grand_total
column -t grand_total | perl -ne 'chomp ; printf "%15s %12s %6s %-2s", split / +/' ; printf "`echo -ne $STATUS`"
rm -f df_udsall df_udsall_stats grand_total
上面的脚本需要一些微调。
预期结果:
UDS:
server1 & server2
Mounted on Free space Disk usage Use% Disk state
/sic1 16202762 166801255 92% WARNING
/sic2 15648157 167355860 92% WARNING
/sic3 15256569 167747448 92% WARNING
Grand total: 47107488 501904563 92% OK
固定三元组脚本输出结果:
UDS:
server1 & server2
Mounted on Free space Disk usage Use% Disk state
/sic001c1 92146461 90857556 50% OK
/sic001c2 16873531 166130486 91% WARNING
/sic001c3 16832710 166171307 91% WARNING
/sic001c4 16362388 166641629 92% WARNING
Grand total: 142215090 589800978 81 OK%
【问题讨论】:
-
总是为
root用户保留文件系统的百分之几。所以你的总数没有加起来并不奇怪 -
为了将您的两个命令合并为一个总计,您是否考虑过只使用 awk?我正在想象类似
(command for server 1; command for server 2) | awk '/total/ {a+=$2;b+=$3;c+=$4} END {print a" "b" "c}' -
@EdmCoff 感谢您的命令,但我仍然更喜欢在上面提到的两台服务器上或多或少获得相同结果的东西。我不是 Linux 人,但每天玩起来很有趣,因为我很想尝试与其他操作系统不同的东西。我尝试运行命令
(ssh server1 df -mP --total /dev/md1* ; ssh server2b df -mP --total /dev/md1*) | awk '/total/ {a+=$2;b+=$3;c+=$4} END {print a" "b" "c}',但结果不如预期。学习一些我实际上不知道的新命令是件好事。 -
对不起,我误解了你所说的总计的意思(我以为你想合并两个服务器的总计)。假设您想同时对三列求和,我的建议仍然是 awk。所以,
ssh server1 df -mP /dev/md1* | awk '{a+=$2;b+=$3;c+=$4} END {print a" "b" "c}'(即你的命令没有总和所有列)或ssh server1 df -mP --total /dev/md1* | awk '!/total/ {a+=$2;b+=$3;c+=$4} END {print a" "b" "c}'(即在你的命令中包括总数,但在 awk 命令中排除它)。 -
如果你真的想使用 bc,我建议像
ssh server1 df -mP /dev/md1* | tr -s ' ' | cut -d" " -f 2,2 | paste -sd+ - | bc这样我使用tr命令将多个空格替换为一个空格,cut命令只是第二列数字,paste命令将列重新格式化为 num1+num2+num3+etcetera,bc命令进行数学运算。显然,您需要更改要求和的列的剪切命令。
标签: bash linux-disk-free