В настоящее время я анализирую журналы apache с помощью этой команды:
tail -f /opt/apache/logs/access/gvh-access_log.1365638400 |
grep specific.stuff. | awk '{print $12}' | cut -d/ -f3 > ~/logs
Вывод представляет собой список доменов:
www.domain1.com
www.domain1.com
www.domain2.com
www.domain3.com
www.domain1.com
Затем в другом терминале я запускаю эту команду:
watch -n 10 'cat ~/logs | sort | uniq -c | sort -n | tail -50'
Выход:
1023 www.domain2.com
2001 www.domain3.com
12393 www.domain1.com
Я использую это для мониторинга в квази-реальном времени Apache статистики. Беда в том, что logs
получить очень большой очень быстро. Мне не нужны журналы для каких-либо других целей, кроме uniq -c
,
Мой вопрос: Есть ли способ избежать использования временного файла? Я не хочу вручную раскручивать свой счетчик на своем языке, я хотел бы использовать некоторые awk
магия, если это возможно.
Обратите внимание, что, поскольку мне нужно использовать sort
Я должен использовать временный файл в процессе, потому что сортировка по потокам не имеет смысла (хотя uniq нет).
sort
ждет EOF перед записью его вывода. Надеюсь понятно почему. -tail -50
берет последние 50 строк из EOF. Таким образом, в конечном итоге это сводится к тому, чтоtail -f
в журнале apache никогда не будет выводиться EOF, так как он постоянно добавляет строки в файл. Сброс результатов в файл - это способ добиться этого. Конечно, я мог бы простоtail
но это все еще требует парсинга файла журнала каждый раз, что глупо.