2014-02-02 3 views
0

Я написал следующий сценарий, чтобы проверить мои серверы:управления курсором в Баш скрипт

#!/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 

, как я могу сказать, мой сценарий, который покажет STATUS column [второй столбец] в определенном месте [точно] я думаю Я должен контролировать курсор .. как? любая идея? спасибо

+0

Я знаю: положение курсора: \ 033 [; H or \ 033 [; f помещает курсор в строку L и столбец C. /// как я могу его использовать? – MLSC

ответ

1

Если я правильно понял вашу проблему, ваш макет сломан, потому что у вас IP-адреса разной длины. В зависимости от того, насколько они различны, вы могли бы получить более подходящий макет с помощью табуляторов, а не только пробелы:

echo -e " $ip\t\t\t\tDOWN" 

... или по конвейеру свой выход через колонку:

output="$output `echo -e "\n$ip UP"`" 
... 
## Outputting your output: 
echo -e "$output" | column -t 

Результат:

172.16.2.4  UP 
172.16.2.5  UP 
192.168.178.200 UP 
192.168.178.254 UP 

для последнего, чтобы выглядеть идеально, вы, возможно, придется регулировать ширину приветственном-заголовка к полученной ширины у наш выпуск.

Можно также добавить еще пустые столбцы между вашими полями, добавив Seperator:

output="$output `echo -e "\n$ip - UP"`" 

Результат:

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 

Таким образом, после этих изменений вашего сценария должен выглядеть следующим образом:

#!/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 
+0

вы можете отредактировать мой скрипт? Я этого не понял. Спасибо. Я пробовал, но ничего не получилось. – MLSC

+0

Для этого мне придется предложить другой ответ - все это не вписывается в комментарий. В основном я имел в виду, что вы создаете переменную (называемую ее «output») в вашем while-loop, которая содержит все строки, которые вы выводите через echo в текущей версии. По завершении цикла вы эховыводите свою переменную output и форматируете ее с помощью столбца. – Marlon

+0

Хорошо, я не думал просто редактировать свой ответ - просто сделал. Теперь вы можете отредактировать версию своего скрипта. Не могу проверить его из-за отсутствия подходящих входных файлов, но я думаю, что он должен работать :-). – Marlon

0

Окончательный ответ:

#!/bin/bash 

if [ $# -ne 1 ]; then 
    echo "USAGE: ./server-status.sh <ip-list>" 
    exit 1 
fi 

rm -f /tmp/whole.txt  1>/dev/null 2>/dev/null 
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="" 
while read ip; do 
    ping $ip -s 1 -c 1 -W 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 
done < $1 

echo -e "$output" | column -t 

cat /tmp/res-ok.txt >> /tmp/whole.txt 
cat /tmp/res-failed.txt >> /tmp/whole.txt 

total=`wc -l /tmp/whole.txt | awk '{sum += $1} END {print sum}'` 
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 "UP: $ok" 
echo "DOWN: $failed" 
echo "TOTAL: $total" 
Смежные вопросы