Python阅读文件

时间:2012-02-15 12:56:09

标签: python

我如何知道使用root帐户登录的次数是多少?

以下是我目前在python中使用的代码:

myFile = open('file','r')
count_rr = 0
for line in myFile.readlines():
    list_of_line = line.split(' ')
    if 'root' in list_of_line[?]
            print 'root'
            count_rr = counter_rt + 1

以下是我试图阅读的文件的两行:

Jan 10 09:32:46 j4-be03 sshd[3885]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.241.173.35  user=root
Jan 10 09:32:48 j4-be03 sshd[3885]: Failed password for root from 218.241.173.35 port 50212 ssh2

4 个答案:

答案 0 :(得分:4)

它绝对不是最紧凑或python-y方式,但它应该工作。我只是不确定[?]在你的代码中做了什么,用冒号代替它:它应该有效。

你可能会得到一些误报!

(我个人会在bash中这样做:

grep -c 'sshd\[.*authentication failure.* user=root ' file

应该做的伎俩(并且更强大)

答案 1 :(得分:1)

这里的几个答案将为您提供所需的信息,但如果您想更有效地做到这一点:

from __future__ import with_statement # needed in python 2.5 and earlier
import re
from itertools import ifilter

def count_root(file, regex=re.compile('root')):
   count = 0
   with open(file, 'r') as src:
       for i in ifilter(regex.search, src):
           count += 1
   return count

print count_root('file')

虽然您可以调整该正则表达式,以便为您提供更准确的结果。如果你能够大大缩小它(比如root必须在最后30个字符中,或者你有什么),那么有针对性的字符串方法会更快。

答案 2 :(得分:0)

这样的事情应该有效 - 您可能需要调整regular expression以满足您的确切需求:

myFile = open('file')
count_rr = 0
for line in myFile:
    if re.search('pam_unix\(sshd:auth\): .* user=root ', line):
        count_rr += 1

答案 3 :(得分:0)

我认为你可以尝试这样的事情:

count_rr = len(line for line in myFile
               if 'Failed password for root' in line)

注意:

  • 如果文件很大,请不要使用readlines,只需遍历文件对象以避免将整个文件存入内存。
  • 您可以使用in运算符直接查找子字符串,无需拆分该行。