#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 с двумя параметрами в качестве даты / часа и ожидающий выходной файл, а затем анализирующий этот файл.
Я надеюсь, что кто-нибудь воспользуется этим.