在bash的日志中计数ip重复



bash,我可以从通过特定搜索在日志中重复IP中看出吗?

举例:

#!/bin/bash
# Log line: [Sat Jul 04 21:55:35 2015] [error] [client 192.168.1.39] Access denied with status code 403.
grep "statusscodes403" /var/log/httpd/custom_error_log | while read line ; do
    pattern='^[.*?]s[error]s[clients(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)].*?403'
    [[ $line =~ $pattern ]]
    res_remote_addr="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}.${BASH_REMATCH[4]}"
    echo "Remote Addr: $res_remote_addr"
done

我需要知道每个消息403 ip获得几次的最终结果,如果可能的话,从最高到最低排序。

示例输出:

200.200.200.200 50 times.
200.200.200.201 40 times.
200.200.200.202 30 times.
... etc ...

我们需要在一系列事件(类似awstats(中从apache的每月日志中创建一个html报告。

有更好的方法。以下是我的建议,应该更易读,更容易维护:

grep -P -o 'd{1,3}.d{1,3}.d{1,3}.d{1,3}' log_file | sort | uniq -c | sort -k1,1 -r -n

输出的形式应该是:

count1 ip1
count2 ip2

更新:

仅过滤器403:

grep -P -o 'd{1,3}.d{1,3}.d{1,3}.d{1,3}(?=.*403)' log_file | sort | uniq -c | sort -k1,1 -r -n

请注意,向前看就足够了。

如果日志文件的格式如上所述,最好使用awk过滤掉所需的状态代码,然后只输出IP。然后使用uniq命令对每次出现的情况进行计数:

awk '/code 403/ {print $8}' error.log | sort | uniq -c |sort -n

awk中,我们使用正则表达式/code 403/进行筛选,然后对于匹配的行,我们打印第8个值(值用空格分隔(,即IP。

然后我们需要对输出进行排序,使相同的IP一个接一个——这是uniq程序的要求。

uniq -c只打印输入中的每一个唯一行一次,并在其前面显示出现次数。最后,我们对这个列表进行数字排序,以获得按计数排序的IP。

样本输出(第一个是发生次数,第二个是IP(:

1 1.1.1.1
10 2.2.2.2
12 3.3.3.3

相关内容

  • 没有找到相关文章

最新更新