Журнал доступа 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
Другие вопросы по тегам