Подсчитать количество вхождений токена в файл

StackOverflow https://stackoverflow.com/questions/128365

  •  02-07-2019
  •  | 
  •  

Вопрос

У меня есть журнал доступа к серверу с временными метками каждого 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, чтобы получить номер.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top