DEdeshka
ВойтиРегистрация
Урок 2.4 · 30 мин · текст

grep, awk, sed: найти и посчитать

Три инструмента, которые закрывают 80% вопросов «что в этом логе».

Логи и CSV это текст. Пока файл помещается в память, для вопросов вроде «сколько было ошибок», «какие города встречаются» и «замени старый адрес базы» не нужен ни Python, ни база. Достаточно трёх команд и конвейера.

Конвейер: главная идея терминала

Символ | передаёт вывод одной команды на вход другой. Каждая команда делает одну маленькую вещь, а цепочка решает задачу.

grep ERROR etl.log | wc -l          # найти ошибки, посчитать строки
cut -d, -f3 users.csv | sort | uniq -c   # третий столбец, отсортировать, посчитать повторы

Символ > перенаправляет вывод в файл, >> дописывает в конец.

grep ERROR etl.log > errors.txt
echo "проверено" >> notes.txt

grep: найти строки

grep ERROR etl.log          # строки, где есть ERROR
grep -i error etl.log       # без учёта регистра
grep -n timeout etl.log     # с номерами строк
grep -c ERROR etl.log       # только количество
grep -v INFO etl.log        # всё, кроме INFO
grep -r "select" sql/       # по всем файлам в папке
grep -E "ERROR|WARN" etl.log   # регулярное выражение

Регулярные выражения это отдельная тема, но три конструкции стоит знать сразу: ^ начало строки, $ конец, .* что угодно. grep "^2026-09-12 10:00" etl.log находит записи за конкретную минуту.

cut, sort, uniq: столбцы и подсчёты

Для CSV с простыми разделителями cut вырезает столбец, sort сортирует, uniq схлопывает соседние повторы, и с флагом -c считает их.

cut -d, -f3 users.csv                 # третий столбец
cut -d, -f3 users.csv | sort | uniq -c   # сколько раз встречается каждый город
sort -t, -k3 users.csv                # отсортировать строки по третьему столбцу

uniq работает только на отсортированном вводе: повторы должны стоять рядом.

awk: столбцы с логикой

awk читает строку, режет её на поля и даёт к ним доступ как $1, $2. По умолчанию разделитель пробел, для CSV задают -F,.

awk -F, '{print $2}' users.csv            # второй столбец
awk -F, '/pro/ {print $2}' users.csv      # только строки, где есть pro
awk '{print $4}' etl.log                  # четвёртое слово в логе

Настоящий awk умеет условия, суммы и переменные, это мини-язык. В учебном терминале ниже реализована только форма «шаблон и print», но именно она покрывает большинство повседневных задач.

sed: заменить

sed 's/db-1/db-primary/g' etl.log          # заменить во всём выводе
sed 's/db-1/db-primary/g' etl.log > etl_fixed.log

Формат s/что/на что/g, где g значит «все вхождения в строке», а не только первое. Флаг -i в настоящем sed меняет файл на месте, с ним аккуратнее: сначала посмотрите результат без -i.

Практика

Лог ночного запуска и таблица пользователей. Разберитесь, что произошло.

учебный терминалзадания 0 / 7
Введите команду. Подсказка: help покажет, что умеет этот терминал.
de@deshka:~/project$
ЗАДАНИЯ
  1. 1. Выведите все строки с ERROR из logs/etl.log
  2. 2. Посчитайте, сколько строк с ERROR, одной командой
  3. 3. Найдите строку про s3 и покажите её номер
  4. 4. Сохраните строки с ERROR в файл reports/errors.txt
  5. 5. Выведите список городов из users.csv без повторов
  6. 6. Командой awk выведите только имена (второй столбец) пользователей с планом pro
  7. 7. Командой sed замените db-1 на db-primary в логе и сохраните результат в logs/etl_fixed.log
решённые задания сохранятся в прогресс после входа

Что запомнить

  • | соединяет команды, > пишет в файл. Это и есть «мышление конвейерами».
  • grep ищет, -c считает, -n показывает номера, -v исключает.
  • cut, sort, uniq -c отвечают на вопрос «сколько каких значений».
  • awk для столбцов с условиями, sed для замен.