Как один глупый Bash-скрипт сэкономил нам 100 часов ручной работы
- воскресенье, 20 июля 2025 г. в 00:00:16
Есть некоторая ирония в том, как простые инструменты решают сложные задачи. Пока технические форумы гудят от обсуждений Kubernetes, пайплайнов машинного обучения и микросервисных архитектур, я хочу на минуту отвлечься и поговорить о чем-то до безобразия простом: Bash-скрипте. Не особенно изящном. Без функций. Без параметров. Без проверок корректности. Просто линейный, безжалостно прагматичный shell-скрипт, который за год сэкономил нам несколько недель работы.
Это история не о красоте кода, а об его полезности. Не о совершенстве, а о решении реальных проблем в условиях нехватки времени, терпения и мотивации команды. Если вы разработчик, системный администратор, специалист по данным или просто устали от рутинных задач — этот пост для вас.
Мы работали с партнёрской организацией, которая по историческим причинам настаивала на передаче данных в виде таблиц. И не одной чистой таблицы — сотен. Ежеквартально мы получали более 200 файлов от разных отделов. У каждого были свои особенности:
Заголовки колонок отличались: "Name", "First Name", "FName"
Форматы дат варьировались между американским (MM/DD/YYYY) и европейским (DD/MM/YYYY)
Форматы файлов: .xls
, .xlsx
, .csv
Иногда данные вообще присылались в теле письма
Наша задача заключалась в нормализации этих данных и импорте их в систему. Процесс включал в себя открытие каждого файла, проверку колонок, переименование заголовков, проверку форматов и ручное копирование данных в мастер-таблицу. Всё это занимало 4–6 рабочих дней каждый квартал.
После ещё одной бессмысленно потраченной пятницы, когда я вручную чистил кривые CSV-файлы, я не выдержал. Открыл терминал и ввёл nano normalize.sh
. Я не знал, как будет выглядеть этот скрипт, и, честно говоря, мне было всё равно. Мне просто хотелось хоть чего-то, что избавит меня от этой рутины.
Единственное требование: он должен работать. Даже если будет хрупким. Даже с жёстко зашитыми путями. Даже если он будет глупым. Боль бездействия была хуже, чем риск сделать неидеально.
Вот как выглядел самый первый вариант:
#!/bin/bash
INPUT_DIR="./raw_data"
OUTPUT_FILE="./merged/cleaned.csv"
# Start with header
echo "Name,Email,DOB" > $OUTPUT_FILE
for file in "$INPUT_DIR"/*; do
cat "$file" | \
grep -v -i "name\|first name\|fname" | \
sed 's/;/,/g' | \
awk -F',' '{print $1","$2","$3}' >> $OUTPUT_FILE
done
Что делал этот скрипт:
Открывал каждый файл из заданной папки
Удалял заголовки по типичным ключевым словам
Преобразовывал точки с запятой в запятые
Извлекал и выводил первые три столбца
Это было надёжно? Нет. Покрывало все случаи? Тоже нет. Но за считанные минуты мы получали пригодный для импорта CSV-файл. Это дало нам импульс.
Мы сразу заметили несколько плюсов:
Экономия времени: вместо 4–6 дней — менее часа
Стабильность: даже базовый скрипт действует одинаково каждый раз
Масштабируемость: новые файлы? Просто добавь и запусти снова
Повышение морального духа: команда могла тратить время на анализ данных, а не на копирование
Мы начали постепенно улучшать скрипт. Не переписывали его во фреймворк. Не делали микросервис. Просто добавляли нужные штуки:
Регулярки для нормализации форматов даты
Проверка и пропуск проблемных строк
Обработка ошибок при неудачной загрузке файла
Отправка email-уведомления через mailx
при завершении
Позже мы сделали обёртку, чтобы младшие специалисты могли запускать его одной командой.
Отличный вопрос. В итоге — да, мы перешли на них.
Но на старте Python был препятствием:
Требовалась изолированная среда
Нужно было настраивать зависимости и версии
Сложнее и дольше итерации
Люди, выполнявшие задачу, не были разработчиками
Bash был доступен, быстр в тестировании, уже установлен везде. Это оказалось важнее красоты. Со временем, когда процесс стабилизировался, мы переписали его на Python — с логированием, обработкой ошибок и тестами.
Но прорыв дал именно тот первый Bash-скрипт. Он доказал, что автоматизация возможна. И сэкономил нам недели работы, пока мы создавали замену.
Забудьте про тренды и холивары. Если вы можете автоматизировать задачу сегодня с помощью Bash — делайте это. Идеальный стек может так и не прийти.
Первая версия не обязана быть чистой. Даже хорошей. Главное — чтобы она уменьшала боль. Остальное можно доделать потом.
Мы не планировали строить пайплайн. Мы хотели перестать тратить пятницы на одно и то же. Это стало нашим ориентиром.
Для одноразовых скриптов, парсинга логов, работы с файлами и пайплайнов — Bash до сих пор один из самых эффективных инструментов. Он портативен, быстр и мощен в умелых руках.
Когда скрипт начали использовать другие, мы добавили простой README, структуру папок (raw_data/
, merged/
, logs/
) и понятные комментарии. Этого оказалось достаточно, чтобы превратить личную поделку в командный актив.
В итоге мы переписали скрипт в виде Python CLI с поддержкой:
Маппинга полей через YAML
Определения и нормализации форматов даты и телефонов
Логирования и итоговой статистики
Базового интерфейса для нетехнических сотрудников
Но до этого мы бы не дошли без скромного Bash-скрипта. Он визуализировал процесс, дал нам уверенность и поддержку команды.
Даже сейчас, в экстренных ситуациях или при одноразовых задачах, мы клонируем и используем именно его. Он стал нашим прототипом по умолчанию.
Индустрия обожает сложность — новые фреймворки, архитектуры, подходы. Но в реальных командах самые большие выигрыши приходят от беспощадно простых решений.
Этот Bash-скрипт не был умным, красивым или масштабируемым. Но он работал. А это, порой, важнее всего.
Если у вас есть задача, которая постоянно отнимает время — попробуйте сначала решить её глупо. Откройте терминал. Напишите самое простое решение. Доработаете позже. Главное — сделать это сегодня.
Вполне возможно, что именно этот "глупый" скрипт окажется самым умным вашим решением за год.