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

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 нет).

cpa
источник

Ответы:

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

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

MelBurslan
источник
1
Это не работает, потому что бессмысленно использовать сортировку в потоке, поэтому мне нужен временный файл в процессе.
cpa
Вы пытались и видели, что это не работает для вас, или вы просто предполагаете, что это не будет работать? Создание временного файла - это то же самое, что и передача вашей первой команды во вторую команду в качестве входных данных. Если вы еще не пробовали, просто попробуйте. Если вы пытались, с какой проблемой вы столкнулись?
MelBurslan
1
Есть несколько причин, почему это не работает (и я пытался): sort ждет EOF перед записью его вывода. Надеюсь понятно почему. - tail -50 берет последние 50 строк из EOF. Таким образом, в конечном итоге это сводится к тому, что tail -f в журнале apache никогда не будет выводиться EOF, так как он постоянно добавляет строки в файл. Сброс результатов в файл - это способ добиться этого. Конечно, я мог бы просто tail но это все еще требует парсинга файла журнала каждый раз, что глупо.
cpa