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']

一意の値のみが出力されるように、重複 (item[6]、この場合は ip) をフィルタリングする方法を知りたいです。

4

3 に答える 3

0

すでに見た 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
于 2013-01-17T14:15:12.990 に答える
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])
于 2013-01-17T14:16:07.343 に答える
0

IP ごとに 1 つのエントリだけが必要で、それがどのエントリであるかがわからない場合は、次を試してください。

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 を使用できます。それを行うには、単に置き換えます

item_dict = dict()

from collections import OrderedDict
item_dict = OrderedDict()

[編集 2]: 条件に一致する 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))

セットのすべての要素は、定義上一意です。

于 2013-01-17T14:18:20.990 に答える