open atlas
↑ К треку
Командная строка CLI · 03 · 04

Подсчёт и нарезка

wc считает строки, слова и байты; head и tail срезают первые или последние N строк; sort упорядочивает поток; uniq -c сворачивает последовательные дубликаты в счётчик. Вместе они образуют классический конвейер частотного анализа: sort | uniq -c | sort -rn | head.

CLI Junior ◷ 25 min
Уровень
ОсновыJuniorMiddleSenior

Теперь ты умеешь соединять команды конвейерами и фильтровать строки с помощью 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 для поиска наиболее частых элементов в любом потоке.

1

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.

2

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 записей
3

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” лексикографически.

4

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

Число дополняется пробелами слева по умолчанию. Формат: <счётчик> <значение>.

5

Классический конвейер частот: sort | uniq -c | sort -rn | head. Этот четырёхступенчатый шаблон находит наиболее распространённые элементы в любом потоке:

  1. sort — группировать одинаковые элементы вместе.
  2. uniq -c — подсчитать каждую группу.
  3. sort -rn — сортировать числово в обратном порядке (наибольший счётчик первым).
  4. 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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources5
expand
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05

Trademarks belong to their respective owners. Editorial reference only.