Intereting Posts
Как импортировать argparse, когда я использую qsub в Linux-сервере? Запуск скрипта perl при запуске в Ubuntu Как я могу проверить большое количество файлов с помощью поиска и замены? ocaml oUnit и главная ocaml lib делают противоречивые предположения относительно реализации Unix Linux / php требует родительский каталог Есть ли способ объединить эти переадресации? Командир команды комиссара жалобщиков жалуется на судо Переадресовать example.com на сервер rails, запущенный на локальном хосте: 3000 удаленных сайтов Apache нетронутыми? ipython ноутбук на Linux VM работает matplotlib интерактивный с nbagg htaccess переписать url на https и удалить имя файла хранить вывод команды в массив в сценарии оболочки Cherrypy: Мне действительно нужно поставить его за frameworks интерфейса? Сделать WPF Window Immune для показа рабочего стола (запретить скрытие) Могу ли я программировать на iPad 2? разница между содержимым двух каталогов

Обработать линии в обратном порядке

Как обрабатывать файл журнала (в моем случае nginx access.log) в обратном порядке?

Фон Я разрабатываю сценарий анализатора журналов файлов, и я просто не могу понять, как обрабатывать огромные файлы журналов с конца, чтобы я мог отсортировать временные frameworks, начиная с самых последних дат, которые мне нужны.

Одним из способов может быть доступ к концу файла с помощью seek а затем сканирование файла в обратном порядке оттуда. Пример:

 def Tail(filepath, nol=10, read_size=1024): """ This function returns the last line of a file. Args: filepath: path to file nol: number of lines to print read_size: data is read in chunks of this size (optional, default=1024) Raises: IOError if file cannot be processed. """ f = open(filepath, 'rU') # U is to open it with Universal newline support offset = read_size f.seek(0, 2) file_size = f.tell() while 1: if file_size < offset: offset = file_size f.seek(-1*offset, 2) read_str = f.read(offset) # Remove newline at the end if read_str[offset - 1] == '\n': read_str = read_str[:-1] lines = read_str.split('\n') if len(lines) >= nol: # Got nol lines return "\n".join(lines[-nol:]) if offset == file_size: # Reached the beginning return read_str offset += read_size f.close() 

Затем используйте как

 Tail('/etc/httpd/logs/access.log', 100) 

Это даст вам последние 100 строк вашего файла access.log.

Код, на который ссылаются: http://www.manugarg.com/2007/04/real-tailing-in-python.html