Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Совет по написанию bash-скрипта  (Прочитано 1113 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Bombanoolo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Совет по написанию bash-скрипта
« : 14 Ноября 2013, 13:11:57 »
Доброго времени суток!

Предыстория
Имею очень мало опыта в написании скриптов(можно сказать не имею). Прочитал Advanced Bash-Scripting Guide на русском, но для своей задачи ничего не вывел =( Задача для меня сложная

Необходимо настроить слежение за увеличением процента ошибки, которая при превышении порога(>10) отдаёт единицу(для заббикса).

Есть скрипт, который дёргает базу и пишет результат во временной лог. Этот скрипт забит в crontab и обновляется каждые 5 минут.
Нужно написать скрипт который будет брать всё содержимое из лога. Затем сравнивать значение последней колонки(в которой указан процент) со значением колонки в которой указана ошибка, и если процент больше 5 , прописывает значение первой колонки(допустим имя) и колонки с номером ошибки. По идее всё это нужно занести в переменную и с помощью grep и awk на выходе при запросе к скрипту получать - имя,номер ошибки.

Временной лог имеет вид таблицы
имя | статус и ошибка | кол-во с ошибкой | общее кол-во | процент


Заранее спасибо!

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #1 : 14 Ноября 2013, 13:49:01 »
пример 10500 ощибки на процент.
тест
seq 1 10500 | while read a; do echo -en "\r%$[a * 100/10500] = $a";sleep .001;done;echo;echo ok
Wars ~.o

Оффлайн Bombanoolo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #2 : 14 Ноября 2013, 13:54:38 »
Спасибо, что обратили внимание на тему!

пример содержания лога -

Name          Error  &    Status                 С ошибкой Общее       Процент
orbes         0 - error,     5 - status                  1             220          0.45
rupor         2012 - error, null -status         45           220         20.45
kapos         123 - error, 5 - status                 1            220          0.45
в данном случае нужно на выходе - rupor  2012
при этом забикс дёргает этот скрипт, и пишет что процент ошибки 2012 по rupor > 10
Для заббикса нужно значение либо 1(ошибка имеет > 10%) либо 0 (ни одна ошибка не превышает 10%), он забирает значение колонки Name и Error & Status и на графике показывает 1


Пользователь решил продолжить мысль 15 Ноября 2013, 09:26:07:
пример 10500 ощибки на процент.
тест
seq 1 10500 | while read a; do echo -en "\r%$[a * 100/10500] = $a";sleep .001;done;echo;echo ok

спасибо за ответ.
Дело в том, что Вы взяли в пример определённую ошибку, они динамичные и всегда могут иметь другое значение. По этому в задаче необходимо сравнивать значение колонки с процентами с критическим значением и выдавать номер ошибки.
« Последнее редактирование: 15 Ноября 2013, 09:26:07 от Bombanoolo »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Совет по написанию bash-скрипта
« Ответ #3 : 15 Ноября 2013, 12:22:21 »
Bombanoolo, покажите разделитель между колонками:
cat -A file.log

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #4 : 16 Ноября 2013, 07:09:45 »
Такие вещи на баше не пишутся. Есть добрый десяток более прямых средств.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн eightchars

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #5 : 16 Ноября 2013, 07:25:54 »
Табличные выборки в одну процедуру на баше пишутся очень просто. Я бы сделал примерно так (тут со стандартного ввода читается файл, за пример входных данных взят маленький пример, приведённый ранее):
#!/usr/local/bin/bash

while read line; do
        printf "# %s\n" "$line"
        if [[ $line =~ ^([[:alnum:]_-]+)[[:space:]]+([0-9]+)[[:space:]]*-[[:space:]]*error[[:space:]]*,[[:space:]]*([0-9]+|null)[[:space:]]*-[[:space:]]*status[[:space:]]+([0-9]+)[[:space:]]+([0-9]+)[[:space:]]+([0-9]+(\.[0-9]+)?)$ ]]; then
                name=${BASH_REMATCH[1]}
                error=${BASH_REMATCH[2]}
                procent=${BASH_REMATCH[6]}
                printf "name: %s, error: %s, %%: %s\n" "$name" "$error" "$procent"
        fi
done

Тут нет условия выборки, только разбор входных данных.

Оффлайн as_lan

  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #6 : 16 Ноября 2013, 16:48:46 »
Есть массив
#!/bin/sh

array_test() {
    eval "result=\$$(($1+3))"
  }
test="11 22 33 44 55 66 77 88 99 111 "
var=8
array_test $var "foo" $test
var2=$result
echo $var2

Который в dash отрабатывает исправно, но в bash не хочет. Что надо подправить в строках чтоб заработал в bash ?

Пользователь решил продолжить мысль 16 Ноября 2013, 19:02:18:
Если точнее, то dash выдает именно 8 символ, а bash цифру 80, откуда берет - не понимаю.
« Последнее редактирование: 16 Ноября 2013, 19:02:36 от as_lan »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3265
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #7 : 16 Ноября 2013, 20:09:27 »
Я не знаю, что должен делать dash, а в bash массив и его элемент
можно задать так:
declare -a test=(11 22 33 44 55 66 77 88 99 00)
echo "test[2]="${test[2]}
Пётр.

Оффлайн as_lan

  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #8 : 16 Ноября 2013, 20:12:17 »
Еще кое что. Не работает если result равен $10 или выше.

Пользователь решил продолжить мысль 16 Ноября 2013, 20:13:41:
Peter_I,
Спасибо, но это крайний вариант, так как весь скрипт возможно придется переделывать.

Пользователь решил продолжить мысль 16 Ноября 2013, 20:17:14:
Нашел ошибку) маны великая сила))

