我的服务器的CPU使用率异常高,我可以看到Apache占用了太多内存.

我用下面的一行找到了10个最"活跃"的IP:

cat access.log | awk '{print $1}' |sort  |uniq -c |sort -n |tail

排名前五位的IP对服务器的请求是"普通"用户的200倍.然而,我无法确定这5个人是否只是非常频繁的访客,或者他们正在攻击服务器.

是否有办法将上述搜索指定为一个时间间隔,例如最近两个小时或今天10-12之间?

干杯

UPDATED 23 OCT 2011 - The commands I needed:

在过go X小时内获取条目[此处为两小时]

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print Date FS $4}' access.log

在过go 的X小时内获得最活跃的IP[此处为两小时]

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $1}' access.log | sort  |uniq -c |sort -n | tail

在相对时间跨度内获取条目

awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print Date FS Date2 FS $4}' access.log

在绝对时间范围内获取条目

awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $0}' access.log 

在绝对时间范围内获得最活跃的IP

awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $1}' access.log | sort  |uniq -c |sort -n | tail

推荐答案

是的,有多种方法可以做到这一点.我会这样做.对于初学者来说,不需要通过管道传输cat的输出,只需用awk打开日志(log)文件即可.

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' access_log

假设你的日志(log)看起来像我的(它们是可配置的),那么日期存储在字段4中.并用括号括起来.我在上面所做的是在过go 两个小时内找到所有东西.Note the -d'now-2 hours'或按字面翻译,现在减go 2小时,对我来说是这样的:[10/Oct/2011:08:55:23

所以我要做的是存储两小时前的格式化值,并与字段4进行比较.条件表达式应该是直接的.然后我打印日期,然后是输出字段分隔符(OFS——在本例中是空格),最后是整行$0.您可以使用之前的表达式,只打印$1(ip地址)

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print $1}' | sort  |uniq -c |sort -n | tail

如果要使用范围,请指定两个日期变量,并适当构造表达式.

所以,如果你想在2-4小时前找到一些东西,你的表达式可能是这样的

awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date && $4 < Date2 {print Date, Date2, $4} access_log'

下面是我回答的一个关于bash中日期的问题,你可能会觉得有用.

Linux相关问答推荐

AWK打印到文件正在追加,而不是覆盖

未找到 SDL_Vertex 和 SDL_RenderGeometry

如何使用正则表达式在 LINux 中查找具有不同结尾的多个文件?

如何拆分多个分隔符但将它们保留在方括号之间?

Windows WSL 以上 Linux 中的 AF_UNIX 套接字无法绑定到 /mnt 文件:错误 95,不支持操作

如何/在哪里可以找到要修复的 Linux 内核错误?

anon 对 pmap 意味着什么?

从 .war 文件外部化 Tomcat webapp 配置

使用正则表达式时,Shell 'tar: not found in archive' 错误

exec 系统调用(如 exec 和 execve)系列的功能有什么区别?

如何从任意 pthread_t 获取线程 ID?

如何从 Linux 中的用户空间访问物理地址?

qstat 和长作业(job)名称

从命令行导入 PostgreSQL CSV

在 Linux 上忽略 glob() 中的大小写

Shell 脚本, echo 消息后在同一行读取

Bash:如何标记字符串变量?

什么是 linux 脚本中的 start-stop-daemon?

Linux:处理成服务

如何将初始输入通过管道传输到随后将是交互式的进程中?