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