我正在寻找计数标准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/

10-11 20:37