Ping Bash для возврата 'живых' IP-адресов

Для того, чтобы меньше выполнялось в кодировке, отличной от кодировки терминала, используйте luit (который поставляется с набором утилит X11).

LANG=ru_RU.CP1251 luit less subs.srt

Если вы хотите обнаружить кодировку автоматически, то это более хитро, так как текстовый файл не несет никакой информации о своей кодировке. Программа Enca пытается распознать кодировку файла по его языку:

$ enca -L russian subs.srt
MS-Windows code page 1251
$ iconv -f "$(enca -iL russian subs.srt)" | less

Вы можете сделать эту комбинацию фильтром LESSOPEN (см. Как я могу просматривать gzipped-файлы в меньшем количестве, не набирая zless? для примера). Это может не дать хороших результатов для текста, который на самом деле не на русском языке.

Если вы используете только UTF-8 и CP1251, вы можете вернуться к CP1251, когда файл недействителен в UTF-8 - в UTF-8 есть "дыры", из-за которых большинство файлов в 8-битной кодировке недействительны в UTF-8. Скрипт фильтрации доказательств концепции для LESSOPEN (может не работать на системах, отличных от Linux, так как полагается на чтение head -c N ровно N байт):

#!/bin/sh
head=$(head -c 1000)
if printf '%s\n' "$head" | grep -qav '^.*$'; then
  { printf '%s\n' "$head"; cat; } | iconv -f CP1251
else
  { printf '%s\n' "$head"; cat; }
fi

0
21.04.2014, 10:12
1 ответ

Краткий ответ на ваш первый вопрос: LIVECOUNT = $ ((LIVECOUNT + 1)) . Это арифметическое расширение, показанное двойными скобками: $ (()), увеличивает переменную LIVECOUNT на единицу каждый раз, когда команда ping возвращает 0 в случае успеха.

Краткий ответ на определение общего количества хостов - вычесть нижний адрес ($ {2}) из верхнего адреса ($ {3}), а затем прибавить единицу, чтобы получить общее количество хостов.

Итак:

#!/bin/bash
CHECKING=${1}.
LIVEHOSTS=""
LIVECOUNT=0
TOTALHOSTS=$(($3 - $2 + 1))
for i in `seq ${2} ${3}`
do
    CHECKING="$CHECKING${i} "
    ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
    if [ $? -eq 0 ]; then
        LIVEHOSTS="$LIVEHOSTS \n ${1}.${i}"
        LIVECOUNT=$((LIVECOUNT+1))
    fi
done
echo ""
echo "Checking: $CHECKING"
echo ""
echo "Live hosts:"
echo -e "$LIVEHOSTS"
echo ""
echo "There were:"
echo "$LIVECOUNT alive hosts"
echo "$((TOTALHOSTS - $LIVECOUNT)) not alive hosts"
echo "found through the use of ping"

Обратите внимание на следующее: $ CHECKING - это строка, которая начинается с подсети, заданной как параметр 1 $ {1}, а затем добавляет текущий номер хоста $ {i} для каждой итерации цикл do.

Из-за того, как вы это отформатировали (со строкой «Проверка:» перед строкой «Активные хосты:»), казалось, что проще сохранить активные хосты в строке (аналогично $ CHECKING), так что $ LIVEHOSTS есть.

$ LIVEHOSTS и $ LIVECOUNT инициализируются пустыми и нулевыми значениями, чтобы было понятно, что происходит; это, строго говоря, не обязательно.

Обратите внимание на использование echo -e при выводе $ LIVEHOSTS. Это сделано для того, чтобы \ n работал как перевод строки.

РЕДАКТИРОВАТЬ: Чтобы показать, какой IP-адрес в настоящее время проверяется, а не список в конце, замените CHECKING = "$ CHECKING $ {i}" на echo "Проверка $ CHECKING $ {i } " и удалите или закомментируйте строку echo" Проверка: $ CHECKING ". Поскольку echo равно внутри цикла do , он будет печататься на каждом проходе с использованием текущего значения $ i. (Это то же самое, что @slm указал на использование вами echo "Live hosts" в исходном скрипте.)

1
28.01.2020, 02:52

Теги

Похожие вопросы