0

次のようなログファイルにPythonでフィルターを作成します

    Sat Jun  2 03:32:13 2012 [pid 12461] CONNECT: Client "66.249.68.236"
    Sat Jun  2 03:32:13 2012 [pid 12460] [ftp] OK LOGIN: Client "66.249.68.236", anon     password "gxxglxxxxt@google.com"
    Sat Jun  2 03:32:14 2012 [pid 12462] [ftp] OK DOWNLOAD: Client "66.249.68.236",   "/pub/10.5524/100001_101000/100022/readme.txt", 451 bytes, 1.39Kbyte/sec

スクリプトは

import time
f= open("/opt/CLiMB/Storage1/log/vsftp.log")
def OnlyRecent(line):
    if  time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y") < time.time()-(60*60*24*2):
       return True
    return False

for line in f:
      if OnlyRecent(line):
         print line

f.close()

しかし、このスクリプトを実行しても何も表示されませんでした。2 日間で発生したレコードを表示できないのはなぜですか。また、ログ ファイルは非常に大きく、レコードは時間順に並べ替えられているため、レコードの検索を高速化する方法を説明します。

ありがとう

4

2 に答える 2

3

このスクリプトは、最終的な結合のため、メモリ内のファイル全体を完全に処理するまで何も出力しません。

そのまま印刷したい場合は、ループを使用して、フィルターによって返された行ごとに印刷します。

import time
f = open("/opt/CLiMB/Storage1/log/vsftp.log")
f.readline() # Not sure why you're doing this, but retained to replicate behaviour

def OnlyRecent(line):
    if time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y") < time.time()-(60*60*24*2):
       return True
    return False

for line in f:
    if OnlyRecent(line):
        print line

f.close()
于 2012-09-10T09:40:36.203 に答える
0

2 つの異なるデータ構造を比較しています。time.strptime()は構造体の時間を返します。一方、 time.time() は、エポックからの時間を秒単位で提供します。

time.gmtime関数を使用してエポック以降の時間を時間構造に変換してから比較するか、 calendar.gmtimeを使用して構造体の時間をエポック以降の時間に変換してから比較できます。

于 2012-09-11T03:22:50.440 に答える