Необходимо получить уникальные URL-адреса из журнала доступа apache — с их количеством

#apache #grep

#apache #grep

Вопрос:

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

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

журнал доступа находится в этом формате:

 11.111.11.111 - - [03/Apr/2019:11:43:11  0300] "GET /url.php?parameter=amp;2nd_parameter=15amp;mana=587amp;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=amp;2nd_parameter=15amp;mana=587amp;something_else=mana
15 /url.php?parameter=amp;2nd_parameter=15amp;mana=577amp;something_else=something_else
  

Комментарии:

1. Пожалуйста, опубликуйте несколько примеров ввода и ожидаемого результата в вашем сообщении и дайте нам знать затем.

2. обновлен вопрос

Ответ №1:

Если вас устраивает 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
  

Комментарии:

1. по какой-то причине это ничего не выдало

2. Для вашего показанного примера ввода это сработало для меня нормально, не могли бы вы, пожалуйста, проверить один раз, есть ли у вас контрольные M символов, выполнив cat -v Input_file и дайте мне знать?

3. использование cat -v input_files выдает результат, но ваш скрипт по какой-то причине этого не делает.

Ответ №2:

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

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

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

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