habrahabr

Как один глупый Bash-скрипт сэкономил нам 100 часов ручной работы

  • воскресенье, 20 июля 2025 г. в 00:00:16
https://habr.com/ru/articles/929024/

Есть некоторая ирония в том, как простые инструменты решают сложные задачи. Пока технические форумы гудят от обсуждений 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 или Pandas?

Отличный вопрос. В итоге — да, мы перешли на них.

Но на старте Python был препятствием:

  • Требовалась изолированная среда

  • Нужно было настраивать зависимости и версии

  • Сложнее и дольше итерации

  • Люди, выполнявшие задачу, не были разработчиками

Bash был доступен, быстр в тестировании, уже установлен везде. Это оказалось важнее красоты. Со временем, когда процесс стабилизировался, мы переписали его на Python — с логированием, обработкой ошибок и тестами.

Но прорыв дал именно тот первый Bash-скрипт. Он доказал, что автоматизация возможна. И сэкономил нам недели работы, пока мы создавали замену.

Чему мы научились

1. Лучший инструмент — тот, который ты будешь использовать

Забудьте про тренды и холивары. Если вы можете автоматизировать задачу сегодня с помощью Bash — делайте это. Идеальный стек может так и не прийти.

2. Не бойтесь несовершенства

Первая версия не обязана быть чистой. Даже хорошей. Главное — чтобы она уменьшала боль. Остальное можно доделать потом.

3. Решайте свои проблемы, а не абстрактные задачи

Мы не планировали строить пайплайн. Мы хотели перестать тратить пятницы на одно и то же. Это стало нашим ориентиром.

4. Bash недооценён

Для одноразовых скриптов, парсинга логов, работы с файлами и пайплайнов — Bash до сих пор один из самых эффективных инструментов. Он портативен, быстр и мощен в умелых руках.

5. Документация — это важно

Когда скрипт начали использовать другие, мы добавили простой README, структуру папок (raw_data/, merged/, logs/) и понятные комментарии. Этого оказалось достаточно, чтобы превратить личную поделку в командный актив.

Что было дальше

В итоге мы переписали скрипт в виде Python CLI с поддержкой:

  • Маппинга полей через YAML

  • Определения и нормализации форматов даты и телефонов

  • Логирования и итоговой статистики

  • Базового интерфейса для нетехнических сотрудников

Но до этого мы бы не дошли без скромного Bash-скрипта. Он визуализировал процесс, дал нам уверенность и поддержку команды.

Даже сейчас, в экстренных ситуациях или при одноразовых задачах, мы клонируем и используем именно его. Он стал нашим прототипом по умолчанию.

Заключение

Индустрия обожает сложность — новые фреймворки, архитектуры, подходы. Но в реальных командах самые большие выигрыши приходят от беспощадно простых решений.

Этот Bash-скрипт не был умным, красивым или масштабируемым. Но он работал. А это, порой, важнее всего.

Если у вас есть задача, которая постоянно отнимает время — попробуйте сначала решить её глупо. Откройте терминал. Напишите самое простое решение. Доработаете позже. Главное — сделать это сегодня.

Вполне возможно, что именно этот "глупый" скрипт окажется самым умным вашим решением за год.