Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Скрипт на BASH  (Прочитано 934 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sakojpa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Скрипт на BASH
« : 28 Августа 2013, 14:32:01 »
Доброго всем дня!
Прошу помощи в написании скрипта
В общем задача такая:
Есть файл в котором пишутся логи обращений пользователей к определенным ресурсам. Необходимо снимать статистику посещений определенных ресурсов за последний час.

Собственно, все бы ничего, но что-то я запутался как мне вычленить информацию именно за последний час. пробовал с date --date 'now -1 hour' колдовать, но, собственно, как вы понимаете пользователи не ходят по расписанию :)

Т.е. задача сводится к тому,  чтобы парсить не весь файл, а только те строки,  где время отличается от текущего не более чем на 1 час.

Оффлайн vselax

  • Активист
  • *
  • Сообщений: 309
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #1 : 28 Августа 2013, 15:04:52 »
Не ясно как это можно сделать. Приложите кусок файла, будет понятней.

Оффлайн Sakojpa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #2 : 28 Августа 2013, 15:45:06 »
Ничего необычного,  обычный вывод nginx'а

Пользователь решил продолжить мысль 28 Августа 2013, 15:47:57:
Ну и,  конечно,  это не весь файл,  там еще около  5000 строк. Но я думаю этого хватит
« Последнее редактирование: 28 Августа 2013, 15:47:57 от Sakojpa »

Оффлайн vselax

  • Активист
  • *
  • Сообщений: 309
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #3 : 28 Августа 2013, 17:18:24 »
Ну тут придется немного потратить время. Можно так:

1. Определить и запомнить кол-во строк в файле.
2. Командами head и tail забрать последнюю строку (взять из переменной, хранящей число строк).
3. Используя sed или avk (последний нужно установить) выбрать поля со временем.
4. Преобразовать время в секунды для удобства счета.
5. Отнять час и запомнить границу времени.
6. Править статистику.
7. Уменьшить число строк в переменной (аккуратно!).
8. Командами head и tail забрать последнюю строку (взять из переменной, хранящей число строк).
9. Bыбрать поля со временем.
10. Преобразовать время в секунды.
11. Сравнить с границей времени (закончить если пройдена).
12. Править статистику.
13. Перейти на п.7.

Приблизительно так. Но потребуется еще запоминать последнюю строку, чтобы обработать ситуации с пропусками/повторами.
Есть еще идея с временным файлом.

1. Командой diff сравниваем текущий файл отчета со старым (был за час до этого). Обязательно сохраняем вывод diff в файл (одним действием! Для атомарности.).
2. По результату сравнения берем статистику.
3. Добавляем сохраненный вывод diff`а к старому файлу отчета.
4. Через час все повторяем.

Оффлайн Sakojpa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #4 : 28 Августа 2013, 18:02:50 »
Ох тыж матерь божья :))
скриптую под башем наверное раз 5.  То что Вы мне сейчас сказали для меня кажется будто меня просят самолет изобрести.
Никаких вариантов проще нет? Я думал как в мускле есть понятие интервала времени.

ПыСы: прошу прощения великодушно! Не посмотрел в файл, что приложил. откуда то там взялись символы перевода каретки. Естественно их нет.
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 28 Августа 2013, 18:16:07 от Sakojpa »

Оффлайн vselax

  • Активист
  • *
  • Сообщений: 309
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #5 : 28 Августа 2013, 18:15:55 »
Цитировать
Я думал как в мускле есть понятие интервала времени.
Не понял идею. Обрати внимание на второй вариант, что я посоветовал, первый правда страшен. Но смотри внимательно с логами, они могут архивироваться в некоторые моменты времени и заводиться новые. Засада распространяется на оба моих варианта. Так что вопрос - куда и как пишутся логи? Нет ли рядом уже их сжатых кусков?

Оффлайн Sakojpa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #6 : 28 Августа 2013, 18:18:22 »
К сожалению есть, все логи гзипятся после достижения определенного размера.

Оффлайн Master_Sergius

  • Активист
  • *
  • Сообщений: 528
  • i3
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #7 : 28 Августа 2013, 19:20:13 »
Мне кажется, что это надо сделать использовав sed и awk
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Оффлайн Sakojpa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #8 : 28 Августа 2013, 19:29:15 »
Товарищ,  я не силен в скриптинге, пишу максимум 5 раз и тот таких задачи не попадалось, сформулируйте приблизительную строку поиска, пожалуйста.

Оффлайн Master_Sergius

  • Активист
  • *
  • Сообщений: 528
  • i3
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #9 : 28 Августа 2013, 23:01:33 »
Ну вот, например, вычленил даты вот так, которые хранятся в поле $4, только надо бы преобразовать
sed 's/\[//g' access.txt | sed 's/\]//g' | awk '{ print $4, $6, $7 }'
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Оффлайн Sakojpa

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: Скрипт на BASH
« Ответ #10 : 29 Августа 2013, 10:23:23 »
sed 's/\[//g' access.txt | sed 's/\]//g' | awk '{ print $4, $6, $7 }'

Спасибо.  Команды пригодились,  немного переделал и все заработало :)
Спасибо всем кто откликнулся :)

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Скрипт на BASH
« Ответ #11 : 29 Августа 2013, 10:28:43 »
sarg

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.