python脚本分析apache访问日志

问题:

编写count_patt.py脚本,实现一个apche日志分析脚本:

  1. 统计每个客户端访问apache服务器的次数
  2. 将统计信息通过字典的方式显示出来
  3. 分别统计客户端是Firefox和MSIE的访问次数
  4. 分别使用函数式编程和面向对象编程的方式实现

方案

collections是python内建的一个集合模块,模块中提供了许多有用的集合类,其中counter类 是一个简单的计数器,以字典的键值对形式储存,其中搜索的元素作为键,出现的次数作为值

实现过程:

1.实例化一个计数器

2.实例化正则表达式

3.将文件以对象形式打开

4.通过正则表达式查找文件每一行

5.如果找到结果

6.将结果添加到计数器,通过update方法更新原有数据

7.返回计数器

8.将文件地址和正则表达式作为实参传递给函数

步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

  1. [root@localhost day08]# vim count_patt.py
  2. #!/usr/bin/env python3
  3.  
  4. import re
  5. import collections
  6.  
  7. #fname 文件地址 patt 正则表达式
  8. def count_patt(fname,patt):
  9.  
  10. counter = collections.Counter()
  11.  
  12. cpatt = re.compile(patt)
  13. with open(fname) as fobj:
  14. for line in fobj:
  15.  
  16. m = cpatt.search(line)
  17.  
  18. if m:
  19.  
  20. counter.update([m.group()])
  21.  
  22. return counter
  23.  
  24. if __name__ == "__main__":
  25. fname = "access_log.txt"
  26. ip_patt = "^(\d+\.){3}\d+"
  27. a = count_patt(fname,ip_patt)
  28. print(a)
  29. br_patt = "Firefox|MSIE|Chrome"
  30. b = count_patt(fname,br_patt)
  31. print(b)

实现此案例还可通过面向对象方式实现:

实现过程:

1.创建类CountPatt

2.定义构造方法 创建正则对象

3.定义类方法

4.创建计数器对象

5.打开文本文件

6.通过正则表达式查找文件每一行

7.如果找到结果

8.将结果添加到计数器,通过update方法更新原有数据

9.返回计数器

10.将文件地址和正则表达式作为实参传递给函数

  1. [root@localhost day08]# vim count_patt2.py
  2. #!/usr/bin/env python3
  3.  
  4. import re
  5. import collections
  6.  
  7.  
  8. import re
  9. import collections
  10.  
  11.  
  12. class CountPatt:
  13.  
  14. def __init__(self,patt):
  15. self.cpatt = re.compile(patt)
  16.  
  17.  
  18. def count_patt(self,fname):
  19.  
  20. counter = collections.Counter()
  21.  
  22. with open(fname) as fobj:
  23.  
  24. for line in fobj:
  25.  
  26. m = self.cpatt.search(line)
  27.  
  28. if m:
  29.  
  30. counter.update([m.group()])
  31.  
  32. return counter
  33.  
  34. if __name__ == "__main__":
  35. fname = "access_log.txt"
  36. ip_patt = "^(\d+\.){3}\d+"
  37. br_patt = "Firefox|MSIE|Chrome"
  38. ip = CountPatt(ip_patt)
  39. print(ip.count_patt(fname))
  40. br = CountPatt(br_patt)
  41. print(br.count_patt(fname))

步骤二:测试脚本执行

  1. [root@localhost  root]# python3 count_patt.py
  2. Counter({‘172.40.0.54’:391,‘172.40.50.116’:244,‘201.1.1.254’:173,‘127.0.0.1’:121,‘201.1.2.254’:119})
  3. Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})
  4. [root@localhost day08]# python3 count_patt2.py
  5. Counter({‘172.40.0.54’:391,‘172.40.50.116’:244,‘201.1.1.254’:173,‘127.0.0.1’:121,‘201.1.2.254’:119})
  6. Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})

你可能感兴趣的:(python)