Подсчёт и нарезка
wc считает строки, слова и байты; head и tail срезают первые или последние N строк; sort упорядочивает поток; uniq -c сворачивает последовательные дубликаты в счётчик. Вместе они образуют классический конвейер частотного анализа: sort | uniq -c | sort -rn | head.
Теперь ты умеешь соединять команды конвейерами и фильтровать строки с помощью grep. Но что делать, когда нужно посчитать что-то, взять только первые десять строк вывода или найти, какие слова чаще всего встречаются в лог-файле? Небольшой набор составных инструментов справляется со всем этим: wc, head, tail, sort и uniq. Объединённые в конвейер, эти пять команд могут отвечать на вопросы о любом текстовом потоке — от «сколько ошибок в этом логе?» до «каковы топ-10 IP-адресов, обращающихся к этому серверу?»
К концу урока ты сможешь использовать каждый инструмент по отдельности и объединять их в классический конвейер частотного анализа.
После этого урока ты сможешь использовать wc -l для подсчёта строк, head -n N и tail -n N для нарезки вывода, sort для упорядочивания потока, uniq -c для подсчёта последовательных дубликатов и составлять sort | uniq -c | sort -rn | head для поиска наиболее частых элементов в любом потоке.
wc считает строки, слова и байты. Название расшифровывается как «word count» (подсчёт слов), но считает больше, чем слова.
wc /etc/passwdВывод:
45 90 2751 /etc/passwdТри числа: количество строк, слов, байт. Флаги позволяют выбрать одно:
wc -l /etc/passwd # только количество строк
wc -w /etc/passwd # только количество слов
wc -c /etc/passwd # только количество байтwc -l на сегодняшний день наиболее распространён: «сколько строк это производит?»
ls /etc | wc -lПодсчитать количество записей в /etc.
head и tail срезают первые или последние N строк. По умолчанию оба показывают 10 строк. Используй -n N для изменения количества.
head -n 5 /etc/passwd # первые 5 строк
tail -n 5 /etc/passwd # последние 5 строкtail -f следует за файлом по мере его роста — незаменим для просмотра логов в реальном времени:
tail -f /var/log/syslogНовые строки появляются по мере добавления. Нажми Ctrl+C для остановки.
Оба инструмента работают с конвейерами:
ls /etc | head -n 10 # первые 10 записей
ls /etc | tail -n 10 # последние 10 записейsort упорядочивает строки по алфавиту по умолчанию. Он читает весь ввод, сортирует его, затем выводит. Ключевые флаги:
-r— обратный порядок (Я→А, или наибольшее→наименьшее с-n)-n— числовая сортировка (чтобы “10” шёл после “9”, а не перед “2”)-k N— сортировка по полю N (разбиение по пробелам)-u— уникальный: выводить каждое значение только один раз (какsort | uniq)
ls /etc | sort # по алфавиту
ls /etc | sort -r # в обратном алфавитном порядке
cat numbers.txt | sort -n # в числовом порядкеsort -n критически важен, когда хочешь ранжировать по счётчику: без него “10” сортировался бы перед “2”, потому что “1” < “2” лексикографически.
uniq -c сворачивает последовательные одинаковые строки в одну с префиксом — счётчиком. Ключевое слово — последовательные: uniq обнаруживает только соседние дубликаты. Вот почему сначала должен идти sort: он сводит все одинаковые строки вместе, чтобы uniq мог их посчитать.
printf 'apple\nbanana\napple\ncherry\nbanana\napple\n' | sort | uniq -cПосле сортировки поток: apple apple apple banana banana cherry.
Вывод uniq -c:
3 apple
2 banana
1 cherryЧисло дополняется пробелами слева по умолчанию. Формат: <счётчик> <значение>.
Классический конвейер частот: sort | uniq -c | sort -rn | head. Этот четырёхступенчатый шаблон находит наиболее распространённые элементы в любом потоке:
sort— группировать одинаковые элементы вместе.uniq -c— подсчитать каждую группу.sort -rn— сортировать числово в обратном порядке (наибольший счётчик первым).head -n 10— взять топ-10.
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 10Это извлекает поле IP (поле 1 в логах nginx), подсчитывает появления каждого IP и показывает топ-10 — клиентов, делающих больше всего запросов. Тот же четырёхступенчатый шаблон работает с любым текстом: HTTP-коды состояния, user agents, сообщения об ошибках, авторы git-коммитов и т.д.
Найти наиболее частые HTTP-коды состояния в логе веб-сервера.
Логи доступа Nginx содержат код состояния в поле 9 (в формате combined log). Извлеки его и запусти конвейер частот:
awk '{print $9}' /var/log/nginx/access.log \
| sort \
| uniq -c \
| sort -rn \
| head -n 5Типичный вывод:
52341 200
3201 304
891 404
102 301
18 500С первого взгляда: 52 тысячи успешных ответов, 3 тысячи не-изменённых, 891 не найдено, 18 ошибок сервера. Весь анализ выполняется за несколько секунд на многогигабайтном лог-файле, потому что конвейер потоковый — он никогда не загружает весь файл в память сразу.
Теперь подсчитай строки в логе до и после фильтрации:
wc -l /var/log/nginx/access.log
grep ' 500 ' /var/log/nginx/access.log | wc -lДва числа: всего запросов и сколько из них — ошибки сервера. Отношение — это доля ошибок.
▸Почему это работает
На macOS sort — это BSD sort, а uniq — BSD uniq. Они принимают те же флаги (-r, -n, -k, -c), что и их GNU-аналоги. Одно тонкое отличие: BSD sort -k разбивает по пробелам включая ведущие пробелы, тогда как GNU sort иногда иначе обрабатывает граничные случаи. Для шаблона sort | uniq -c | sort -rn | head практической разницы нет — он работает идентично на Linux и macOS.
▸Частая ошибка
Запуск uniq -c без предварительного sort — самая распространённая ошибка с этим конвейером. uniq сворачивает только соседние дублирующиеся строки. Если ввод не отсортирован, одинаковые элементы, разбросанные по потоку, будут отображаться как отдельные записи со счётчиком 1, вместо объединения. Всегда: sort | uniq -c, никогда не uniq -c для несортированных данных.
Ты запускаешь: cat words.txt | sort | uniq -c | sort -rn | head -n 3. Что делает sort -rn в этом конвейере?
wc -l считает строки в потоке. head -n N и tail -n N срезают первые или последние N строк. sort упорядочивает поток; sort -rn сортирует числово в порядке убывания. uniq -c считает последовательные одинаковые строки — всегда пропускай через sort сначала. Четырёхступенчатый шаблон sort | uniq -c | sort -rn | head находит наиболее частые элементы в любом текстовом потоке и является одним из наиболее полезных идиом оболочки, которые ты будешь использовать как инженер. Работает на лог-файлах, истории git, HTTP-кодах состояния или любых данных, ориентированных на строки.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.