Подсчет дубликатов строк из потока


2

В настоящее время я анализирую журналы 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 нет).

Ответы:


0

Хотя это может указывать на очевидное, но вы пробовали это:

tail -f /opt/apache/logs/access/gvh-access_log.1365638400  | grep specific.stuff. | awk '{print $12}' | cut -d/ -f3 | sort | uniq | sort -n | tail -50

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


1
Это не работает, потому что бессмысленно использовать сортировку в потоке, поэтому мне нужен временный файл в процессе.
cpa

Вы пытались и видели, что это не работает для вас, или вы просто предполагаете, что это не будет работать? Создание временного файла - это то же самое, что и передача вашей первой команды во вторую команду в качестве входных данных. Если вы еще не пробовали, просто попробуйте. Если вы пытались, с какой проблемой вы столкнулись?
MelBurslan

1
Есть несколько причин, почему это не работает (и я пытался): sort ждет EOF перед записью его вывода. Надеюсь понятно почему. - tail -50 берет последние 50 строк из EOF. Таким образом, в конечном итоге это сводится к тому, что tail -f в журнале apache никогда не будет выводиться EOF, так как он постоянно добавляет строки в файл. Сброс результатов в файл - это способ добиться этого. Конечно, я мог бы просто tail но это все еще требует парсинга файла журнала каждый раз, что глупо.
cpa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.