Я пытаюсь создать ночной 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 (хотя, если вы хотите привести пример, это поможет) ... Основная часть - это удаление близких дубликатов.
Заранее спасибо и извините за плохое название и пример.
Вместо sort
, ты можешь использовать uniq
и ограничьте сравнение до первых символов «N» с помощью опции -w.
Поскольку IP-адрес состоит из 11 символов, команда будет выглядеть так:
uniq -w 11 tmp >> somefile.txt