问题:
编写count_patt.py脚本,实现一个apche日志分析脚本:
- 统计每个客户端访问apache服务器的次数
- 将统计信息通过字典的方式显示出来
- 分别统计客户端是Firefox和MSIE的访问次数
- 分别使用函数式编程和面向对象编程的方式实现
方案
collections是python内建的一个集合模块,模块中提供了许多有用的集合类,其中counter类 是一个简单的计数器,以字典的键值对形式储存,其中搜索的元素作为键,出现的次数作为值
实现过程:
1.实例化一个计数器
2.实例化正则表达式
3.将文件以对象形式打开
4.通过正则表达式查找文件每一行
5.如果找到结果
6.将结果添加到计数器,通过update方法更新原有数据
7.返回计数器
8.将文件地址和正则表达式作为实参传递给函数
步骤
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@localhost day08]# vim count_patt.py
- #!/usr/bin/env python3
-
- import re
- import collections
-
- #fname 文件地址 patt 正则表达式
- def count_patt(fname,patt):
-
- counter = collections.Counter()
-
- cpatt = re.compile(patt)
- with open(fname) as fobj:
- for line in fobj:
-
- m = cpatt.search(line)
-
- if m:
-
- counter.update([m.group()])
-
- return counter
-
- if __name__ == "__main__":
- fname = "access_log.txt"
- ip_patt = "^(\d+\.){3}\d+"
- a = count_patt(fname,ip_patt)
- print(a)
- br_patt = "Firefox|MSIE|Chrome"
- b = count_patt(fname,br_patt)
- print(b)
实现此案例还可通过面向对象方式实现:
实现过程:
1.创建类CountPatt
2.定义构造方法 创建正则对象
3.定义类方法
4.创建计数器对象
5.打开文本文件
6.通过正则表达式查找文件每一行
7.如果找到结果
8.将结果添加到计数器,通过update方法更新原有数据
9.返回计数器
10.将文件地址和正则表达式作为实参传递给函数
- [root@localhost day08]# vim count_patt2.py
- #!/usr/bin/env python3
-
- import re
- import collections
-
-
- import re
- import collections
-
-
- class CountPatt:
-
- def __init__(self,patt):
- self.cpatt = re.compile(patt)
-
-
- def count_patt(self,fname):
-
- counter = collections.Counter()
-
- with open(fname) as fobj:
-
- for line in fobj:
-
- m = self.cpatt.search(line)
-
- if m:
-
- counter.update([m.group()])
-
- return counter
-
- if __name__ == "__main__":
- fname = "access_log.txt"
- ip_patt = "^(\d+\.){3}\d+"
- br_patt = "Firefox|MSIE|Chrome"
- ip = CountPatt(ip_patt)
- print(ip.count_patt(fname))
- br = CountPatt(br_patt)
- print(br.count_patt(fname))
步骤二:测试脚本执行
- [root@localhost root]# python3 count_patt.py
- 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})
- Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})
- [root@localhost day08]# python3 count_patt2.py
- 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})
- Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})