Вы можете попробовать что-то вроде этого:
cat /var/log/apache2/access_log | sed 's/\[.*\]//' | sort | uniq -c | awk '//{if($1>=5) print $0}' | sort -nr
Идея состоит в том, чтобы разделить вещи, которые меняются от строки к строке, такие как метки времени или IP-адреса, чтобы объединить ошибки.В этом случае я только вырезал временные метки, используя sed
, предполагая, что они заключены в квадратные скобки.Так что sed 's/\[.*\]//'
заменит это \[.*\]
ничем.
Так, например, эта строка:
127.0.0.1 - - [03/Oct/2016:23:45:27 +0300] "GET /favicon.ico HTTP/1.1" 200 1406
станет такой:
127.0.0.1 - - "GET /favicon.ico HTTP/1.1" 200 1406
Тогда sort
и uniq -c
агрегируют смежные идентичные строкии добавьте количество дубликатов.Таким образом, это будет выглядеть примерно так:
22 127.0.0.1 - - "GET /favicon.ico HTTP/1.1" 200 1406
Это означает, что следующая строка (без вычеркнутой метки времени) появилась в журнале 22 раза.
Тогда awk '//{if($1>=5) print $0}'
будет отображать только повторяющиеся строки, которые появлялись 5 или более раз, причем 5 было произвольным.И затем окончательная сортировка.
Это было проверено на OSX и Ubuntu.