Журнал доступа Cron Apache Сохраняет определенные строки, удаляет дубликаты
Я пытаюсь создать ночной cron, который сохраняет определенные строки из access_log (в файл), затем удаляет (почти) дубликаты из этого файла, затем очищает журнал доступа и перезапускает Apache.
Я понятия не имею, как это сделать, cron или скрипт для запуска. Журнал доступа, вероятно, будет большим, поэтому я ищу "наименее дорогие" команды для запуска в скрипте, запущенном cron.
Сервер CentOS работает под управлением Apache.
Так с access_log вроде:
11.11.11.11 [11/09/15 10:01:18] GET /file.txt
22.22.22.22 [11/09/15 10:11:18] GET /index.php
11.11.11.11 [11/09/15 10:21:18] GET /file.txt
33.33.33.33 [11/09/15 10:31:18] GET /file.txt
44.44.44.44 [11/09/15 10:41:18] GET /file.txt
Строки 1 и 3 - почти дубликаты, единственное различие во времени. Я хочу сохранить только один экземпляр этого, поэтому выходной файл будет:
11.11.11.11 [11/09/15 10:01:18]
33.33.33.33 [11/09/15 10:31:18]
44.44.44.44 [11/09/15 10:41:18]
Что-то вроде этого..?
#!/bin/bash
# Get matching lines from access_log into tmp file
cat /var/log/httpd/access_log | grep file.txt > tmp
# Remove near duplicates from tmp file
# This is where I'm having problems..
# I can't get sort, uniq or awk to work correctly
sort -buk1,1 tmp >> somefile.txt
# Remove tmp file and access_log
rm -f tmp /var/log/httpd/access_log
# Restart Apache to regenerate the access_log.
/etc/init.d/httpd restart
... Я думаю, что awk и sed могут быть слишком дорогими для большого файла (?). Я ищу наиболее эффективный способ получить результат в качестве примера. Я не хочу использовать Perl или Python.
Кажется, что IP должен быть полем или столбцом в массиве для сравнения, чтобы удалить близкие дубликаты, но может быть более простой способ?
Было бы sort
или же uniq
быть правильным? Если да, могу ли я привести пример, пожалуйста?
Я выясню часть cron (хотя, если вы захотите привести пример, это поможет)... Основная часть - удаление близких дубликатов.
Заранее спасибо, и извините за плохой заголовок и пример.
1 ответ
Вместо sort
, ты можешь использовать uniq
и ограничить сравнение первыми символами 'N', используя опцию -w.
Поскольку IP-адрес имеет 11 символов, команда будет:
uniq -w 11 tmp >> somefile.txt