Извлечение и подсчет значений из стандартных файлов журнала.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.
Или awk (gawk в linux) будет работать:
zcat *.gz | awk -F'[\.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null
перенаправление там, потому что некоторые awks, особенно gawk, будут жаловаться. не быть метасимволом