Логи и CSV это текст. Пока файл помещается в память, для вопросов вроде «сколько было ошибок», «какие города встречаются» и «замени старый адрес базы» не нужен ни Python, ни база. Достаточно трёх команд и конвейера.
Конвейер: главная идея терминала
Символ | передаёт вывод одной команды на вход другой. Каждая команда делает одну маленькую вещь, а цепочка решает задачу.
grep ERROR etl.log | wc -l # найти ошибки, посчитать строки
cut -d, -f3 users.csv | sort | uniq -c # третий столбец, отсортировать, посчитать повторыСимвол > перенаправляет вывод в файл, >> дописывает в конец.
grep ERROR etl.log > errors.txt
echo "проверено" >> notes.txtgrep: найти строки
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.
Практика
Лог ночного запуска и таблица пользователей. Разберитесь, что произошло.
- 1. Выведите все строки с ERROR из logs/etl.log
- 2. Посчитайте, сколько строк с ERROR, одной командой
- 3. Найдите строку про s3 и покажите её номер
- 4. Сохраните строки с ERROR в файл reports/errors.txt
- 5. Выведите список городов из users.csv без повторов
- 6. Командой awk выведите только имена (второй столбец) пользователей с планом pro
- 7. Командой sed замените db-1 на db-primary в логе и сохраните результат в logs/etl_fixed.log
Что запомнить
|соединяет команды,>пишет в файл. Это и есть «мышление конвейерами».grepищет,-cсчитает,-nпоказывает номера,-vисключает.cut,sort,uniq -cотвечают на вопрос «сколько каких значений».awkдля столбцов с условиями,sedдля замен.