IP_LIST="127.0.0.1 0.0.0.0"
# 提供远程主机IP地址列表
(
for ip in $IP_LIST
do
ssh slynux@$ip 'df -H' | grep ^/dev/ > /tmp/$$.df
while read line;
do
cur_date=$(date +%D)
printf "%-8s %-14s " $cur_date $ip
echo $line | awk '{ printf("%-9s %-8s %-6s %-6s %-8s", $1,$2,$3,$4,$5); }'
pusg=$(echo $line | egrep -o "[0-9]+%")
pusg=${pusg/\%/};
if [ $pusg -lt 80 ];
then
echo SAFT
else
echo ALERT
fi
done< /tmp/$$.df
done
)>>$logfile
( )中的语句会在新建shell中执行(产生一个新进程),其中任何语句的标准输出都会被重定向到log文件$logfile中去(追加写方式)。
while read line
do
......
done </tmp/$$.df
读取文件/tmp/$$.df,read命令每次读取一行内容,所以while循环的每次迭代都只处理该文件的一行内容(变量line)。
$$ 表示当前进程的PID,最常见的用途就是用作临时文件的名字以保证文件名不重复。
追问pusg=${pusg/\%/}; 这句是把%去掉?还是显示匹配的有%的行?最后重新赋值
追答这是字符串替换方法。
看下面的例子就明白:
作用就是去除第一个%(将第一次出现的%替换为空)。%有特殊含义,前面需要加转义符。
${x/a/b}
将字符串x中的第一个a替换为b。
echo ${x//a/b}
将字符串x中的所有a都替换为b。
是我的for语句写错了,少了个in
改了就好了,
但是执行后说最后一行ambiguous redirect
你的logfile也写错了,脚本第二行。
追问其他的都改了,也能执行了,但是这一行应该有问题,
执行之后提示
如果改成
又提示:
改成:
又变成这样了:
不知道怎么是对的... 唉,麻烦你了
grep ^/dev/ 这样的写法貌似是不正确的。
grep中的正则不需要加 / / 这种形式。