2011-05-12 76 views
1

我只想知道,如果你们有更好的方式来做到这一点,比我想出的方式。我想要的是制作一个“尾巴-f”式的脚本,但它会主动查找字符串并实时打印与该字符串相关的文本。正如你从代码中看到的,我正在寻找MAC地址,但我想它可以用于其他一些目的。如何改进这种类似于尾巴的Python代码

我在想这样做一定有更好的方法。也许你们中的一个人知道一个聪明的算法或者一个能够做得更好的命令。感谢您的帮助

import time, os, sys 
from datetime import date 

# Function to get the file size, it will help us go to the end of a file 
def current_file_size(filename): 
    file_results = os.stat(filename) 
    file_size = file_results[6] 
    return file_size 

# Check for correct usage 
if len(sys.argv) != 2: 
    print "Usage: %s <mac_address>" % sys.argv[0] 
    sys.exit() 

#Get the date in the format that the log uses 
now = date.today() 
todays_date = now.strftime("%Y%m%d") 

#Set the filename and open the file 
filename = 'complete.log' 
file = open(filename,'r') 

#Find the size of the file and move to the end 
st_size = current_file_size(filename) 
file.seek(st_size) 

while 1: 
    where = file.tell() # current position of the file 
    time.sleep(2)   # sleep for a little while 
    st_size = current_file_size(filename) 
    if st_size > where:  # if there's new text 
     alotoflines = file.read(st_size-where) # get the new lines as a group 
     # search for the tag+mac address 
     found_string = alotoflines.find("<mac v=\"" + sys.argv[1]) 
     if found_string > 0: 
      # search for the immediately prior date instance from where the MAC address 
      # is. I know that the log entry starts there 
      found_date_tag = alotoflines.rfind(todays_date,0,found_string) 
      print alotoflines[found_date_tag:] 
+0

更改'如果st_size>其中:'变量'where'因为这实际上是一个python builtin。 – 2011-05-12 11:46:49

+1

您也可以将文档字符串添加到您的功能而不是注释。记住Doc字符串解释它的作用,评论解释如何。 – 2011-05-12 11:56:45

+1

您是否检查过在此提出的解决方案? http://stackoverflow.com/questions/136168/get-last-n-lines-of-a-file-with-python-similar-to-tail – 2011-05-12 16:11:37

回答

1

您是在做这个Python练习还是可以使用shell?

你可以简单地将尾部输出管道化为grep吗?

tail -F myfile.txt | egrep --line-buffered myPattern 

你可以把这个变成一个脚本,使文件和模式ARGS。

使用grep,您还可以使用-A和-B开关将上下文添加到输出。

+0

我不知道模式匹配之前或之后需要输出多少行,所以我不知道把什么放在-A和-B开关上 – perrocontodo 2011-05-12 12:10:34