Скрипты и обработка логов
Unix-философия — маленькие программы, каждая делает одно дело, соединённые каналом (pipe). Конвейер awk | sort | uniq -c за одну строку извлекает поле, группирует его и считает — то, ради чего в другом языке пришлось бы писать цикл. Для дежурного инженера это первый инструмент разбора инцидента: лог на диске, терминал под рукой, ответ за секунды.
Тема собирает и теорию, и практику. Главная ловушка — uniq схлопывает только соседние дубликаты, поэтому без предшествующего sort он молча ошибается. Вторая — путаница в нумерации полей awk ($1, $2, кастомный -F), из-за чего конвейер выдаёт не тот столбец. Третья — алгоритмическая: когда лог огромен, полная сортировка избыточна, и top-K берут ограниченной кучей за O(N log K). Разбор — в слоях ниже.
Карта темы
- Конвейеры shell — как
|соединяет команды потоком и что вносятawk,sort,uniq. - Анализ логов — подсчёт уникальных значений и частот по полю лога через
awk | sort | uniq. - Чтение вывода конвейера — как по нумерации полей и разделителям предсказать, что напечатает многоступенчатый
awk. - Top-K частых значений — поиск K самых частых элементов за
O(N log K)ограниченной кучей вместо полной сортировки.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Применять uniq без предшествующего sort | Несоседние дубликаты выживают — счётчик неверен |
| Считать сырые строки вместо различных значений поля | wc -l даёт число строк, а не уникальных значений |
Извлекать не то поле в awk | Тихо считается не тот столбец ($1 vs $2) |
Думать, что -F: берёт часть после разделителя | awk -F: '{print $1}' берёт часть до первого разделителя |
| Забывать, что конвейер потоковый | Команды работают одновременно, а не через временный файл |
| Полностью сортировать все уникальные для top-K | O(U log U) там, где хватает O(N log K) кучей |
| Брать max-heap для top-K вместо min-heap | Вытесняется глобальный максимум, а не нужный наименьший из top-K |
Значение для собеседований
Эти задачи проверяют, думаете ли вы конвейером и понимаете ли, что именно делает каждый инструмент. Кандидат, который сходу пишет awk '{print $1}' log | sort -u | wc -l и объясняет, почему sort обязателен перед uniq, показывает рабочую беглость, а не заученный рецепт.
Что обычно проверяют:
- Роли
awk,sort,uniqпо отдельности и почемуuniqтребует сортировки. - Разбор конкретного конвейера по нумерации полей — что окажется на экране.
- Оценку сложности: где узкое место — сортировка
O(n log n). - Алгоритмический скачок для top-K — ограниченная куча вместо полной сортировки.
Типичный неверный ответ: «uniq уберёт все дубликаты сам». Нет — он схлопывает только соседние повторы, поэтому без sort результат неверен. И «для top-K отсортирую весь файл» — при K ≪ U это лишняя работа O(U log U) вместо O(N log K).