Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 8.53 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. PFO=$1
  4. PF=date1.txt #это временный файл
  5. #если при запуске не указан файл - просим указать его
  6. if [[ -z "$PFO" ]]; then
  7. echo "не введено имя файла, для обработки. запускайте скрипт, указав имя файла, как аргумент (на пример vib ping.txt)"
  8. echo "или введите название файла для обработки сюда:"
  9. read PFO
  10. fi
  11. DDEF1=$(awk NR\ ==\ 2\{print\ \$2\} $PFO 2>/dev/null|sed 's/\;/ /g') #берем значение даты в обрабатываемом файле
  12. DDEF=$(tail $PFO|awk NR\ ==\ 2\{print\ \$2\} 2>/dev/null|sed 's/\;/ /g') #берем значение даты в обрабатываемом файле
  13. #дата по умолчанию - берется из 2 строки файла
  14. DADD1=$(echo $DDEF|awk -F "." {print\ \$1})         #день
  15. DAMD1=$(echo $DDEF|awk -F "." {print\ \$2})         #месяц
  16. DAYD1=$(echo $DDEF|awk -F "." {print\ \$3})         #год
  17.  
  18. DATD=$(date -d "20$DAYD1-$DAMD1-$DADD1 1 day ago" +%F)  #дата "за день до"
  19. DATD=$(date -d "20$DAYD1-$DAMD1-$DADD1 1 day ago" +%F)  #дата "за день до"
  20. #делим дату
  21. DADD=$(echo $DATD|awk -F "-" {print\ \$3})      #день по умолчанию
  22. DAMD=$(echo $DATD|awk -F "-" {print\ \$2})      #месяц по умолчанию
  23. DAYD=$(echo $DATD|awk -F "-" {print\ \$1})      #год
  24. if [[ -z "$DDEF" ]]; then                   #проверяем файл
  25.  echo "что-то не так с этим файлом"
  26.  exit 0
  27. else
  28. echo  OK. начальная дата - $DDEF
  29. echo  дата по умолчанию - $DADD\.$DAMD\.$DAYD
  30. fi
  31. IP=$(awk NR\ ==\ 2\{print\ \$4\} $PFO|sed 's/\;/ /g')   #адрес хоста, который пингуем
  32. IPN=$(echo $IP |sed 's/\./-/g')             #ip для имени файла
  33. echo в логе пинги к узлу $IP
  34. #просим ввести дату, или назначаем ту, что по умолчанию
  35. echo "какое число разбираем? (по умолчанию - $DADD)"    
  36. read -n 2 DAD
  37. echo ''
  38. if [[ -z "$DAD" ]]; then
  39. DAD=$DADD
  40. fi
  41. echo "какой месяц? (по умолчанию - $DAMD)"
  42. read -n 2 DAM
  43. echo ''
  44. if [[ -z "$DAM" ]]; then
  45. DAM=$DAMD
  46. fi
  47.  
  48. OF=st\_$DAD\_$DAM\_$IPN.csv                       #обозначаем имя файла с результатами по дате
  49. echo 'считаем...'
  50. #делаем выборку строк с пингами с 8:00 заданной даты, до 8:00 следующего утра
  51. DADP=$(date -d "$DAYD-$DAMD-$DADD +1 day" +%F|awk -F "-" {print\ \$3})  #число следующего дня"
  52. DAMP=$(date -d "$DAYD-$DAMD-$DADD +1 day" +%F|awk -F "-" {print\ \$2})  #месяц следующего дня"
  53. cat $PFO |grep "$DAD\.$DAM\...\ 0[8-9]\:..:..\|$DAD\.$DAM\...\ 1[0-9]\:..:..\|$DAD\.$DAM\...\ 2[0-3]\:..:..">>$PF #собственно выборка
  54. cat $PFO |grep "$DADP\.$DAMP\...\ 0[0-7]\:..:..">>$PF
  55.  
  56. #считаем пинги по группам
  57. OBS=$(/bin/cat $PF| /bin/grep -c ";")               #строк всего
  58. NORM=$(/bin/cat $PF| /bin/grep -c " [1-7] msec")        #строк с пингами от 1 до 7
  59. MIN=$(/bin/cat $PF| /bin/grep -c " [8-9] msec\|1[0-4] msec")    #строк с пингами от 8 до 14
  60. MED=$(/bin/cat $PF| /bin/grep -c " 1[5-9] msec\|2[0-9] msec")   #строк с пингами от 16 до 29
  61. HIGHT=$(/bin/cat $PF| /bin/grep -c "[3-9][0-9] msec")       #строк с пингами  свыше 30
  62. ERROR=$(/bin/cat $PF| /bin/grep -c "error(Request timed out)")  #строк с потерями
  63.  
  64. #создаём временные файлы
  65. echo  "Обрабатывается статистика доступности хоста $IP с 7:00 $DAD.$DAM до 7:00 $DADP.$DAM"
  66. echo  " Статистика доступности хоста $IP с 7:00 $DAD.$DAM до 7:00 $DADP.$DAM" >$OF
  67. echo '' >e2\.txt
  68. echo '' >e1\.txt
  69. echo '' >e\.txt
  70.  
  71. #заполняем временные файлы
  72. /bin/cat $PF| /bin/grep  "error(Request timed out)">> ./e\.txt      #потери
  73. /bin/cat $PF| /bin/grep  " 1[5-9] msec\|2[0-9] msec">> ./e1\.txt    #пинги от 15 до 29
  74. /bin/cat $PF| /bin/grep  " [3-9][0-9] msec">> ./e2\.txt         #пинги выше 30
  75.  
  76. #считаем проценты
  77. PNORM=$(echo "scale=2;$NORM*100/$OBS" |bc -l)   # до 7
  78. PMIN=$(echo "scale=2;$MIN*100/$OBS" |bc -l) #8-14
  79. PMED=$(echo "scale=2;$MED*100/$OBS" |bc -l) #14-30
  80. PHIGHT=$(echo "scale=2;$HIGHT*100/$OBS" |bc -l) #больше 30
  81. PERROR=$(echo "scale=2;$ERROR*100/$OBS" |bc -l) #потери
  82. #причёсываем значения (если значение меньше единицы - дорисовываем в начале числа ноль)
  83. if [[ $PNORM == .* ]]; then PNORM=0$PNORM; fi
  84. if [[ $PNORM == .* ]]; then PNORM=0$PNORM; fi
  85. if [[ $PMIN == .* ]]; then PMIN=0$PMIN; fi
  86. if [[ $PMED == .* ]]; then PMED=0$PMED; fi
  87. if [[ $PHIGHT == .* ]]; then PHIGHT=0$PHIGHT; fi
  88. if [[ $PERROR == .* ]]; then PERROR=0$PERROR; fi
  89.  
  90. #заполняем значения для диаграммы с процентами
  91. P1=$(echo "от 1 до 7мс; от 8 до 15мс; от 15 до 30 мс; свыше 30 мс; потери")
  92. P2=$(echo $PNORM\; $PMIN\; $PMED\; $PHIGHT\; $PERROR)
  93.  
  94. echo "Статистика пингов до $IP" >> $OF
  95. echo $P1 >>$OF
  96. echo $P2|sed 's/\./,/g' >> $OF
  97.  
  98. #график завышенных пингов и потерь
  99. echo '' >> $OF
  100. echo '' >> $OF
  101. echo 'Завышенные пинги и потери' >>$OF
  102. echo -n ' ;масштаб;' >>$OF
  103.  
  104. #считаем количество пингов по категориям из временных файлов
  105. SS=$(echo -n " 0;")
  106. SS1=$(echo -n " 180;")    #столбик для масштаба
  107. SS2=$(echo -n " 0;")
  108. SRZD=$(cat date1.txt |grep -v error|awk '{sum+=$5} END { print sum/NR }') #среднесуточное значение пингов
  109. SRZD=$(printf '%.2f\n' $SRZD)   #округляем до .**
  110. #цикл обработки статистики с шагом в 30 мин
  111. echo "среднее суточное значение $SRZD"
  112. for HO in 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 00 01 02 03 04 05 06     #счетчик по часам
  113. do
  114. S=$(cat e.txt|grep \ $HO:[0-2][0-9] -c)     #количество потерь за полчаса
  115. D=$(cat e.txt|grep \ $HO:[3-5][0-9] -c)
  116.  
  117. S1=$(cat e1.txt|grep \ $HO:[0-2][0-9] -c)   #количество пингов от 15 до 27 за полчаса
  118. D1=$(cat e1.txt|grep \ $HO:[3-5][0-9] -c)
  119.  
  120. S2=$(cat e2.txt|grep \ $HO:[0-2][0-9] -c)   #количество пингов выше 30 мс за полчаса
  121. D2=$(cat e2.txt|grep \ $HO:[3-5][0-9] -c)
  122. #считаем средние значения за полчаса
  123. SRZ=$(cat date1.txt |grep \ $HO\:[0-3][0-9]|grep -v error|awk '{sum+=$5} END { print sum/NR }') #среднее значение пингов
  124. SRZ=$(printf '%.2f\n' $SRZ)                                 #округление до .**
  125. SRZ1=$(cat date1.txt |grep \ $HO\:[3-5][0-9]|grep -v error|awk '{sum+=$5} END { print sum/NR }')
  126. SRZ1=$(printf '%.2f\n' $SRZ1)
  127.  
  128. SS=$SS\ $S\ \;\ $D\ \;          #йа, сцуко, заборчег
  129. SS1=$SS1\ $S1\ \;\ $D1\ \;      #дописываю значения из цикла в длинную строку переменной
  130. SS2=$SS2\ $S2\ \;\ $D2\ \;
  131. SRZS=$SRZS\ $SRZ\ \;\ $SRZ1\ \;
  132. HOS=$HOS\ $HO\:00\ \;\ $HO\:30\ \;
  133. echo -n $HO\:00\ \; >>$OF           #строка со временем за сутки от 8 утра
  134. echo -n $HO\:30\ \; >>$OF           #с шагом в пол-часа
  135. done
  136.  
  137. #записываем в файл
  138. echo '' >>$OF
  139. echo Пинги от 15 до 30мс \;$SS1 >> $OF
  140. echo Пинги от 30мс и выше \;$SS2 >> $OF
  141. echo Потери \;$SS >>$OF
  142.  
  143. echo '' >>$OF
  144.  
  145. echo  \;масштаб\; $HOS >> $OF
  146. echo среднее значение пингов\;50.00 \;$SRZS|sed 's/\./,/g'  >> $OF
  147. echo "среднее суточное значение $SRZD">>$OF
  148.  
  149.  
  150. ##костыллинг!!!1 готовим к тому, чтоб лядский exel смог прочесть
  151. cat $OF > 1$OF          #тут был sed, меняющий разделитель, но я его убрал, а убирать временный файл мне лень
  152.  
  153. iconv -f  UTF-8 -t WINDOWS-1251 -o $OF 1$OF #меняем кодировку на cp1251
  154.  
  155. #сносим временные файлы и не позоримся
  156. rm e\.txt e1\.txt e2\.txt date1\.txt 1$OF
  157. echo "готово. результат в файле $OF"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement