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

800
cpa

В настоящее время я анализирую журналы apache с помощью этой команды:

tail -f /opt/apache/logs/access/gvh-access_log.1365638400 |  grep specific.stuff. | awk '' | 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 - нет).

2

1 ответ на вопрос

0
MelBurslan

Although it might be pointing the obvious but, did you try this:

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

I know it is a long command line but it elimibates the creation of the intermediary file. If this is not working for you, could you please tell why, so that you can get more meaningful answers.

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