2017-11-27 22 views
0

私は、ログファイルから状態コード200のログの数を数える必要があるPythonログパーサスクリプトを作成しています。ここでApacheログファイルのPythonによる解析

ファイルからのログの一部です:

120.115.144.240 - - [29/Aug/2017:04:40:03 -0400] "GET /apng/assembler-2.0/assembler2.php HTTP/1.1" 404 231 "http://littlesvr.ca/apng/history.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36" 

202.167.250.99 - - [29/Aug/2017:04:41:10 -0400] "GET /apng/images/o_sample.png?1424751982?1424776117 HTTP/1.1" 200 115656 "http://bbs.mydigit.cn/read.php?tid=2186780&fpage=3" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" 

14.152.69.236 - - [29/Aug/2017:04:41:41 -0400] "GET /apng/images/o_sample.png?1424751982?1424776117 HTTP/1.1" 304 - "http://bbs.mydigit.cn/read.php?tid=2205351" "Mozilla/5.0 (Linux; U; Android 7.1.2; zh-CN; NX510J Build/NJH47D) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.6.951 Mobile Safari/537.36" 

60.4.236.27 - - [29/Aug/2017:04:42:46 -0400] "GET /apng/images/o_sample.png?1424751982?1424776117 HTTP/1.1" 200 115656 "http://bbs.mydigit.cn/read.php?tid=1952896" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" 

58.62.17.190 - - [29/Aug/2017:04:50:01 -0400] "GET /apng/gif_apng_webp1.html HTTP/1.1" 200 935 "http://dev.qq.com/topic/582939577ef9c5b708556b0d" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" 

は、私はこのコードを試してみましたが、私は取得しています唯一の出力は閉じ括弧[]の長いリストである:

#!/usr/bin/env python3 

import sys 
import re 

f = open('accesslogfile', 'r') 
print('Reading log files... done.') 
nooflines = f.readlines() 

for line in nooflines:  
    regex = re.match(r'\d{200}\s', line) 
    print(regex) 
f.close() 

この場合、出力は3であることがわかります(ステータスコード200のログが3つしかないため)が、私はそれを得ることができません。どんな助けもありがとう。

感謝:)

+0

'R '\ D {200} \ S'' 200桁の数字と一致します。私はそれがあなたが望むものだとは思わない。 ;) –

答えて

0

ちょうど(200)\sにあなたの正規表現を変更します。あなたがやっていることは、任意の数字の200とその後の空白の1文字(スペースやタブの改行など)をマッチングさせることです。あなたがしたいのは、トークン "200"と一致させることです。だから(200)\sをあなたの正規表現に入れてください。

0

あなたはここで間違ったことをしています。

  1. 検索の代わりにマッチを使用します。 {3}
  2. ではなく、正規表現で\ sの追加

は、だからあなたの正規表現が

re.search(r'\s\d{3}\s', line) 

だからあなたが持っているべきである代わりに違いhere

  • は、{200}を使用して参照してください。コード:

    import re 
    counter = 0 
    for line in log.split('\n'): 
        if line: 
         regex = re.search(r'\s\d{3}\s', line) 
         if regex.group().strip() == '200': 
          counter += 1 
    print('Found ', counter) 
    

    出力:

    ( 'が見つかり'、3)

  • 0
    import pandas 
    
    
    df = pandas.read_csv("log_path", sep='\s+', names=[i for i in range(10)]) 
    
    print(df.loc[df[6] == 200]) 
    print(len(df.loc[df[6] == 200])) 
    
    0

    それはとても簡単です:

    re.findall('(HTTP/1.1\" 200)',line) 
    
    関連する問題