Как стать автором
Обновить

Комментарии 36

Плюсую.
Часто приходится обрабатывать таким образом значительные объёмы данных. Раньше загонял данные в SQL таблицы, строил индексы, писал заросы, экспортировал результат. Лет 7 назад открыл для себя возможность разгребать такие файлы при помощи unix команд. Результаты просто фантастические! Скорость обработки увеличилась даже не в разы — на порядки.
Эмм, а скорость «раскуривания» такого скрипта следующим админом (или Вами же, но через полгода-год) как изменилась?

Что мешает установить язык более высокого уровня (с IDE, отладчиком, автокомплитом, подсветкой синтаксиса и проверкой ошибок «на лету»)?

Нет, мы откроем ман в соседней консоли и будем отлаживать скрипт стопятьсотый раз прогоняя скрипт…
Если «админ» не знает текстовые утилиты unix он просто не компетентен.
Автор просто не напиасл самое важное, что выше приведенный скрипт будет работать десятилетиями и не требовать какого либо сопровождения, в отличии от писанины на «языке высокого уровня»
Автор просто не напиасл самое важное, что выше приведенный скрипт будет работать десятилетиями и не требовать какого либо сопровождения, в отличии от писанины на «языке высокого уровня»

А писанина на языке высокого уровня что? в 12 часов превратится в тыкву? :)

А вы помните все ключи для вызова read? А в мане за сколько найдете что делает ключ -r например?
И я молчу про постоянный эскейпинг кавычек, неявный субшел, башизмы и прочие IFS'ы.
Питон предпочтительнее везде, где bash переваливает на 10 строк.
Ну тогда я спокоен, у меня 9)
Да, последнее время занчительно больше делаю на Питоне: заимодействие с API, JSON, HTTP запросы. Но такого рода обработка файлов — это то, с чем башовые утилиты справляются значительно быстрее.
bash скрипт работает быстрее, чем python? Не верю (с)
bash скрипт работает быстрее, чем python? Не верю (с)

Ну собственно первая строка этого конкретного баш скрипта проходит по всем файлам и ищет там строки с "table". А вторая строка ещё раз проходит по тем же файлам и ищет в них же строки с "created_date". Эти данные записываются в файлы. И потом содержимое файлов джойнится.


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


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


Так что, если речь идёт именно о скорости работы программы, а не о скорости создания скрипта — правильно не верите :)

Как будто IDE, отладчик, автокомплик, подсветка синтаксиса и проверка ошибок на лету — это панацея и не придется раскуривать ни свою реализацию поиска по файлам, ни свою реализацию sed, ни кастомную грепалку…
Как будто IDE, отладчик, автокомплик, подсветка синтаксиса и проверка ошибок на лету — это панацея

Не панацея, но писать будет легче и быстрее.


и не придется раскуривать ни свою реализацию поиска по файлам

Это вы про поиск файлов, содержащия строку? Код будет тривиальным, раскуривать его не придётся.


ни свою реализацию sed

sed там в коде используется для того, чтобы делать замены в строках. Код ещё более тривиальный, чем поиск по файлам, там вообще даже думать не придётся, чтобы понять что происходит.


ни кастомную грепалку

grep используется либо для поиска файлов (см первый пункт), либо для отсева строк, что в языке программирования высокого уровня тоже очень просто.

Так и на баше не rocket science. Ну и по опыту, на баше такие штуки пишутся гораздо быстрее, получаются гораздо короче и оказываются гораздо более надежными. Меньше кода — меньше багов (с). Проще поставить пайп, чем написать лишний if или фильтр/замену по регекспу. Если брать support, то да, код write-only, но он таким и задумывался — решить задачу наименьшими силами и забить.
Так и на баше не rocket science.

Для баша нет IDE, которая тебе подскажет и поможет.


Ну и по опыту, на баше такие штуки пишутся гораздо быстрее, получаются гораздо короче и оказываются гораздо более надежными.

Из того, что есть в скриптах, навскидку какие-то трудности представляет только join, потому что его, возможно, в стандартной библиотеке не будет.


Если брать support, то да, код write-only, но он таким и задумывался

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

Для баша нет IDE, которая тебе подскажет и поможет.

для баша есть set -x. Для условных однострочников этого хватает за глаза. Люди, которые хотят рефакторинг и go-to-definition для скриптов на баше, явно делают что-то не так.
Люди, которые хотят рефакторинг и go-to-definition для скриптов на баше, явно делают что-то не так.

Ну да, используют баш там, где лучше использовать язык программирования высокого уровня.

Не, ну правда. Не нравится баш — не пишите. Не нравится читать код на баше — не читайте. Начальство заставляет — смените начальство. Как-то так.
Не, ну правда. Не нравится баш — не пишите.

Вопрос то вроде в том, что потом легче читать и модифицировать — баш или код на языке высокого уровня, а не в том, нравится мне писать на баше, или нет.

Вкратце ответ — кому как. Я напишу на баше и уволюсь, придете вы и скажете, что это все г**но и надо на питоне, перепишете на питоне, уволитесь, придет условный Ваня и скажет, что питон г**но и надо на баше, и так далее. И это — нормально.

Кто как хочет — тот так и доставляет себе радость и удовольствие.

