Конвейеры
Почти любой вопрос к логу сводится к одной из трёх операций: посчитать частоты, просуммировать поле, отобрать строки по условию. Дальше — комбинации.
Частоты
Базовый счётчик
Идиома, которую стоит помнить наизусть: выбрать поле, отсортировать, схлопнуть с подсчётом, отсортировать по числу.
Порядок важен. uniq схлопывает только соседние одинаковые строки, поэтому sort перед ним обязателен.
Распределение кодов ответа
Запросы по минутам
Вырезаем из поля времени нужную длину. У nginx поле $4 выглядит как [30/Aug/2026:09:14:02, поэтому начинаем со второго символа.
Суммы и средние
Сколько отдали трафика
Десятое поле — размер ответа в байтах.
Среднее время ответа по URL
Ассоциативные массивы в awk — то, ради чего его стоит знать дальше print $1.
$NF — последнее поле строки, каким бы по счёту оно ни было. Удобно, когда формат лога плавает.
Поля и куски
cut, когда разделитель постоянный
Быстрее awk и короче пишется, но не умеет схлопывать повторяющиеся разделители.
Диапазон строк
sed -n с диапазоном печатает строки с 1000-й по 1050-ю и останавливается, если добавить q.
Выровнять в таблицу
Финальный штрих, когда вывод нужно показать человеку.
Параллель
Обработать много файлов сразу
-P задаёт число параллельных процессов, -I{} — плейсхолдер для имени.
Имена с пробелами
Обычный xargs ломается на пробелах и переносах в именах. Связка -print0 и -0 передаёт имена через нулевой байт.
Что сохраняет вечера
Строгий режим
pipefail — главное здесь. По умолчанию код возврата конвейера равен коду последней команды. cat missing.log | wc -l печатает ноль и рапортует об успехе, а скрипт спокойно идёт дальше с пустыми данными.
Временный файл, который сам уберётся
trap на EXIT срабатывает и при нормальном завершении, и при ошибке под set -e.
Подстановка процесса
Сравнить вывод двух команд без временных файлов.
Значение переменной по динамически собранному имени
Косвенное раскрытие через ${!name}. Пригождается, когда список параметров приходит извне.