У меня есть журнал доступа к серверу с отметками времени каждого HTTP-запроса, я хотел бы получить подсчет количества запросов в каждую секунду. Используя sed и cut -c, мне удалось сократить файл до временных меток, например:
22-Sep-2008 20:00:21 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:24 +0000
22-Sep-2008 20:00:24 +0000
Я бы хотел узнать, сколько раз каждая уникальная метка времени появляется в файле. Например, в приведенном выше примере я хотел бы получить следующий результат:
22-Sep-2008 20:00:21 +0000: 1
22-Sep-2008 20:00:22 +0000: 3
22-Sep-2008 20:00:24 +0000: 2
Я использовал sort -u, чтобы отфильтровать список временных меток до списка уникальных токенов, надеясь, что я смогу использовать grep, например
grep -c -f <file containing patterns> <file>
но это просто производит одну строку из общего количества совпадающих строк.
Я знаю, что это можно сделать одной строкой, связав несколько утилит вместе ... но я не могу придумать, какие именно. Кто-нибудь знает?





Я думаю ты ищешь
uniq --count
-c, --count prefix lines by the number of occurrences
Да, но OP уже сказал, что он разобрался с вещами, поэтому я предположил, что он был в курсе таких вещей ...
Мне пришлось использовать uniq -c на OS X, --count выдал ошибку.
может быть, использовать xargs? Не могу собрать все это в голове прямо здесь, но используйте xargs в вашей sort -u, чтобы для каждой уникальной секунды вы могли grep исходный файл и выполнить wc -l, чтобы получить номер.
Использование AWK с ассоциативными массивами может быть еще одним решением чего-то подобного.
На всякий случай, если вам нужен вывод в том формате, который вы указали изначально (с количеством вхождений в конце):
uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/: /'
Используя awk:
cat file.txt | awk '{count[ " " ]++;} \
END {for(w in count){print w ": " count[w]};}'
Решение Тома:
awk '{count[ " " ]++;} END {for(w in count){print w ": " count[w]};}' file.txt
работает в более общем плане.
Мой файл не был отсортирован:
name1
name2
name3
name2
name2
name3
name1
Следовательно, вхождения не следовали друг за другом, и uniq не работает, как выдает:
1 name1
1 name2
1 name3
2 name2
1 name3
1 name1
Однако с помощью сценария awk:
name1:2
name2:3
name3:2
Обратите внимание, что с другими наборами данных вам может потребоваться sort (1) перед uniq (1), поскольку uniq будет группировать только соседние дубликаты.