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

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

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

Комментарии (11)


  1. FabrLik
    18.07.2025 15:28

    Интересная статья :)

    В свое время схожим образом автоматизировал через VBA-скрипты, когда множество отделов присылали разнородные данные, которые требовалось нормализовать.

    Самое сложное из практики не автоматизировать, а не повредить данные.
    Как с этим боролись? :)


  1. mSnus
    18.07.2025 15:28

    Читать было приятно, но не могу отделаться от ощущения, что это либо перевод, либо AI-слоп


  1. Politura
    18.07.2025 15:28

    Наша задача заключалась в нормализации этих данных и импорте их в систему. Процесс включал в себя открытие каждого файла, проверку колонок, переименование заголовков, проверку форматов и ручное копирование данных в мастер-таблицу. Всё это занимало 4–6 рабочих дней каждый квартал.

    В далеких 90-х и нулевых, когда фразы, типа "тыж программист? принтер чтото не печатает" и "кажется у меня в компьютере микроб, дискетки долго читает" были совсем не редки, и то, юзеры маленьких компаний, которым повезло иметь в штате админа, знали к кому бежать для автоматизации подобной рутины, а уж сами айтишники на нудятину вроде вручную загловки править, или чтоб внутри табличек данные нормализовать (например, из сумм убирать окончания вроде "р." если таковые встречаются), больше 15 минут не тратили, т.к. становилось понятно, что лучше один раз процесс автоматизировать и потом всегда эту автоматизацию использовать.

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


  1. economist75
    18.07.2025 15:28

    nano + bash намного сложнее чем python + pandas + jupyterlab с авто дополнением и подсказками. Примерно как 10:1. Хорошо что не стали задерживаться на неудобном решении.

    На pandas реально в 20 строк кода уместить весь пайплайн из статьи. При этом 15 строк даст любой AI- помогатор или беглый гуглеж/чтение примеров из документации.

    Одно только экранирование кавычек в bash bat ps скриптах может легко удвоить время кодинга.


    1. D_Dementy
      18.07.2025 15:28

      да, ну.. кавычки - наше всё. двойные, одинарный, "обратные" - это уже на автомате. все эти qw //, qr //, qq //... один раз разобрался и не соскочишь уже


  1. axmed2004
    18.07.2025 15:28

    Я когда-то работая в детском стационаре, став заведующим столкнулся с месячными отчётами, которые в тот момент выглядели как ручное подсчитывание по журналу множества показателей. С отчетом за один месяц ещё можно было управиться за один вечер, но когда подошел срок квартального, начался ад. Со старшей медсестрой чуть не поругались. Нужно было много чего соединять, пересчитывать. В общем дал себе слово к следующему отчёту написать программу. Из прикладных более менее знал C#, базу данных выбрал ms access, т.к. и доступ удобный оказался, и поиск по русским символам работал. За месяц примерно допилил.

    Медсестры которые раньше занимались этой каторгой готовы были расцеловать меня. Другие заведующие смотрели с завистью как я составляю полугодовой отчёт за 3 секунды. Но перейти на мою методику чё то не осилили. Так что внедряйте полезный софт, товарищи


  1. LexD1
    18.07.2025 15:28

    Ад ручной обработки данных

    Да уж, доводилось заниматься.

    Bash недооценён

    А то.

    "глупый" скрипт

    Ежели работает, чего ж он "глупый"?


  1. x2v0
    18.07.2025 15:28

    Последнее время обязательно перегоняю bash скрипы через DeepSeek.

    Он отлично добавляет необходимые проверки и прочие вещи, которые самому лень делать.
    Вот, например, что-то порядка 200 баш скриптов прогнанных через DeepSeek.
    Пришлось полу-автоматизировать эту процедуру.
    https://github.com/x2v0/lfspd/


  1. Dusty77
    18.07.2025 15:28

    Если б я в своё время не додумался до автоматизации скриптами. Я бы точно работал на другой работе.


  1. aik
    18.07.2025 15:28

    Сенсация! Программист додумался написать скрипт! Срочно в номер! :)


  1. Moog_Prodigy
    18.07.2025 15:28

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

    Ничего не напоминает, как сейчас на ИИ все взвалить хотят задешево? А поставщики ИИ взяли и взвинтили цены. Хехе. Ну и правильно.