Arrays 从bash计算日志中的ip重复次数

Arrays 从bash计算日志中的ip重复次数,arrays,regex,bash,multidimensional-array,Arrays,Regex,Bash,Multidimensional Array,从日志中通过特定搜索重复IP可以看出bash 举例来说: #!/bin/bash # Log line: [Sat Jul 04 21:55:35 2015] [error] [client 192.168.1.39] Access denied with status code 403. grep "status\scode\s403" /var/log/httpd/custom_error_log | while read line ; do pattern='^\[.*?\]

从日志中通过特定搜索重复IP可以看出bash

举例来说:

#!/bin/bash

# Log line: [Sat Jul 04 21:55:35 2015] [error] [client 192.168.1.39] Access denied with status code 403.

grep "status\scode\s403" /var/log/httpd/custom_error_log | while read line ; do

    pattern='^\[.*?\]\s\[error\]\s\[client\s(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 ...

我们需要从apache的每月日志中创建一个html报告,该报告包含一系列事件(如awstats)。

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

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
中,我们通过regexp
/code 403/
进行过滤,然后为匹配行打印第8个值(值用空格分隔),即IP

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

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

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

1.1.1.1
10.2.2.2.2
12.3.3.3.3


类似于
awk'/code 403/{print$8}error.log | sort | uniq-c | sort-n
?如果它适合你,我可以写它作为一个解释它到底做什么的答案…但日志有状态代码200和403,只需要403状态,如何匹配只…*(ip)。*?使用条件$1、$2?40秒处理1GB日志文件:D@WHK对不起,我打错了。关于状态代码,我不确定日志格式,所以我不能真正澄清这一点。但如果你愿意,你可以申请“向后看”或“向前看”。这不是确切的格式,我只需要解决这个例子,让其他人唯一地获得相同的日志数据,实际的格式要长得多,也要复杂得多:,像这样输出日志:,我想创建一个脚本,在html报告中反映数据,但上面的例子足以让我走自己的路。