Битлента
Сетевые команды и утилиты5 мин чтения·

sort | uniq -c | sort -rn: как посчитать, какие адреса встречаются чаще всего

Как посчитать повторы строк в выводе сетевых команд и журналах: связка sort, uniq -c и sort -rn, почему uniq требует сортировки, пример с адресами.

Кратко

Чтобы увидеть частоту значений, выведите нужный столбец, отсортируйте его, подсчитайте повторы через uniq -c и отсортируйте результат по числу: sort | uniq -c | sort -rn. Без первой сортировки uniq считает только соседние одинаковые строки.

Задача: кто встречается в выводе чаще других

Вывод сетевой команды или файл журнала нередко содержит одни и те же адреса много раз. Нужно ответить на простой вопрос: с каким адресом связано больше всего строк. Просматривать вручную сотни записей бессмысленно, а три стандартные утилиты решают задачу за одну строку.

Идея такая. Сначала из текста выделяют интересующее значение, например удалённый адрес. Потом одинаковые значения сводят в группы командой sort. Затем uniq -c схлопывает идущие подряд одинаковые строки в одну и ставит перед ней счётчик. Наконец, второй sort с ключами -rn упорядочивает результат по числу, от большего к меньшему.

Получается цепочка, в которой каждое звено делает одну маленькую работу. Её можно применять к чему угодно, где есть повторяющиеся строки: адреса в выводе ss, имена хостов из ответов dig, имена интерфейсов, коды ответов сервера из журнала доступа.

Почему uniq сначала требует sort

Команда uniq сравнивает только соседние строки. Если одинаковые значения разбросаны по тексту, она не видит их как повторы и считает каждую группу отдельно. Поэтому перед uniq почти всегда ставят sort: он собирает одинаковые строки рядом.

Разница хорошо видна на коротком примере. Пусть на вход пришли три строки: 203.0.113.5, 198.51.100.7, 203.0.113.5. Без сортировки uniq -c выведет три строки со счётчиком 1 каждая, потому что двух одинаковых строк рядом нет. После sort порядок станет 198.51.100.7, 203.0.113.5, 203.0.113.5, и uniq -c напечатает счётчик 1 для первого адреса и 2 для второго.

Заметьте: sort по умолчанию сравнивает строки как текст. Для адресов это нормально, пока цель только сгруппировать, но для упорядочивания по числовому значению нужен ключ -n, иначе число 10 окажется раньше числа 9.

Ключи sort и uniq, которые понадобятся

Основной набор небольшой, и его удобно держать перед глазами в виде таблицы.

Утилита и ключЧто делает
sort -nсравнивает как числа, а не как текст
sort -rменяет порядок на обратный
sort -uоставляет по одной копии каждой строки
sort -k 2сортирует по второму полю
sort -t: -k2задаёт разделитель полей двоеточие
uniq -cставит перед строкой число повторов
uniq -dпечатает только повторяющиеся строки
uniq -uпечатает только строки без повторов

Отдельно полезно, что sort -u даёт тот же набор строк, что sort | uniq, но без счётчика. Если счётчик не нужен, а нужен просто список уникальных значений, достаточно одной команды. Все остальные ключи и особенности локали смотрите в справке man sort для вашей системы.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно

Полный пример на удалённых адресах ss

Допустим, нужно увидеть, к каким серверам у компьютера больше всего установленных соединений. Адрес и порт стоят в пятом поле вывода ss -tan, а адрес от порта отделяет последнее двоеточие.

  1. Выбираем установленные соединения: ss -tan | grep ESTAB.
  2. Берём пятый столбец: awk '{print $5}'.
  3. Отрезаем порт, оставляя адрес: sed 's/:[0-9]*$//'. Выражение удаляет двоеточие и цифры в конце строки.
  4. Группируем одинаковые адреса: sort.
  5. Считаем повторы: uniq -c.
  6. Сортируем по числу, чаще встречающиеся сверху: sort -rn.

Целиком: ss -tan | grep ESTAB | awk '{print $5}' | sed 's/:[0-9]*$//' | sort | uniq -c | sort -rn. Значения в примере условные. Результат выглядит как список строк вида «7 198.51.100.7» и «2 203.0.113.5»: слева число соединений, справа адрес. Чтобы оставить десять первых строк, допишите в конце head -n 10.

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

Что ещё можно посчитать этой цепочкой

Та же схема подходит не только для адресов, но и для любого столбца с повторяющимися значениями.

  • Состояния сокетов: ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c даст число сокетов в каждом состоянии.
  • Порты назначения: из пятого столбца оставляют часть после последнего двоеточия и считают повторы, чтобы увидеть, к каким службам идёт трафик.
  • Соседи по сети: ip neigh | awk '{print $NF}' | sort | uniq -c сводит записи по состоянию, например REACHABLE или STALE.
  • Серверы в ответах dig: если команду запускали на несколько имён и собрали результат в файл, sort | uniq -c покажет, какие адреса повторяются.

Две типичные ошибки. Первая — забыть про заголовок: он попадёт в подсчёт как отдельное значение со счётчиком 1. Вторая — считать порты и адреса вместе: «198.51.100.7:443» и «198.51.100.7:52144» разные строки, и сводка по адресам распадётся. Поэтому перед группировкой оставляют только тот кусок строки, который действительно нужно сравнивать.

Как читать и сохранять результат

Команда uniq -c выравнивает счётчик пробелами слева, поэтому каждая строка результата начинается с нескольких пробелов, потом число, потом пробел и само значение. Для чтения глазами это удобно, а для дальнейшей обработки лучше помнить: поле с числом идёт первым, и awk '{print $1}' заберёт именно его, не обращая внимания на ведущие пробелы.

Если нужно поменять значение и число местами, например для таблицы, подойдёт awk '{print $2, $1}'. Для сохранения результата в файл добавьте перенаправление > имя_файла, а чтобы одновременно видеть вывод на экране, используйте tee, который разобран на отдельной странице раздела.

Когда строки с одинаковым счётчиком важно упорядочить по значению, сортируют по двум ключам: sort -k1,1nr -k2,2 делает первый ключ числовым по убыванию, а второй обычным по возрастанию. Подробности синтаксиса -k и влияние языковых настроек на порядок смотрите в справке sort.

Наконец, помните о границах метода. Он считает строки, а не объём трафика и не время соединений. Много строк с одним адресом говорит о числе записей, но не о том, сколько данных через них прошло.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно
sortuniqподсчётlinux

Часто задаваемые вопросы

Читайте также