I wrote the following script to check my servers:
#!/bin/bash
rm -f /tmp/res-ok.txt 1>/dev/null 2>/dev/null
rm -f /tmp/res-failed.txt 1>/dev/null 2>/dev/null
echo "***********************************************"
echo "*+++++++++++++++++++++++++++++++++++++++++++++*"
echo "*+ +*"
echo "*+ PINGING SERVERS: Is UP OR DOWN +*"
echo "*+ +*"
echo "*+++++++++++++++++++++++++++++++++++++++++++++*"
echo "***********************************************"
echo " ================ ============ "
echo "| IP ADDRESS | | STATUS |"
echo " ================ ============ "
while read ip; do
ping $ip -s 1 -c 1 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
echo " $ip UP"
echo $ip >> /tmp/res-ok.txt
elif [ $? -ne 0 ]; then
echo " $ip DOWN"
echo $ip >> /tmp/res-failed.txt
fi
echo "-----------------------------------------------"
done <<____HERE
____HERE
ok=`wc -l /tmp/res-ok.txt | awk '{sum += $1} END {print sum}'`
failed=`wc -l /tmp/res-failed.txt | awk '{sum += $1} END {print sum}'`
echo You have $ok servers UP
echo You have $failed servers DOWN
how can I tell my script that show STATUS column
[the second column] in the specific place?[exactly]
I think I should control cursor..how?
any idea?
thank you
If I understand your Problem correctly, your Layout is broken, because you have IP-adresses of different lengths. Depending on how much different they are, you could get a better fitting layout by using tabulators instead of just blanks:
echo -e " $ip\t\t\t\tDOWN"
... or by piping your output through column:
output="$output `echo -e "\n$ip UP"`"
...
## Outputting your output:
echo -e "$output" | column -t
Result:
172.16.2.4 UP
172.16.2.5 UP
192.168.178.200 UP
192.168.178.254 UP
For the latter to look perfect, you might have to adjust the width of your welcome-header to the resulting width of your output.
You could also add more blank columns in between your fields by adding a seperator:
output="$output `echo -e "\n$ip - UP"`"
Result:
172.16.2.4 - UP
172.16.2.5 - UP
192.168.178.200 - UP
192.168.178.254 - UP
192.168.178.254 - UP
So after those changes your script should look like this:
#!/bin/bash
rm -f /tmp/res-ok.txt 1>/dev/null 2>/dev/null
rm -f /tmp/res-failed.txt 1>/dev/null 2>/dev/null
echo "***********************************************"
echo "*+++++++++++++++++++++++++++++++++++++++++++++*"
echo "*+ +*"
echo "*+ PINGING SERVERS: Is UP OR DOWN +*"
echo "*+ +*"
echo "*+++++++++++++++++++++++++++++++++++++++++++++*"
echo "***********************************************"
echo " ============= ============ "
echo "| IP ADDRESS | | STATUS |"
echo " ============= ============ "
output="" ## Unset the variable, in case it still contains anything.
while read ip; do
ping $ip -s 1 -c 1 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
output="$output `echo "\n$ip - UP"`"
echo $ip >> /tmp/res-ok.txt
elif [ $? -ne 0 ]; then
output="$output `echo "\n$ip - DOWN"`"
echo $ip >> /tmp/res-failed.txt
fi
echo "-----------------------------------------------"
done <<____HERE
____HERE
echo -e "$output" | column -t
ok=`wc -l /tmp/res-ok.txt | awk '{sum += $1} END {print sum}'`
failed=`wc -l /tmp/res-failed.txt | awk '{sum += $1} END {print sum}'`
echo You have $ok servers UP
echo You have $failed servers DOWN