2013-01-17 51 views
0

我有以下問題:排序的唯一身份

>>> lines = tuple(open('/var/log/fail2ban.log', 'r')) 
>>> for item in lines: 
...  item = item.strip('\n') 
...  if "fail2ban.actions:" in item and "[postfix]" in item and "Ban" in item: 
...    item = item.split(' ') 
...    print item 
... 
['2013-01-17', '11:03:51,752', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '87.111.253.157'] 
['2013-01-17', '11:10:42,612', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '37.206.77.26'] 
['2013-01-17', '11:23:08,674', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '37.2.185.188'] 
['2013-01-17', '12:40:44,997', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '37.2.185.188'] 
['2013-01-17', '13:28:38,006', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '194.106.26.177'] 
['2013-01-17', '13:43:56,959', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '70.27.53.95'] 
['2013-01-17', '14:42:36,601', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '95.120.42.12'] 
['2013-01-17', '14:45:35,147', 'fail2ban.actions:', 'WARNING', '[postfix]', 'Ban', '95.120.42.12'] 

我非常想知道我怎麼會去過濾重複(項目[6],在這種情況下,IP),這樣只有打印唯一值。

+0

假設您希望IP是一個唯一的密鑰,那麼您的列表中的哪一行是您想要保存的那一行? –

回答

0

您可以創建一個已經看到的IP列表或一組IP,然後在打印該行之前檢查該列表。

事情是這樣的:

lines = tuple(open('/var/log/fail2ban.log', 'r')) 
seen = set()  
for item in lines: 
    item = item.strip('\n') 
    if "fail2ban.actions:" in item and "[postfix]" in item and "Ban" in item: 
    item = item.split(' ') 
    if item[6] not in seen: 
     seen.add(item[6]) 
     print item 
+0

'if item [6] not in seen:'是多餘的,set.add()方法在內部執行它(即,集合中不能有重複的元素)。 –

+0

這是必要的,因爲如果IP地址已經存在於集合中,那麼'print item'行不應該發生。當然你對一個不包含重複的集合是正確的,所以你可以在if後面移動'seen.add(item [6])'行。 –

+0

有一些有用的評論,但這個答案已經解決了我的問題,現在它工作得很好,謝謝! –

0
>>> lines = tuple(open('/var/log/fail2ban.log', 'r')) 
>>> seen = set()  
>>> for item in lines: 
...  item = item.strip('\n') 
...  if "fail2ban.actions:" in item and "[postfix]" in item and "Ban" in item: 
...    item = item.split(' ') 
...    if item[6] not in seen: 
...     print item 
...    else: 
...     seen.add(item[6]) 
+0

實際上,您可能想要刪除「else:」行來使其工作。 – georg

+0

這是行不通的,沒有任何東西永遠不會添加在'seen'中,因爲你測試的是'seen'中的項目,這些項目中沒有任何項目,並且圍繞着你去的圓圈。 –

0

如果你只是想每個IP一個條目,這是沒有結果的,其條目是的,試試這個:

item_dict = dict() 
lines = tuple(open('/var/log/fail2ban.log', 'r')) 
for item in lines: 
    item = item.strip('\n') 
    if "fail2ban.actions:" in item and "[postfix]" in item and "Ban" in item: 
      item = item.split(' ') 
      item_dict[item[6]]=item[:-1] 

print(item_dict) 

[編輯] : 如果訂單很重要,可以使用OrderedDict。要做到這一點只需用

from collections import OrderedDict 
item_dict = OrderedDict() 

[編輯2]代替

item_dict = dict() 

: 如果你需要的是一套符合標準的IP地址,一套是你應該用什麼。

item_set = set() 
lines = tuple(open('/var/log/fail2ban.log', 'r')) 
for item in lines: 
    item = item.strip('\n') 
    if "fail2ban.actions:" in item and "[postfix]" in item and "Ban" in item: 
      item = item.split(' ') 
      item_set.add(item[6]) 

print('\n'.join(item_set)) 

根據定義,集合中的每個元素都是唯一的。