我正在尝试创建一个夜间 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