用python统计日志中IP的数量

引 入



日志文件,是我们记录用户行为的重要手段。而对于不同的用户,我们往往又会根据IP来区分,所以统计日志文件中的IP访问,对于数据分析人员和相关运营专员来说,是一件重要的事情,这里,采用python这门语言来完成这个小功能。


一、分析IP格式



这里只讨论ipv4。

分析IP格式思路有许多,这里我只分析其中一种比较容易理解的。

1) 从分析一个从1~255的数字开始


一个1~255的数细分成以下5个分组。


数字分组

正则表达式表示
1~9 [1-9]
10~99 [1-9][0-9]
100~199 1[0-9]{2}
200~249 2[0-4][0-9]
250~255 25[0-5]

所以一个1~255的数字可以用正则表达式“[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]”来表示


2) 分析IP


IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用英文句点“.”隔开。例如:某台计算机IP地址为192.168.1.1。所以IP地址可以用简单表示为:

IP = (1~255.) *3 + (1~255)

相关正则表达式为:

设num(1~255) = [1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]

得:IP=(num\.){3}num

二、具体代码实现 CountIP.py


#!/usr/bin/env python
#-*- coding: utf-8 -*-
import re      #导入正则表达式模块
import sys     

#以只读方式打开文件,sys.argv[1]表示的是运行时传入的第二个参数
f = open(sys.argv[1], "r") 
arr = {}      #用字典来存储IP跟访问次数
#num表示1-255之间的字串,\b为单词的词首或词尾锚定
num=‘\\b([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\b‘
lines = f.readlines()
#遍历文件的每一行   
for line in lines:
        pattern = re.compile(r‘(‘+num+‘\.){3}‘+num)  #python中用“+”来连接字符串
        match = pattern.match(line)
        if match: 
                ip = match.group()
        if(arr.has_key(ip)):
                arr[ip] += 1 
        else:  
                arr[ip]=1  
f.close()  
for key in arr: 
        print key + "--->" + str(arr[key])

三、测试



某天日志文件

[[email protected] ~]# cat 20160215.log 
192.168.1.102 - - [15/Feb/2016:07:18:12 -0800] "GET /index.php HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.101 - - [15/Feb/2016:07:18:12 -0800] "GET /index.php HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.101 - - [15/Feb/2016:07:18:12 -0800] "GET /index.php HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.101 - - [15/Feb/2016:07:18:12 -0800] "GET /index.php HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.101 - - [15/Feb/2016:07:18:12 -0800] "GET /index.php HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.102 - - [15/Feb/2016:07:18:12 -0800] "GET /index.php HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.101 - - [15/Feb/2016:07:18:57 -0800] "GET /index.php HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.103 - - [15/Feb/2016:07:34:08 -0800] "GET /index.php HTTP/1.1" 200 7237 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.101 - - [15/Feb/2016:07:34:08 -0800] "GET /index.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2547 "http://192.168.1.106/index.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.101 - - [15/Feb/2016:07:34:08 -0800] "GET /index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2169 "http://192.168.1.106/index.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.1.1015 - - [15/Feb/2016:07:34:08 -0800] "GET /index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2169 "http://192.168.1.106/index.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
192.168.262.101 - - [15/Feb/2016:07:34:08 -0800] "GET /index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2169 "http://192.168.1.106/index.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
111.168.1.101 - - [15/Feb/2016:07:34:08 -0800] "GET /index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2169 "http://192.168.1.106/index.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"


运行结果如下

[[email protected] ~]# python CountIP.py 20160215.log  
192.168.1.101--->9
192.168.1.102--->2
192.168.1.103--->1
111.168.1.101--->1


结 语



对于写多了shell跟java的我来说,python还是一门很能吸引我眼球的语言,语法比shell丰富,跟linux系统的交互比java方便,让我爱不释手啊。后面,我会用python写越来越多的小功能,小有趣,敬请期待。

附:如对上面描述有疑问,期待与朋友您共同探讨。本人QQ:1084569767

时间: 2024-10-09 06:16:46

用python统计日志中IP的数量的相关文章

Spark 加强版WordCount ,统计日志中文件访问数量

原文地址:http://blog.csdn.net/whzhaochao/article/details/72416956 写在前面 学习Scala和Spark基本语法比较枯燥无味,搞搞简单的实际运用可以有效的加深你对基本知识点的记忆,前面我们完成了最基本的WordCount功能的http://blog.csdn.net/whzhaochao/article/details/72358215,这篇主要是结合实际生产情况编写一个简单的功能,功能就是通过分析CDN或者Nginx的日志文件,统计出访问

统计日志中ip出现的次数

grep -r 'GET /weixin/weixin_izp/index.html' ./chunyun.access.log > ~/access.log cat access.log |awk '{print $1}'|cut -d, -f3|sort|uniq -c > mycount.log 1.要提取访问量最大的IP,需要先从日志中把IP段提取出来. $ cat aa.txt |awk -F " " '{print $1}' 127.0.0.1 192.168.

Python统计列表中的重复项出现的次数的方法

前言 在实际工作和学习中,经常会遇到很多重复的数据,但是我们又必须进行统计,所及这里简单介绍一下统计列表中重复项的出现次数的简单方法. 实例 本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴.具体方法如下: #方法1: mylist = [1,2,2,2,2,3,3,3,4,4,4,4] myset = set(mylist)  #myset是另外一个列表,里面的内容是mylist里面的无重复 项 for item in myset

javascript如何统计页面中标签的数量

javascript如何统计页面中标签的数量:本章节介绍一下如何统计页面中标签的数量,当然标签是可以重复的,虽然不常用,不过寄希望能够给大家带来或多或少的帮助.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" />

python 统计list中各个元素出现的次数

python 统计list中各个元素出现的次数利用Python字典统计利用Python的collection包下Counter的类统计利用Python的pandas包下的value_counts的类统计利用字典dict来完成统计举例: a = [1, 2, 3, 1, 1, 2]dict = {}for key in a: dict[key] = dict.get(key, 0) + 1print dict12345输出结果: >>>{1: 3, 2: 2, 3: 1}1利用Python

用python统计list中各元素出现的次数(同理统计字符串中各字符出现的次数)

统计list中各元素出现的次数,下面的方法也适用于统计字符串中各字符出现的次数 1.用字典的形式来处理 a = "abhcjdjje" a_dict = {}for i in a: a_dict[i] = a.count(i)print(a_dict) 2.用count函数直接打印出来 L = [2,4,5,6,2,6,0,4] for i in L: print("%d的次数:%d"%(i,L.count(i))) 3.用collections的Counter函数

python脚本统计日志独立ip

题目: 有如下log文件,请打印出独立IP,并统计独立IP数,打印出访问最多的前5个ip及访问次数: log文件www.log内容类似如下格式: 125.78.48.67 - - [25/Dec/2014:15:31:20 +0800] "GET /logo.jpg HTTP/1.1" 200 5183 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" 10

python 统计日志IP出现次数

cat test 218.79.251.215 - - [23/May/2006:08:57:44 +0800] "GET /fg172.exe HTTP/1.1" 206 2350253 220.178.150.3 - - [23/May/2006:08:57:40 +0800] "GET /fg172.exe HTTP/1.1" 200 2350253 59.42.2.185 - - [23/May/2006:08:57:52 +0800] "GET

你用pig分析access_log日志中ip访问次数

环境说明: os版本:rhel5.7 64位 hadoop版本:hadoop-0.20.2 hbase版本:hbase-0.90.5 pig版本:pig-0.9.2 访问日志文件,下载文章中的附件! 日志放在本地目录路径为:/home/hadoop/access_log.txt 日志格式为: 220.181.108.151 - - [31/Jan/2012:00:02:32 +0800] "GET /home.php?mod=space&uid=158&do=album&