2017-11-28 8 views
2

Linuxのログファイル/var/log/messagesを読んでみましょう。この線のパターンから、[email protected]のようなユーザーの電子メールアドレスを見て、str.partition()メソッドを使用して、リストインデックスとして2つの部分に分けて、最初のものをさらにリストに分けます最後のインデックス値を取ることの容易さのために、これはユーザIDであり、それは正常に動作しています。ファイルからuniqの名前をソートしてカウントするPython

私はユーザのリストと総数を得ることができると言っていますが、私は各ユーザの出現を数えて、user_name: Countのキーと値を印刷する必要があります。

11月28日午前9時00分08秒foxopt210 RSHD [6157]:たpam_rhosts(RSH:AUTH):rajeshm

#!/usr/bin/python3 
f= open("/var/log/messages") 
count = 0 
for line in f: 
    if "allowed access" in line: 
    count+=1 
    user_id = line.partition('@')[0] 
    user_id = user_id.split()[-1] 
    print(user_id) 
f.close() 
print("--------------------") 
print("Total Count :" ,count) 

として[email protected]へ アクセスを許可現在のコードは以下のように働いている:

bash-4.1$ ./log.py | tail 
navit 
akaul 
akaul 
pankaja 
vishalm 
vishalm 
rajeshm 
rajeshm 
-------------------- 
Total Count : 790 

を周りグーグルでいる間、私はこの 目的のために辞書を使用してのアイデアを取得し、期待どおりに働いている:

#!/usr/bin/python3 
from collections import Counter 
f= open("/var/log/messages") 
count = 0 
dictionary = {} 
for line in f: 
    if "allowed access" in line: 
    user_id = line.partition('@')[0] 
    user_count = user_id.split()[-1] 
    if user_count in dictionary: 
     dictionary[user_count] += 1 
    else: 
     dictionary[user_count] = 1 
for user_count, occurences in dictionary.items(): 
    print(user_count, ':', occurences) 
そして、私の出力は、必要に応じて次のとおりです。この練習のために周りのより良い方法があれば、私は見ているだけだ

bash-4.1$ ./log2.py 
rajeshm : 5 
navit : 780 
akaul : 2 
pankaja : 1 
vishalm : 2 

+1

'辞書= collections.Counter(line.partition ( '@ ')[0] .rsplit(なし、1)'行内の ''アクセス許可 ''の場合の ''行内 ''の場合 '' user_countの場合、dictionary.most_common()内のcount:print(user_count、 count、sep = ':') 'となります。 –

+0

@MartijnPieters、あなたの入力のthnx ..私はこれを試してみます。 – krock1516

答えて

4

物を数えるときは、collections.Counter() classを使用する方が簡単です。私はここで発電機にラインを解析カプセル化したい:

def users_accessed(fileobj): 
    for line in fileobj: 
     if 'allowed access' in line: 
      yield line.partition('@')[0].rsplit(None, 1)[-1] 

Counter()オブジェクトにこれを渡します。これは(少なくとも最も一般的な)ソートされた出力を提供するために、Counter.most_common() methodを使用しています

from collections import Counter 

with open("/var/log/messages") as f: 
    access_counts = Counter(users_accessed(f)) 

for userid, count in access_counts.most_common(): 
    print(userid, count, sep=':') 

+0

thnx aagain ..これはいいです、結果にあなたを元に戻そうとします。 – krock1516

+0

@Martin ..これはうまくいきます、thnx .. '(None、1)'とyeildキーワードについて説明してください。 – krock1516

+0

@Karn: 'str.rsplit(None)'は 'str.rsplit()'と同じです。空白の空白で分割する。 'str.rsplit()'は分割の数を制限する2番目の引数をとります。したがって、 'str.rsplit(None、1)'は、空白でただ*を1回だけ右から数えて分割します。一度だけ分割すると効率が向上しますが、残りの結果を無視すると、さらに分割する必要はありません。 –

1

あなたは正規表現を試すことができますし、これを行うことができます:ちょうど楽しみの1行ロジックのため

import re 
pattern=r'(?<=as\s)\w.+' 
occurrence={} 

with open("/var/log/messages") as f: 
    for line in f: 
     search=re.search(pattern,line).group() 

     if search not in occurrence: 
      occurrence[search]=1 
     else: 
      occurrence[search]=occurrence.get(search)+1 

print(occurrence) 

を:

import re 
pattern=r'(?<=as\s)\w.+' 
new={} 
[new.__setitem__(re.search(pattern, line).group(), 1) if re.search(pattern, line).group() not in new else new.__setitem__(re.search(pattern, line).group(), new.get(re.search(pattern, line).group()) + 1) for line in open('legend.txt','r')] 

print(new) 
+0

Ayodhyankit Paul ..あなたのコードのThxは、それは試してみて.. – krock1516

関連する問題