Как улучшить этот похожий на хвост код Python

Я просто хочу знать, есть ли у вас, ребята, лучшие способы сделать это, чем тот, который придумал я. Я хочу создать сценарий, похожий на "tail -f", но такой, который будет активно искать строку и печатать только текст, относящийся к этой строке, в режиме реального времени. Как вы можете видеть из кода, я ищу MAC-адреса, но я думаю, что это может быть использовано для каких-то других целей.

Я думал, что должен быть лучший способ сделать это. Может быть, кто-то из вас, ребята, знает умный алгоритм или команду, которая делает это лучше. Спасибо за вашу помощь

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

person perrocontodo    schedule 12.05.2011    source источник
comment
измените if st_size > where: переменную where, потому что на самом деле это встроенная функция Python.   -  person Jakob Bowyer    schedule 12.05.2011
comment
Также вы можете добавлять строки документа к своим функциям, а не комментарии. Помните, что строки документа объясняют, что он делает, а комментарии объясняют, как.   -  person Jakob Bowyer    schedule 12.05.2011
comment
Вы проверили решения, предложенные здесь? stackoverflow.com/questions/136168/   -  person Sean Vieira    schedule 12.05.2011
comment
Вопрос, на который ссылается Шон, касается выполнения чего-то эквивалентного «хвосту». То, о чем вы просите, это «tail -f», что является совершенно другим поведением. Возможно, вы захотите проверить ответ Цури Бар Йохай на этот вопрос, который, как я обнаружил, работает довольно хорошо: stackoverflow.com/questions/1475950/   -  person Cam Jackson    schedule 03.08.2011


Ответы (1)


Вы делаете это как упражнение на Python или можете использовать оболочку?

Можете ли вы просто направить хвостовой вывод в grep?

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

Вы можете поместить это в скрипт и создать аргументы файла и шаблона.

Используя grep, вы также можете добавить контекст к своему выводу, используя переключатели -A и -B.

person Deano    schedule 12.05.2011
comment
Я не знаю заранее, сколько строк выводить до или после совпадения с шаблоном, поэтому я не знаю, что поставить на переключатели -A и -B. - person perrocontodo; 12.05.2011