Необходимо получить уникальные URL-адреса из журнала доступа Apache - с их количеством - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно напечатать уникальные URL-адреса из файла журнала доступа apache с уникальным счетчиком каждого URL-адреса, и мне нужно сделать это в определенные диапазоны дат.

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

журнал доступа имеет следующий формат:

11.111.11.111 - - [03/Apr/2019:11:43:11 +0300] "GET /url.php?parameter=&2nd_parameter=15&mana=587&something_else=mana HTTP/1.1" 200 5316 "something:something" "Mozilla/5.0 (Android; U; en-GB) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/29.0" 1152 [url.url.com]

Мне нужно делать это по временным интервалам, чтобы у меня было как минимум несколько временных рамок, а файлы довольно большие - дневной журнал доступа может быть> 10 ГБ. Результаты grep будут проанализированы с помощью PHP.

cat access_ssl.log | awk '{print $7}' | sort -n | uniq -c

приводит к уникальным URL и их количеству. Мне также нужно получать только результаты за определенные промежутки времени.

Я ожидаю ввода определенного временного диапазона, например: 11:00:00, 12:00:00 - например, час, и вывод для группировки, подсчитанные URL:

20 /url.php?parameter=&2nd_parameter=15&mana=587&something_else=mana
15 /url.php?parameter=&2nd_parameter=15&mana=577&something_else=something_else

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Если вы в порядке с awk, не могли бы вы попробовать следующее.

awk 'match($0,/\/url\.php.*_else=[^( HTTP)]*/){++a[substr($0,RSTART,RLENGTH)]} END{for(i in a){print a[i],i}}'  Input_file

Добавление не-однотипной формы решения.

awk '
match($0,/\/url\.php.*_else=[^( HTTP)]*/){
  ++a[substr($0,RSTART,RLENGTH)]
}
END{
  for(i in a){
    print a[i],i
  }
}'  Input_file
0 голосов
/ 03 апреля 2019

Мне удалось получить работающий bash-скрипт:

#!/bin/sh
DATE1=$1
DATE2=$2
cat /var/log/apache2/access_ssl.log | awk '$4 >= "['${DATE2}'" && $4 < "[i'${DATE2}'"' | awk '{print $7}' | sort -n | uniq -c > file.log

, где php-скрипт будет exec ();вызов сценария bash с двумя параметрами в качестве даты / часа и ожидание выходного файла, а затем синтаксический анализ этого файла.

Я надеюсь, что кто-то воспользуется этим.

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