Cron Apache 访问日志保留某些行删除重复项

Cron Apache 访问日志保留某些行删除重复项

我正在尝试创建一个夜间 cron,将 access_log 中的某些行保留到一个文件中,然后从该文件中删除(接近)重复的内容,然后清空访问日志并重新启动 Apache。

我不知道该怎么做,无论是 cron 还是运行脚本。访问日志可能很大,所以我在寻找在 cron 启动的脚本中运行的“最便宜”的命令。

该服务器是运行 Apache 的 CentOS。

因此使用如下的 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-w 选项将比较限制在前“N”个字符。

由于 IP 地址有 11 个字符,因此命令将是:

uniq -w 11 tmp  >> somefile.txt

相关内容