3.1 問題
編寫count_patt.py腳本,實現一個apche日誌分析腳本:
統計每個客戶端訪問apache服務器的次數
將統計信息通過字典的方式顯示出來
分別統計客戶端是Firefox和MSIE的訪問次數
分別使用函數式編程和麪向對象編程的方式實現
3.2 方案
collections是python內建的一個集合模塊,模塊中提供了許多有用的集合類,其中counter類 是一個簡單的計數器,以字典的鍵值對形式儲存,其中搜索的元素作爲鍵,出現的次數作爲值
實現過程:
1.實例化一個計數器
2.實例化正則表達式
3.將文件以對象形式打開
4.通過正則表達式查找文件每一行
5.如果找到結果
6.將結果添加到計數器,通過update方法更新原有數據
7.返回計數器
8.將文件地址和正則表達式作爲實參傳遞給函數
3.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:
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})