Как распечатать количество уникальных совпадений с grep?

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

Вот некоторые из пакетов:

10:27:46.227407 IP 85.130.236.26.54156 > 139.91.133.120.60679: tcp 0
10:27:46.337038 IP 211.142.173.14.80 > 139.91.138.125.56163: tcp 0
10:27:46.511241 IP 211.49.224.217.3389 > 139.91.131.47.6973: tcp 0

Я хочу посмотреть здесь номер второго порта:

60679, 53163, 6973 и т.д.

Поэтому я могу использовать:

grep -c '\.80:' output.txt

Чтобы подсчитывать все порты, использовался порт 80. Но есть ли способ показать все порты, которые были использованы, и сколько раз он был найден в этом файле. Что-то вроде этого и предпочтительнее отсортировано, поэтому я могу видеть, какие порты использовались наиболее часто:

.80: - 54513
.110: - 12334
.445: - 412

Ответы

Ответ 1

См. uniq -c. Вы захотите вытащить нужный бит, отсортировать результат, выполнить трубку через uniq, отсортировать вывод. Что-то вроде этого возможно:

egrep '\.[0-9]+:' output.txt | sort | uniq -c | sort -nr

Уточнение: я использовал grep здесь, потому что не ясно, как выглядит ваш формат output.txt, но вы захотите фактически вырезать бит номера порта, возможно, через cut или awk.

Изменить: Чтобы получить порт, вы можете вырезать один раз на период, а затем снова на двоеточие:

cut -d. -f10 < output.txt | cut -d: -f1

(Или любой из дюжины других способов сделать одно и то же). Это даст вам несортированный список портов. Тогда:

cut -d. -f10 < output.txt | cut -d: -f1 | sort | uniq -c | sort -nr