The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"как открыть файл с конца?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Языки программирования)
Изначальное сообщение [ Отслеживать ]

"как открыть файл с конца?"  +/
Сообщение от httpd (ok) on 31-Окт-11, 23:55 
есть апачевый лог файл в несколько Гигов, надо его открыть с конца и читать вверх на 5 минут назад. есть канешно ж tail и tac, но они читают только по количеству заданных строк.
Как это сделать? желательно на перле, но можно и командами баша.
те грубо говоря сделал: tac file и читаю его до первого совпадения слова XXX, после чего файл закрывается.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "как открыть файл с конца?"  +/
Сообщение от XAnder (ok) on 01-Ноя-11, 14:01 
> те грубо говоря сделал: tac file и читаю его до первого совпадения
> слова XXX, после чего файл закрывается.

А теперь давайте перепишем это предложение на шелле:

tac file | grep -m 1 XXX

Это если нужна только совпадающая строка. А если нужны все строки от совпадающей до конца:

tac file | perl -ne 'print; exit 0 if m/XXX/;'

Ну или вместо перла свой любимый скриптовый язык.

Можно в конце ещё добавить "| tac", чтобы вернуть строки к нормальному порядку, но тогда рискуете получить подвисание, если XXX нет (или очень далеко от конца) в гигабайтном файле.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "как открыть файл с конца?"  +/
Сообщение от httpd (ok) on 01-Ноя-11, 15:46 
> А теперь давайте перепишем это предложение на шелле:
>
tac file | grep -m 1 XXX

> Это если нужна только совпадающая строка. А если нужны все строки от
> совпадающей до конца:
>
tac file | perl -ne 'print; exit 0 if m/XXX/;'

> Ну или вместо перла свой любимый скриптовый язык.

так не пойдет, "tac file" будет читать весь файл сконца наперед, а только потом результат будет перенаправлен на  grep или perl. Мне надо читать файл с конца только до первого совпадения слова. Похоже баш утилитами это не под силу, проще написать скрипт используя seek(), вобщем в процессе. если есть еще идеи, буду рад выслушать.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "как открыть файл с конца?"  +/
Сообщение от XAnder (ok) on 01-Ноя-11, 16:16 
> так не пойдет, "tac file" будет читать весь файл сконца наперед, а
> только потом результат будет перенаправлен на  grep или perl.

Он в самом деле так себя ведёт? Гм... я был о нём лучшего мнения. К гигабайтным файлам, правда, применять не приходилось.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "как открыть файл с конца?"  +/
Сообщение от XAnder (ok) on 01-Ноя-11, 16:34 
>> так не пойдет, "tac file" будет читать весь файл сконца наперед, а
>> только потом результат будет перенаправлен на  grep или perl.
> Он в самом деле так себя ведёт? Гм... я был о нём
> лучшего мнения. К гигабайтным файлам, правда, применять не приходилось.

Нет, ну поклёп же гнусный :-) только что проверил у себя - ничего подобного, работает исключительно быстро. Файл у меня, конечно, нашёлся только 400М, но команда отработала мгновенно.

Для справки: tac из coreutils 8.5 на Debian Squeeze

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "как открыть файл с конца?"  +/
Сообщение от httpd (ok) on 01-Ноя-11, 17:21 
>>> так не пойдет, "tac file" будет читать весь файл сконца наперед, а
>>> только потом результат будет перенаправлен на  grep или perl.
>> Он в самом деле так себя ведёт? Гм... я был о нём
>> лучшего мнения. К гигабайтным файлам, правда, применять не приходилось.
> Нет, ну поклёп же гнусный :-) только что проверил у себя -
> ничего подобного, работает исключительно быстро. Файл у меня, конечно, нашёлся только
> 400М, но команда отработала мгновенно.
> Для справки: tac из coreutils 8.5 на Debian Squeeze

точно, пардон. эт у меня что-то подвисло в процессе теста... знач попробую таким методом тоже, сенкс.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "как открыть файл с конца?"  +/
Сообщение от httpd (ok) on 01-Ноя-11, 23:58 
>[оверквотинг удален]
>> слова XXX, после чего файл закрывается.
> А теперь давайте перепишем это предложение на шелле:
>
tac file | grep -m 1 XXX

> Это если нужна только совпадающая строка. А если нужны все строки от
> совпадающей до конца:
>
tac file | perl -ne 'print; exit 0 if m/XXX/;'

> Ну или вместо перла свой любимый скриптовый язык.
> Можно в конце ещё добавить "| tac", чтобы вернуть строки к нормальному
> порядку, но тогда рискуете получить подвисание, если XXX нет (или очень
> далеко от конца) в гигабайтном файле.

кстати, как сделать вот в этом примере

perl -ne 'print; exit 0 if m/XXX/;'

в условии что-то типа if(($CurrentDate - $Dateinfile)>300)

те вывести из лог файла, только строчки которые были добавлены за последние 5 минут(300сек.)

$CurrentDate получить не сложно:
$CurrentDate=`date +%s`

а вот с $Dateinfile все намного сложнее, в логе дата имеет формат:
#  tac access_log | head -1| awk  '{print $4}' | sed 's/\[//;s/:/ /'
30/Oct/2011 20:09:09

и стандартным средством такой формат в юникс формат не сконвертить:
# date --date='30/Oct/2011 20:09:09' +%s
date: invalid date `30/Oct/2011 20:09:09'

изменять формат лога не желательно, всякие стастистики там еще собираются по ним.


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру