Подсчитать количество вхождений токена в файл
Вопрос
У меня есть журнал доступа к серверу с временными метками каждого http-запроса, я хотел бы подсчитать количество запросов в каждую секунду.С использованием sed
, и cut -c
, пока мне удалось сократить файл до временных меток, например:
22 сентября 2008 г. 20:00:21 +0000
22 сентября 2008 г. 20:00:22 +0000
22 сентября 2008 г. 20:00:22 +0000
22 сентября 2008 г. 20:00:22 +0000
22 сентября 2008 г. 20:00:24 +0000
22 сентября 2008 г. 20:00:24 +0000
Мне бы хотелось узнать, сколько раз каждая уникальная временная метка появляется в файле.Например, в приведенном выше примере я хотел бы получить вывод, который выглядит так:
22 сентября 2008 г. 20:00:21 +0000:1
22 сентября 2008 г. 20:00:22 +0000:3
22 сентября 2008 г. 20:00:24 +0000:2
я использовал sort -u
отфильтровать список временных меток до списка уникальных токенов, надеясь, что я смогу использовать grep, например
grep -c -f <file containing patterns> <file>
но это создает только одну строку из общего числа совпадающих строк.
Я знаю, что это можно сделать в одной строке, соединив вместе несколько утилит...но я не могу придумать какой.Кто-нибудь знает?
Решение
Я думаю, ты ищешь
uniq --count
-c, -Средство префикса по количеству случаев
Другие советы
Использование AWK с ассоциативными массивами может быть еще одним решением подобной проблемы.
На всякий случай вам нужен вывод в формате, который вы изначально указали (с количеством вхождений в конце):
uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/\2: \1/'
С использованием ок:
cat file.txt | awk '{count[$1 " " $2]++;} \
END {for(w in count){print w ": " count[w]};}'
Решение Тома:
awk '{count[$1 " " $2]++;} 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
может быть, использовать xargs?Не могу тут же собрать все это в голове, но используйте xargs для сортировки -u, чтобы для каждой уникальной секунды вы могли выполнить grep исходного файла и выполнить wc -l, чтобы получить номер.