2013-04-16 64 views
0

我是初學者在Python和一般編程,我想在Python中創建一個腳本,可以告訴消息是否被髮送。閱讀日誌文件後,我注意到每條消息都有一個中間所以我有一個想法,但我不知道...如果我保存在列表或字典中的所有中間我可以將它與具有中等+線\ S +「OK‘或’錯誤」這是我的日誌文件的一部分(該公司中期由一個每次遞增。) 有人可以幫助我開始?因爲我不知道如何啓動這個..在此先感謝閱讀文件和正則表達式與PYTHON

01:09:25.258 mta Messages  I Doc O:NVS:SMTP/[email protected] R:NVS:SMS.0/+01542xx **mid:6261** 
01:09:41.965 mta Messages  I Rep O:NVS:SMTP/[email protected] R:NVS:SMS.0/+01542xx **mid:6261** 
01:09:41.965 mta Messages  I Rep **6261** OK, Accepted (ID: 26) 
+0

請澄清你的問題,這是不容易明白你想要 – michaelmeyer

+0

我有什麼日誌文件,我的推杆它的一部分的問題,它的短信,語音,傳真服務器的日誌文件,我想創建一個腳本,看看郵件是否被髮送,如果它發送了一個「確定」,如果不是這樣的錯誤是這樣的錯誤: 14:12:43.068 mta消息我Rep O:NVS:SMTP/[email protected] R:NVS:FAXG3/+ 01510 mid:6418重複6 14:12:43.068 mta消息I Rep 6418錯誤網絡 –

+0

查找所有類似** ** 1234 **錯誤的行是不夠的'在他們裏面?或者,如果消息先發生錯誤,然後(重試後)變爲OK? –

回答

0

我建議如下:

假設日誌文件不是太大,不適合在內存中。

import re 
with open("myfile.log") as infile: 
    data = infile.read() 

首先,發現在你的文件中的所有消息ID:

messages = set(m.group(1) for m in re.finditer(r"\*\*mid:(\d+)\*\*", data)) 

現在,發現所有的消息ID對其存在的OK

successes = set(m.group(1) for m in re.finditer(r"\*\*(\d+)\*\*\s*OK", data)) 

之間的差異兩個是沒有OK消息的一組ID:

failures = messages - successes 
+0

謝謝你的回答Tim =) –

0

像這樣的東西?

import re 

pat = r'\*\*(\d+)\*\* (OK|Error)' 
text = open('emailex.txt').read() 
d = {} 
for res in re.finditer(pat, text): 
    d[res.group(1)] = res.group(2) 

errors = [mid for mid,status in d.items() if status == 'Error'] 
+0

謝謝你的回答,但你能告訴我最後兩行代表什麼嗎?我沒有得到它 –

+0

'd [res.group(1)] = res.group(2)'將一個字典鍵(mid,模式'pat'中的第一個匹配組賦值爲一個值(status,second在'pat'模式中匹配組,因此它會建立一個字典,其中的鍵是你的mids,值是狀態 – MichaelJCox

+0

'errors = [mid for mid,d.items中的狀態()if status =='Error' ]'是一個[列表理解](http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions),它構建了一個列表,其中包含狀態爲'Error'的字典中的所有mids。 – MichaelJCox