Извлечение и подсчет значений из стандартных файлов журнала.gz ежечасно

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

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

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

3 ответа

Решение

Поскольку вы просто хотите посчитать случаи, вы можете просто 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.

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

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

Или awk (gawk в linux) будет работать:

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

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

Другие вопросы по тегам