Bash脚本Web日志文件中的顶级IP地址

时间:2014-08-08 13:36:37

标签: bash shell logging

您好我在编写脚本方面是一个新手,并且正在尝试弄清楚如何在Web日志文件中读取前10个I.P地址。我知道它需要循环每一行并计算,直到那里的数字为前10名。我只是不知道如何去做。

如果有人有一个值得赞赏的想法,那就去找我吧。

可能会有成千上万行,这里有几个样本。

121.45.49.36 - - [26/Feb/2013:09:07:21 +1100] "GET /jpg4/dsc1222s.jpg HTTP/1.1" 200 9335
121.45.49.36 - - [26/Feb/2013:09:07:21 +1100] "GET /jpg4/dsc1217s.jpg HTTP/1.1" 200 9540
121.45.49.36 - - [26/Feb/2013:09:07:22 +1100] "GET /jpg4/dsc3369s.jpg HTTP/1.1" 200 11938
121.45.49.36 - - [26/Feb/2013:09:07:22 +1100] "GET /jpg4/dsc1294s.jpg HTTP/1.1" 200 11184

4 个答案:

答案 0 :(得分:1)

这将打印IP地址及其出现次数。

awk 'END{for(i in a)print i,a[i]}{a[$1]++}' file

没有正确阅读问题,前十名使用

awk 'END{for(i in a)print a[i],i }{a[$1]++}' test | sort -rn | head -10

答案 1 :(得分:1)

假设您要选择出现在文件中任何位置的顶级IP地址,您可以使用这一个内容:

grep -oE '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b' file | sort | uniq -c | sort -nr | head -10'

答案 2 :(得分:0)

假设IP总是在最左侧:

cut -f1 -d ' ' | sed "/.*[a-zA-Z].*/d" | sort | uniq
  1. cut仅保留每行的左侧值。
  2. sed删除所有带字符的行(如果是域名)。
  3. sort | uniq删除重复的IP。

答案 3 :(得分:0)

以下是我在Awk中的表现:

awk '$1 ~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ {
    n++
    if(n<=10)
        print $1
    else
        exit
}' log

将打印第一列中找到的前10个IP地址。