2013-11-23 2 views
0

Я пытаюсь подсчитать количество вхождений конкретной строки из группы из .gz лог-файлов на почасовой основе. Каждый оператор файл_журнала начинается со следующего формата времени:Извлечение и подсчет значений из стандартных файлов журнала .gz на почасовой основе

2013-11-21;09:07:23.433. 

Например, чтобы быть более ясным, найти количество вхождений строки "abc" между 8 утра до 9 утра, а затем с 9 до 10 часов утра и так далее. Любые идеи о том, как это сделать?

ответ

1

Поскольку вы просто хотите считать вхождений, вы можете просто zcat содержимое файла, grep той части, которая описывает то, что вы ищете - слов/интервалов времени - и, наконец, сортировать/счетчик (sort | uniq -c) записи. Ниже, вероятно, хватит:

zcat *.gz | grep <word> | grep -oP "^\d{4}-\d{2}-\d{2};\d{2}" | sort | uniq -c 

выше команда должна найти строки в лог-файл, который содержит <word> вы ищете, извлекать как дата и время от таких записей, а затем подсчета вхождений. В случае, если вы не хотите, чтобы принять во внимание дней/месяцев/лет, вы можете использовать:

zcat *.gz | grep <word> | grep -oP "^\d{4}-\d{2}-\d{2};\K\d{2}" | sort | uniq -c 

\K добавил в выражении grep это флаг для Двойник позади в PCRE - Perl Compatible Regular Expression.

+0

Perfect. Это то, что я искал Спасибо! – codehammer

+0

@Hiten Рад, что это помогло! Если сообщение отвечает на ваш вопрос, отметьте его как принятое, чтобы другие знали, что проблема решена. Для этого отметьте галочку рядом с стрелками для голосования. – Rubens

+0

пропустил его..маркировал его как принятый. Еще раз спасибо. – codehammer

0

Или AWK (простак в Linux) будет работать:

zcat *.gz | awk -F'[\.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null 

переназначение там, потому что некоторые awks, в частности, поглазеть, будет жаловаться. не будучи метасимволом

1

Попробуйте это:

zgrep -c '2013-11-21;0[89]:.*abc' file.gz 

 Смежные вопросы

  • Нет связанных вопросов^_^