统计日志文件中某些字段出现的次数(例如ip访问次数, 和浏览器的数量)

方法一:

#'用于统计一个文件中某些字段出现的次数'
import re
def count_patt(fname, patt):
    patt_dict = {}
    cpatt = re.compile(patt)

    with open(fname) as fobj:
        for line in fobj:
            m = cpatt.search(line)
            if m:  # 如果匹配不到返回None,表示False,匹配到了,是True
                key = m.group()   # 取出模式
                # 模式不在字典中,计数1,在字典中,加1
                patt_dict[key] = patt_dict.get(key, 0) + 1
                # if key not in patt_dict:
                #     patt_dict[key] = 1
                # else:
                #     patt_dict[key] += 1

    #items可以获取字典的下标和元素
    patt_list = list(patt_dict.items())
    #sort的key也可以是一个函数
    patt_list.sort(key=func1, reverse=True)
    return patt_dict

def func1(seq):
    return seq[-1]

if __name__ == '__main__':
    fname = 'access_log'
    ip = '^(\d+\.){3}\d+'  # 192.168.1.10   1234.56789.10.123456
    br = 'Firefox|MSIE|Chrome'
    ip_count = count_patt(fname, ip)
    br_count = count_patt(fname, br)
    print(ip_count)
    print(br_count)
方法二: 通过定义类来实现
import re
class patt:
    def __init__(self, fname):
        self.fname = fname

    def count_patt(self, patt):
        cpatt = re.compile(patt)  #对正则进行编译
        patt_dict = {}
        with open(self.fname) as f1:
            for line in f1:
                m = cpatt.search(line)   #只会查找一行的第一个符合数据
                if m:    #m值存在为True, 才会执行
                    key = m.group()   #正则找到的数据都是对象格式,需要group()取出使用
                    patt_dict[key] = patt_dict.get(key, 0) + 1   #patt_dict.get(key, 0)中key存在则返回相应的value, 否则返回'0'(返回值可以自定义)

        patt_list = list(patt_dict.items())
        patt_list.sort(key=self.seq, reverse=True)

        return patt_list

    def seq(self, seq):
        return seq[-1]



if __name__ == '__main__':
    logfile = '/opt/access_log'
    ip = '^(\d+\.){3}\d+'   #匹配ip地址正则表达式,只针对ip地址开头的行,不具有通用性
    scan = 'Firefox|Chrome|MSIE'  #匹配浏览器

    ipcount = patt(logfile)  #抽象出一个实例
    rc = ipcount.count_patt(ip)
    st = ipcount.count_patt(scan)
    print(rc)
    print(st)

 

你可能感兴趣的:(统计日志文件中某些字段出现的次数(例如ip访问次数, 和浏览器的数量))