Тем более задача — написать, чтоб работало сейчас — обычно более приоритетна надо задачей — чтобы было всем легко читать потом.
Вкратце ответ — кому как. Я напишу на баше и уволюсь, придете вы и скажете, что это все г**но и надо на питоне, перепишете на питоне, уволитесь, придет условный Ваня и скажет, что питон г**но и надо на баше, и так далее. И это — нормально.

Вы тут какое-то колесо сансары описали. Бессмысленный и беспощадный джаггернаут. Я против того, чтобы это было нормой :).


Кто как хочет — тот так и доставляет себе радость и удовольствие.

Спорить не буду, нередко решать проблему лучше не тем инструментом, который её лучше решает, а тем, которым ты лучше умеешь пользоваться. Особенно, когда надо сделать так, чтобы заработало прямо сейчас. Если бы в ветке не подняли вопрос поддерживаемости, в общем-то и разговора бы не было.


Хотя, пользуясь случаем, хочу сделать замечание статье. Стиль, используемый в скрипте — не SQL. SQL это декларативный язык, а тут функциональный конвейер.

Вот написал человек на Delphi программульку и слился. В свое время этот IDE был на вершине популярности. Прога была хороша, мы были рады до того момента, когда данных стало много и начались тормоза (что то не оптимально написал, не предвидел).

Купили крутую программку от уважаемой компании. Делает все, но чуточку не то что нужно. И сделать так как нам надо они немогут — навороты не позволяют. Вынуждены жрать кактус.

Так что скрипт на bash'е переживет все модные веяния. И понимающий unix команды всегда найдутся.
Вот написал человек на Delphi программульку и слился.

Я так понимаю проблема в том, что нет человека, который может поправить исходники и собрать код заново? Ну, то есть, надо было выбирать другй язык программирования?


Так что скрипт на bash'е переживет все модные веяния. И понимающий unix команды всегда найдутся.

Программа на java тоже переживёт. Да что там. Мне неприятно это говорить, но даже программа на Питоне будет жить ещё очень долго. Ну и работать не только там, где есть unix tools, конечно :)

Ну, то есть, надо было выбирать другой язык программирования?


В то время выбор Delphi был естественным. Сама программа 4 года радовала всех.

Мне неприятно это говорить, но даже программа на Питоне будет жить ещё очень долго.


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

Конечно, можно винить руки из ж, но в бизнесе чинить программы — муда. Инструменты должны работать незаметно и исправно.
В то время выбор Delphi был естественным.

Я не сомневаюсь.


Сама программа 4 года радовала всех.

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


А вот Питон — г… о.

Ну, я бы не был так категоричен. Тем не менее я его не люблю и именно поэтому мне неприятно говорить, что код на питоне — таки штука долговечная.


Постоянно имею проблемы с прогами на питоне.

Сочувствую. У меня немного обратная ситуация — я их писать не люблю. Но питон однозначно лучше баша.

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


Для компании несвязанной с IT найти нужного программиста задача нетривиальная, точнее — лотерея. И в это далекое время мы не знали слова «freelance». Оглядываясь назад, мы многое могли сделать лучше. Был бы тогда теперешний опыт…
НЛО прилетело и опубликовало эту надпись здесь
Вообще, это скорее повод следующему админу таки раскурить баш. А то мало ли, вдруг воинствующий джавист придет сопроводжать. Давайте для него версию на java напишем, с GOF-ом и интерфейсами.

А можно попросить у вас какие-нибудь живые данные? Что там в этих файликах, на которых скрипты бегают?

Данные-то дать могу, но вот Hive-кластер, который в статье упоминается, вам самому поднимать приедтся

Как я понимаю, от кластера там только xargs -n1 -I dr hdfs dfs -ls dr . Это можно и чем-нибудь другим подменить для целей тестирования.

Вместо sed 's/:/ /g' | awk '{print $1 " " $3}' можно использовать awk -F: '{print $1 " " $3}'
Конструкция упростится и станет более читабельной
Да, можно. Спасибо, как-то сразу не догадался)
Вот эту конструкцию тоже можно заменить для читабельности:
sed 's/[\r\n",:]//g'
на
tr -d '\r",:'

Зачем у вас идёт замена переноса строки (\n)?
Во-первых, сэд её так не сможет заменить — надо считать хотя бы две строки для этого (link).
Во-вторых, если это удастся сделать (тем же tr), то у вас будет всё в одну строку, что нарушит дальнейшую логику.
jq для работы с JSON не пробовали?
Посмотрел. Не сильно код укорачивает, если честно) Задача для него слишком примитивна

Хотя и сам не прочь крутить подобные портянки, хочу предупредить читателей, этот код — не пример для подражания. Выход за границу 80 символов — сама по себе проблема, и если скрипт "причесать" до читаемого состояния, то в нём будет уже не 9, а без малого сотня строк. И гарантировать, что этот скрипт не развалится от случайно затесавшегося неформатного файлика, в отличие от настоящего парсера, невозможно. А когда он развалится, отладка превратится в ад (если этот факт вообще кто-то заметит).


Также для уменьшения времени работы, количества временных файлов да и просто вероятных ошибок, в Bash есть замечательная конструкция:


while read -r line; do
  echo $((line**2))
done < <(seq 123)

В отличие от command | while ...do ... done она не создаёт новый сабшелл и позволяет избежать ошибок, связанных с потерей переменных.

cut -f 1,3 -d ':' вместо sed 's/:/ /g' | awk '{print $1 " " $3}'
не работает?
А sed 's#\(.*\):.*:\(.*\)#\1 \2#g'?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации