Назад | Перейти на главную страницу

Журнал доступа 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 (хотя, если вы хотите привести пример, это поможет) ... Основная часть - это удаление близких дубликатов.

Заранее спасибо и извините за плохое название и пример.

Вместо sort, ты можешь использовать uniq и ограничьте сравнение до первых символов «N» с помощью опции -w.

Поскольку IP-адрес состоит из 11 символов, команда будет выглядеть так:

uniq -w 11 tmp  >> somefile.txt