#!/bin/sh

array_test() {
    eval result=\${$(($1+3))}
  }
test="11 22 33 44 55 66 77 88 99 111 "
var=8
array_test $var "foo" $test
var2=$result
echo $var2

Выделил красным, чего не хватало
« Последнее редактирование: 16 Ноября 2013, 20:17:41 от as_lan »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #9 : 16 Ноября 2013, 21:24:01 »
as_lan,
бэйсик версия, не даш.
Wars ~.o

Оффлайн Bombanoolo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #10 : 18 Ноября 2013, 09:47:14 »
Bombanoolo, покажите разделитель между колонками:
cat -A file.log
разделители -
ronda^IMT^I1099 - error, null - status^I13^I114^I11.40$
rumba^IMT^I72 - error, 5 - status^I1^I114^I0.88$

Пользователь решил продолжить мысль 18 Ноября 2013, 14:08:48:
Табличные выборки в одну процедуру на баше пишутся очень просто. Я бы сделал примерно так (тут со стандартного ввода читается файл, за пример входных данных взят маленький пример, приведённый ранее):
#!/usr/local/bin/bash

while read line; do
        printf "# %s\n" "$line"
        if [[ $line =~ ^([[:alnum:]_-]+)[[:space:]]+([0-9]+)[[:space:]]*-[[:space:]]*error[[:space:]]*,[[:space:]]*([0-9]+|null)[[:space:]]*-[[:space:]]*status[[:space:]]+([0-9]+)[[:space:]]+([0-9]+)[[:space:]]+([0-9]+(\.[0-9]+)?)$ ]]; then
                name=${BASH_REMATCH[1]}
                error=${BASH_REMATCH[2]}
                procent=${BASH_REMATCH[6]}
                printf "name: %s, error: %s, %%: %s\n" "$name" "$error" "$procent"
        fi
done

Тут нет условия выборки, только разбор входных данных.

Спасибо за ответ!
Разбор входных данных можно осуществить с помощью awk , просто отображая нужные колонки, но за Ваш пример спасибо! ушло в копилку знаний.
всё никак не могу одолеть эту задачу, я в тупике
« Последнее редактирование: 18 Ноября 2013, 14:08:48 от Bombanoolo »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Совет по написанию bash-скрипта
« Ответ #11 : 20 Ноября 2013, 09:47:36 »
пример содержания лога -
Name          Error  &    Status                 С ошибкой Общее       Процент
orbes         0 - error,     5 - status                  1             220          0.45
rupor         2012 - error, null -status         45           220         20.45
kapos         123 - error, 5 - status                 1            220          0.45
в данном случае нужно на выходе - rupor  2012
разделители -
ronda^IMT^I1099 - error, null - status^I13^I114^I11.40$
rumba^IMT^I72 - error, 5 - status^I1^I114^I0.88$
Код: (bash) [Выделить]
#!/bin/bash

awk '{if (NR!=1) {print}}' "file.log" | while read LINE
do
    ERR_PCT=$(echo "$LINE" | awk -F '\t' '{print $5}')
    if awk "BEGIN {exit !($ERR_PCT >= 10)}"
    then
        ERR_NAME=$(echo "$LINE" | awk -F '[\t ]' '{print $1" "$2}')
        echo "$ERR_NAME"
    fi
done
« Последнее редактирование: 20 Ноября 2013, 14:19:56 от ArcFi »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: Совет по написанию bash-скрипта
« Ответ #12 : 20 Ноября 2013, 12:36:25 »
Это уже AWK, а не баш.
На AWK это всё полностью пишется без малейших усилий.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.019 секунд. Запросов: 22.