Python在Apache日志文件中搜索IP数量

时间:2015-04-28 16:04:41

标签: python regex string

我正在寻找计算IP地址在标准apache日志文件中弹出的次数,这是我到目前为止所得到的,但它总是给出零:

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"

2 个答案:

答案 0 :(得分: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) 

答案 1 :(得分:2)

正则表达式末尾的$仅匹配输入中的最后一个字符。所以你将从这个输入匹配0:

  

1.1.1.1等等2.2.2.2
  bleck 3.3.3.3 blee

如果您希望在输入中间计算IP地址,则需要更改正则表达式:

ipcount = len(re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', log))