要求:有一个access_log的日志文件(函数式编程实现)
- 统计出有那些ip地址访问本机web,且访问次数是多少?
- 统计出Chrome,MSIE,Firefox访问的次数
import re #导入正则模块
#定义一个函数,参数fname是文件名,patt是需要匹配的字段
def count_patt(fname, patt):
patt_dict = {} #定义一个空字典用于保存匹配的结果
#调用re.compile模块可以提前将需要匹配的字段编译
cpatt = re.compile(patt)
#使用with打开文件的好处是结束后自动关闭文件
with open(fname) as fobj: #打开文件为一个文件对象
for line in fobj: #遍历此文件对象
m = cpatt.search(line) #m保存匹配的结果
if m: #如果m有值,条件成立
#re.group可以获得使用search或match匹配的内容
key = m.group()
#如果匹配的内容在字典中有就加1,否则patt_dict[key]=1
patt_dict[key] = patt_dict.get(key, 0) + 1
return patt_dict #遍历完之后返回字典
if __name__ == '__main__':
fname = '/tmp/access_log' #要统计的文件
ip = '(\d+\.){3}\d|^... ' #匹配ipv4和ipv6的地址
br = 'Firefox|Chrome|MSIE' #匹配浏览器
ip_count = count_patt(fname, ip) #调用此函数
br_count = count_patt(fname, br)
print(ip_count)
print(br_count)
access_log为httpd的访问日志,内容格式为:
172.40.50.116 - - [03/Dec/2017:15:29:37 +0800] "GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1" 404 238 "http://172.40.50.116/noindex/css/open-sans.css" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"
匹配之后得到的结果为:
{'172.40.58.1': 26, '127.0.0.1': 121, '192.168.4.2': 103......}
{'Chrome': 24, 'Firefox': 870, 'MSIE': 391}
此函数可以实现多个字段的匹配,但是需要写相应的正则来匹配












网友评论