1

私のプログラムは大きなログ ファイルを読み込みます。次に、ファイルで IP と TIME (括弧内にあるもの) を検索します。

5.63.145.71 - - [2013 年 6 月 30 日:08:04:46 -0500] "HEAD / HTTP/1.1" 200 - "-" "checks.panopta.com" 5.63.145.71 - - [2013 年 6 月 30 日:08:04:49 -0500] "HEAD / HTTP/1.1" 200 - "-" "checks.panopta.com" 5.63.145.71 - - [30/Jun/2013:08:04:51 -0500] "HEAD / HTTP/1.1" 200 - "-" "checks.panopta.com"

ファイル全体を読み取り、エントリを次のように要約します。

Num 3 IP 5.63.145.1 TIME [30/Jun/2013:08:04:46 -0500] エントリ数、IP、TIME、DATE

私がこれまでに持っているもの:

import re


x = open("logssss.txt")

dic={}


for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
    c = re.search(r"\[(.+)\]",line).group().split()
    for i in range(len(m)):
        try:
            dic[m[i]] += 1 
        except:
            dic[m[i]] = 1
        k = dic.keys()
for i in range(len(k)):
    print dic[k[i]], k[i]

上記のコードが正しく表示されるようになりました。ありがとう。

6 199.21.99.83

1 5.63.145.71

編集: c を出力に追加するのはどうですか?タイムスタンプは明らかに異なりますが、同じ行で値の1つを取得するだけで可能ですか?

4

2 に答える 2

3

print ステートメントをメイン ループの外に移動します。

import re
x = open("logssss.txt")

dic={}


for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
    c = re.search(r"\[(.+)\]",line).group().split()
    for i in range(len(m)):
        try:
            dic[m[i]] += 1 
        except:
            dic[m[i]] = 1

for k,v in dic.iteritems(): #or items if Python 3.X
    print k, v 

ヒントとして、pythonsCounterクラスを利用して、try except ブロックを置き換えることができます

from collections import Counter
dic = Counter()
for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
    c = re.search(r"\[(.+)\]",line).group().split()
    for i in range(len(m)):
        dic[m[i]] += 1

for k,v in dic.iteritems(): #or items if Python 3.X
    print k, v   

あなたのコメントから、リストの辞書を使用するだけです。各 IP アドレスの数は、リストの長さから抽出できます。

dic = {}
for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
    c = re.search(r"\[(.+)\]",line).group().split()
    for i in range(len(m)):
        dic.setdefault(m[i], []).append(c)

for k,v in dic.iteritems(): #or items if Python 3.X
    print k, len(v), v 
于 2013-07-17T17:44:16.123 に答える
2

Counterはるかに効率的なa を使用できます。

from collections import Counter
cnt = Counter()
for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
    cnt.update(m)

次に、メインループの外側で印刷が行われます:

for k,v in cnt.iteritems():
    print k, v

c を含めるには、a のdefaultdict方が適切です。

dict = defaultdict(list)
for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()[0]
    c = re.search(r"\[(.+)\]",line).group().split()[0]
    dict[m].append(c)

for k,v in dict.iteritems():
    print k, len(v), v

私の理解では、1 行に 1 つの IP と日付しかない[0]ため、最初で唯一の出現を取得します。

于 2013-07-17T17:49:10.667 に答える