源代码
#导入re正则模块
import re
#Counter对象是有序的,字典是无序的
from collectionsimport Counter
#创建类CountPatt
#定义类方法
class CountPatt:
def __init__(self,fname):
self.fname=fname
#定义构造方法,创建正则对象
#创建计数器对象
def count_patt(self,patt):
cpatt=re.compile(patt)
result=Counter()
#打开文本文件
with open(self.fname)as fobj:
for linein fobj:
#通过正则表达式查找文件每一行
m=cpatt.search(line)
#如果找到结果
if m:
#将结果添加到计数器,通过update方法更新原有数据
result.update([m.group()])
#返回计数器
return result
#将文件地址和正则表达式作为实参传递给函数
if __name__ =='__main__':
c=CountPatt('/etc/httpd/logs/access_log')
ip='^(\d+\.){3}\d+'
br='Firefox|MSIE|Chrome'
a=c.count_patt(ip)
print(a)
print(a.most_common(3))
print(c.count_patt(br))
print('*' * 99)
#只要更改fname地址和正则表达式即可实现读其他文件
cp2 = CountPatt('/etc/passwd')
result3 = cp2.count_patt('nologin$|bash$')
print(result3)
代码测试
[root@room9pc01 day04]# python3 apachelog2.py
Counter({'127.0.0.1': 6})
[('127.0.0.1', 6)]
Counter({'Firefox': 6})
***************************************************************************************************
Counter({'nologin': 39, 'bash': 9})