Вы смотрите на файл журнала, содержащий 80 000 строк. Одна и та же ошибка повторяется 600 раз подряд. Команда grep выдает вам целую стену одинаковых результатов. Вам не нужно читать все 80 000 строк — вам нужно знать, какие ошибки произошли и сколько раз каждая из них появилась. Именно эту задачу решают sort и uniq, и большинство начинающих пользователей Linux не знают, что они работают вместе.
Что на самом деле делают sort и uniq
sort — это инструмент командной строки, который перегруппировывает строки текста в алфавитном или числовом порядке. По умолчанию он сортирует от A до Z. uniq — это команда, которая отфильтровывает дубликаты строк, но вот что застает новичков врасплох: uniq удаляет только дубликаты, расположенные рядом друг с другом. Если одна и та же строка появляется дважды, но между ними находятся другие строки, uniq её не обнаружит.
Вот почему почти всегда сначала запускают sort. Сортировка собирает все одинаковые строки вместе, чтобы uniq мог их объединить. Эти две команды — независимые инструменты, но они разработаны для работы в паре.
Основной паттерн — это (|), которая принимает вывод одной команды и передает его в качестве входа следующей:
sort filename.txt | uniq
Если вы хотите подсчитать, сколько раз появляется каждая уникальная строка, добавьте флаг -c (сокращение от count) к uniq:
sort filename.txt | uniq -c
Счет появляется в виде числа в начале каждой строки. Чем выше число, тем больше раз эта строка появлялась в исходном файле.
1. Найдите, какие IP-адреса атакуют ваш SSH-сервер
Неудачные попытки входа по SSH накапливаются в /var/log/auth.log на системах Debian и Ubuntu. Этот конвейер извлекает IP-адреса нарушителей и ранжирует их по частоте:
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn
grep "Failed password" фильтрует строки с неудачными попытками входа. awk '{print $11}' извлекает только 11-е поле из каждой строки, где находится IP-адрес в стандартном формате журнала аутентификации. sort -rn в конце сортирует (-n) в обратном порядке (-r), чтобы адреса с наибольшим количеством попыток отображались первыми.
218 203.0.113.45
142 192.168.1.105
87 10.0.0.22
9 198.51.100.4
Левая колонка — это количество неудачных попыток. Правая колонка — IP-адрес. Распространенной ошибкой здесь является пропуск последнего sort -rn — без него вывод сортируется по алфавиту, и вам придется самостоятельно выявлять наиболее активных нарушителей.
Пример 2: Сводка кодов статуса HTTP в журнале Nginx
Стандартный журнал доступа Nginx записывает один запрос в строку, при этом код статуса HTTP находится в 9-м поле, которое показывает, как ваш Сервер фактически реагирует на трафик:
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
Вывод:
8432 200
1201 404
312 301
89 500
14 403
200означает, что запрос прошел успешно.404означает, что страница не найдена.500означает, что ваш сервер выдал ошибку — если это число высокое, нужно обратить на это внимание.
Это быстрая проверка работоспособности, которая занимает 10 секунд и экономит часы чтения журналов. Если вы видите awk: cannot open /var/log/nginx/access.log, возможно, вам нужно запустить команду с sudo.
3: Удаление дубликатов строк из любого текстового файла
У команды sort есть флаг-ярлык -u (unique), который объединяет сортировку и удаление дубликатов в один шаг:
sort -u duplicates.txt
Если duplicates.txt содержал:
banana apple banana cherry apple
Вывод:
apple banana cherry
Каждая строка появляется ровно один раз, а вывод отсортирован по алфавиту. Это работает с любыми текстовыми файлами, а не только с логами. Самая распространённая ошибка новичков — ожидание, что исходный файл будет изменен — sort -u по умолчанию выводит результаты в Терминал.
Чтобы сохранить результат в новый файл, используйте.
sort -u duplicates.txt > cleaned.txt
4. Показать только повторяющиеся строки
Флаг -d в uniq показывает только строки, которые встречаются более одного раза, что является противоположностью удаления дубликатов:
sort access.log | uniq -d
Вывод:
GET /wp-login.php HTTP/1.1 GET /admin HTTP/1.1
Это полезно для выявления подозрительных повторяющихся запросов в веб-журналах или поиска вывода заданий cron, которые запускаются чаще, чем должны. Если ничего не выводится, все строки в вашем файле уникальны.
5. Сортировка и подсчёт ошибок в журнале пользовательского приложения
Допустим, ваше приложение записывает журнал, в котором каждая строка начинается с уровня ошибки, такого как ERROR, WARN или INFO. Вы хотите подсчитать, сколько ошибок каждого типа появилось сегодня:
grep "2025-04-18" /var/log/myapp.log | awk '{print $3}' | sort | uniq -c | sort -rn
Вывод:
512 ERROR
210 WARN
88 INFO
Настройте $3 в соответствии с тем полем, которое содержит уровень журнала в формате вашего приложения. Если вы не уверены, какой номер поля использовать, запустите, чтобы просмотреть первые несколько полей рядом:
awk '{print $1, $2, $3, $4}' yourfile.log | head -5
Самые полезные флаги sort и uniq
sort флагов, о которых стоит знать:
-r– изменить порядок (от Z до A или сначала самые большие числа).-n– сортировка по числу, а не по алфавиту (так что 10 идет после 9, а не после 1).-u– вывод только уникальных строк (объединяет sort и uniq в одном шаге).-k– сортировка по конкретному полю, например,-k2сортирует по второму столбцу.
uniq флагов, о которых стоит знать:
-c— добавляет в начало каждой строки количество вхождений.-d— выводит только дубликаты строк.-u— выводит только строки, встречающиеся ровно один раз (противоположность-d).-i— игнорировать регистр при сравнении строк.
Распространенные ошибки, которых следует избегать
Запуск uniq без предварительного запуска sort — самая частая ошибка. Если дубликаты строк не соседствуют, uniq полностью их пропускает, и ваш вывод по-прежнему содержит дубликаты. Всегда запускайте sort | uniq, а не только uniq.
Вторая распространённая ошибка — использование sort -n, когда первый столбец не является числом. Если в вашем файле перед числами стоит текст, алфавитная сортировка (sort -rn на выводе uniq -c через конвейер) работает правильно, поскольку uniq -c всегда доуполняет счет до фиксированной ширины, благодаря чему числовая сортировка работает как ожидается.
Заключение
Вы узнали, как sort и uniq работают вместе, чтобы превратить зашумленные файлы журналов в чистые, поддающиеся подсчёту сводки. sort группирует одинаковые строки рядом, uniq сворачивает или подсчитывает их, а флаги, такие как -c, -d, -u, -r и -n, позволяют задавать точные вопросы без написания скрипта.
Прямо сейчас выберите любой файл журнала в вашей системе, например /var/log/syslog, /var/log/dpkg.log или даже историю команд bash:
history | awk '{print $2}' | sort | uniq -c | sort -rn
и запустите по нему конвейер count. Вы сразу увидите закономерности, о которых раньше не подозревали.
Использовали ли вы sort и uniq для обнаружения чего-то неожиданного в журнале рабочей среды? Какая комбинация флагов оказалась для вас наиболее полезной?




Комментарии (0)