Построение распределения IP с количеством - PullRequest
5 голосов
/ 27 апреля 2011

Я пытаюсь получить более распространенный вывод в стиле dtrace при выполнении awks для больших лог-файлов после DDoS, чтобы было проще прочитать вывод:

# tail -1000 access_log | awk '{ print $1 }' | sort | uniq -c | sort -nr | awk '{printf("\n%s ",$0) ; for (i = 0; i<$1 ; i++) {printf("*")};}'

  43 192.168.0.1 *******************************************
  38 192.168.0.2 **************************************

Надеюсь, это может выглядеть примерно так:

       value  ------------- Distribution ------------- count    
 192.168.0.1  @@@@@@@@@                                43 
 192.168.0.2  @@@@@@@@                                 38 

Где @ - это краткая сводка по сравнению с числом * для числа.Включение автоматического масштабирования для каждого прогона было бы дополнительным бонусом против того, что мне приходилось выполнять математику, чтобы выяснить, как оценивать каждый счет.

1 Ответ

7 голосов
/ 29 апреля 2011

Ваш конвейер на самом деле довольно хорош.Вам действительно нужно масштабировать большие числа.Я заменил ваш tail -1000 access_log | awk '{ print $1 }' | несортированным файлом ip-номеров с одного из моих веб-серверов.Добавлено head -20, чтобы просто напечатать 20 самых активных ip-адресов.

$  sort ip.txt | uniq -c | sort -nr | \
>  awk 'NR==1{scale=$1/50} \
>       {printf("\n%-23s ",$0) ; \
>        for (i = 0; i<($1/scale) ; i++) {
>            printf("*")}; \
>        }' | head -20

Важными частями являются

  • NR==1{scale=$1/50} для расчета коэффициента масштабирования, чтобы соответствовать максимальному числу в50 символов, а
  • printf("\n%-23s ",$0) ; использует спецификатор ширины %-23s для выравнивания по левому краю счетчика и IP-адреса в пределах 23 символов.

Мой вывод выглядит следующим образом.Я замаскировал IP-адреса.

   824 xx.xxx.xx.39    **************************************************
   149 xx.xxx.xxx.176  **********
   138 xx.xxx.xxx.191  *********
   137 xx.xxx.xxx.41   *********
   105 xx.xxx.xxx.8    *******
    97 xx.xxx.xxx.21   ******
    96 xx.xxx.xx.220   ******
    91 xx.xx.xxx.198   ******
    87 xx.xxx.xxx.195  ******
    85 xx.xxx.xx.221   ******
    79 xxx.xxx.xxx.86  *****
    69 xx.xx.xx.12     *****
    68 xxx.xxx.xxx.159 *****
    65 xx.xxx.xxx.66   ****
    63 xx.xxx.xx.28    ****
    60 xx.xxx.xxx.104  ****
    59 xxx.xxx.xxx.242 ****
    59 xxx.xx.xxx.66   ****
    56 xx.xxx.xxx.202  ****

Этот вид вывода имеет проблему человеческого фактора.Люди судят такие графики по площади линий (звездочки).Так как этот дисплей масштабируется с величиной чисел, вы не можете визуально сравнить два из этих графиков с какой-либо достоверностью.

Ваши глаза и мозг хотят, чтобы вы судили о длине линий,(Я не уверен, где я это узнал. Может быть, из книг Туфте или из изучения статистики.) Но масштабирование может означать, что самая длинная линия на одном графике представляет 800, тогда как идентичная линия на другом графике может представлять только 100. Вашглаза и мозг хотят, чтобы верили, что эти два примерно равны, даже если один в восемь раз больше другого, и , даже если вы можете видеть необработанные числа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...