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

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

но это просто производит одну строку из общего количества совпадающих строк.

Я знаю, что это можно сделать одной строкой, связав несколько утилит вместе ... но я не могу придумать, какие именно. Кто-нибудь знает?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
9 431
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Я думаю ты ищешь

uniq --count

-c, --count prefix lines by the number of occurrences

Обратите внимание, что с другими наборами данных вам может потребоваться sort (1) перед uniq (1), поскольку uniq будет группировать только соседние дубликаты.

Annika Backstrom 24.09.2008 21:11

Да, но OP уже сказал, что он разобрался с вещами, поэтому я предположил, что он был в курсе таких вещей ...

The Archetypal Paul 24.09.2008 21:17

Мне пришлось использовать uniq -c на OS X, --count выдал ошибку.

Darren Greaves 21.01.2015 23:52

может быть, использовать 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

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