我正在寻找计数标准apache日志文件中IP地址弹出的次数,这是我到目前为止所拥有的,但始终给出零:
def ips_in_log(log_name):
with open(log_name, 'r') as f:
log = f.read()
ipcount = log.count(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
print(ipcount)
这是日志文件中的示例行:
137.43.92.119 - - [04/Feb/2013:00:00:00 +0000] "GET /node/feed
HTTP/1.0" 200 47208 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.7) Gecko/20040803 Firefox/0.9.3"
最佳答案
您不能将正则表达式传递给count
函数,因为count
函数接受字符串作为参数并在文本中查找它,当您传递r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
时它将假定它为行字符串。
相反,您可以使用re.findall
查找所有匹配项,然后使用len
函数获取ip的计数:
编辑:还删除正则表达式尾部的锚点$
。
def ips_in_log(log_name):
with open(log_name, 'r') as f:
log = f.read()
ipcount = len(re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',log))
print(ipcount)
而且,如果您只是希望将长度作为替代方法,则可以使用
finditer
,该返回返回产生MatchObject实例的迭代器。def ips_in_log(log_name):
with open(log_name, 'r') as f:
log = f.read()
ipcount = sum(1 for _ in re.finditer(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',log))
print(ipcount)
关于python - Python在Apache日志文件中搜索IP数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29924416/