The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
как открыть файл с конца?, !*! httpd, 31-Окт-11, 23:55  [смотреть все]
есть апачевый лог файл в несколько Гигов, надо его открыть с конца и читать вверх на 5 минут назад. есть канешно ж tail и tac, но они читают только по количеству заданных строк.
Как это сделать? желательно на перле, но можно и командами баша.
те грубо говоря сделал: tac file и читаю его до первого совпадения слова XXX, после чего файл закрывается.

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

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

    tac file | grep -m 1 XXX

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

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

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

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

    • как открыть файл с конца?, !*! httpd, 15:46 , 01-Ноя-11 (2)
      > А теперь давайте перепишем это предложение на шелле:
      >
      tac file | grep -m 1 XXX

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

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

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

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

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

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

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

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

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

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

    • как открыть файл с конца?, !*! httpd, 23:58 , 01-Ноя-11 (6)
      >[оверквотинг удален]
      >> слова 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'

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





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

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