1 案例1:分析apache访问日志
1.1 问题
编写count_patt.py脚本,实现一个apche日志分析脚本:
统计每个客户端访问apache服务器的次数
将统计信息通过字典的方式显示出来
分别统计客户端是Firefox和MSIE的访问次数
分别使用函数式编程和面向对象编程的方式实现
1.2 方案
collections是python内建的一个集合模块,模块中提供了许多有用的集合类,其中counter类 是一个简单的计数器,以字典的键值对形式储存,其中搜索的元素作为键,出现的次数作为值
实现过程:
1.实例化一个计数器
2.实例化正则表达式
3.将文件以对象形式打开
4.通过正则表达式查找文件每一行
5.如果找到结果
6.将结果添加到计数器,通过update方法更新原有数据
7.返回计数器
8.将文件地址和正则表达式作为实参传递给函数
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
[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(object):
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 day08]# 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})