Как распечатать количество уникальных совпадений с 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