Каковы различия между Perl, Python, AWK и sed? [закрыто]

просто хочу узнать в чем основные различия между ними? и сила каждого языка (где это лучше использовать).

Изменить: это не «против» как тема, просто информация.

14.12.2008 21:00:04
Этот тип так называемых неконструктивных вопросов действительно полезен.
Steam 15.08.2013 00:47:09
Конечно, вкладка на первой странице, чтобы найти их, была бы удобна ...
user1115652 30.11.2013 15:08:06
Для полезности Python в командной строке, см. Pyp
Neil McGuigan 6.07.2016 21:26:05
5 ОТВЕТОВ
РЕШЕНИЕ

В порядке появления, эти языки sed, awk, perl, python.

sedПрограмма потоковый редактор и предназначена для применения действий от сценария к каждой строке (или, в более общем плане , в определенные диапазоны строк) входной файл или файлы. Его язык основан на edредакторе Unix, и хотя он имеет условные выражения и так далее, с ним трудно работать для сложных задач. Вы можете творить небольшие чудеса с этим - но за счет волос на голове. Тем не менее, это, вероятно, самая быстрая из программ при выполнении задач в пределах своей компетенции. (Он имеет наименее мощные регулярные выражения из обсуждаемых программ - подходит для многих целей, но, конечно, не для PCRE - Perl-совместимые регулярные выражения)

awkПрограмма (название от инициалов ее авторов - Ахо, Вайнбергер и Керниган) является инструментом , первоначально для форматирования отчетов. Это может быть использовано как супепедед sed; в более поздних версиях он завершен в вычислительном отношении. В ней используется интересная идея - программа основана на «сопоставленных шаблонах» и «действиях, выполняемых при совпадении шаблонов». Шаблоны довольно мощные (расширенные регулярные выражения). Язык действий аналогичен C. Одна из ключевых особенностей awkсостоит в том, что он автоматически разбивает входные данные на записи, а каждую запись - на поля.

Perl был написан частично как awk-killer и sed-killer. Две из программ, поставляемых с ним, предназначены a2pи s2pдля конвертации awkскриптов и sedскриптов в Perl. Perl - один из самых ранних языков сценариев следующего поколения (Tcl / Tk, вероятно, может претендовать на первенство). Он имеет мощную интегрированную обработку регулярных выражений с гораздо более мощным языком. Он обеспечивает доступ практически ко всем системным вызовам и обладает расширяемостью модулей CPAN. (Ни расширяемый, awkни sedрасширяемый.) Один из девизов Perl - «TMTOWTDI - есть несколько способов сделать это» (произносится как «тим-тоади»). В Perl есть «объекты», но это скорее дополнение, чем фундаментальная часть языка.

Python был написан последним, и, вероятно, частично как реакция на Perl. У этого есть некоторые интересные синтаксические идеи (отступ для обозначения уровней - без скобок или эквивалентов). Он более объектно-ориентирован, чем Perl; это так же расширяемо, как Perl.

ОК - когда использовать каждый?

  • Sed - когда вам нужно сделать простые преобразования текста в файлах.
  • Awk - когда вам нужно только простое форматирование и суммирование или преобразование данных.
  • Perl - практически для любой задачи, но особенно, когда задача требует сложных регулярных выражений.
  • Python - для тех же задач, для которых вы могли бы использовать Perl.

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

(Обратите внимание, что «обзоры» Perl и Python, в частности, крайне неполны; по этой теме могут быть написаны целые книги.)

548
22.10.2019 12:05:43
A ++++ пост, буду читать снова!
Robert Gamble 14.12.2008 21:38:52
потрясающе особенно "когда использовать каждую" часть
Khaled Al Hourani 14.12.2008 21:45:49
Обратите внимание, что дзен питона - это в основном антитеза TMTOWTDI, поэтому я бы сказал, что это может быть реакцией на perl. iirc TCL был немного позже perl и также довольно реакционен по отношению к perl, хотя реакция TCL заключается в синтаксисе и сложности языка, а не в способах выполнения задач
jk. 13.04.2010 13:42:22
Какими бы ни были первоначальные намерения, ясно, что более поздняя разработка Python и сообщество Python предпочли удобочитаемость и согласованность по сравнению с более гибким, но лаконичным синтаксисом Perl. Отличный пост Джонатан
Martin Beckett 25.05.2010 14:59:20
@blasto: Для ETL, я бы приоритет awkнад sedдля обучения (хотя и до сих пор их использование). Что касается размера задачи: sedэто самое лучшее, когда он обрабатывает одну строку за раз, без хранения от строки к строке. awkчасто используется для создания ассоциативных массивов с данными, собранными из всех источников; он использует больше памяти и, следовательно, с большей вероятностью столкнется с проблемами с большими наборами данных, чем sedесть. Я не слышал, tsawkпрежде чем вы связались с этим. Я склонен прибегать к Perl (но вы можете сделать лучше с Python), когда задача слишком сложна awk.
Jonathan Leffler 20.08.2013 20:11:38

Я бы не назвал sed полноценным языком программирования, это потоковый редактор с языковыми конструкциями, предназначенными для программного редактирования текстовых файлов.

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

Perl и Python - полноценные языки программирования общего назначения. Perl имеет свои корни в обработке текста и имеет ряд конструкций, похожих на awk (в сети есть даже скрипт awk-to-perl). Между Perl и Python есть много отличий, и вам лучше всего прочитать сводку обоих языков в Wikipedia, чтобы понять, что они из себя представляют.

21
14.12.2008 21:18:47
Я видел в Sed реализацию Sokoban, которая подразумевала бы полноту Тьюринга. Однако это также можно сказать о sendmail.cf и TeX.
ConcernedOfTunbridgeWells 14.12.2008 23:30:31
Однажды я работал с парнем, который написал PostScript, чтобы превратить лазерный принтер в маршрутизатор.
Sam Kington 15.12.2008 04:09:51
@ Сэм: Вау! Я не знал, что лазер принтера может быть запущен достаточно, чтобы резать дерево! Ой, прости, неправильный вид роутера.
Paused until further notice. 20.02.2010 04:17:21
седь, а не полноценный язык? Ну, это не совсем верно, так как sed завершается ;)
bernard paulus 20.02.2013 23:05:54
Я видел реализацию четвертого языка в awk. (Так как awk можно рассматривать как синтаксический анализатор сам по себе, довольно просто реализовать в нем интерпретатор).
Tatjana Heuser 11.10.2014 22:15:19

Во-первых, в списке есть две несвязанные вещи: «Perl, Python awk и sed».

Дело 1 - упрощенные инструменты манипулирования текстом.

  • СЭД. Он имеет фиксированный, относительно простой объем работ, определенный идеей чтения и изучения каждой строки файла. sed не предназначен для того, чтобы быть особенно читабельным. Он разработан, чтобы быть очень маленьким и очень эффективным на очень маленьких Unix-серверах.

  • AWK. Он имеет чуть менее фиксированный, менее простой объем работ. Однако основной цикл awk-программы определяется неявным чтением строк исходного файла.

Это не «полные» языки программирования. Хотя вы можете - с некоторой работой - писать довольно сложные программы на awk, они быстро становятся сложными и трудными для чтения.

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

  • Perl.

  • Python.

Когда их использовать.

  • СЭД. Никогда. Это действительно не имеет никакого значения в современную эпоху компьютеров с более чем 32 КБ памяти. Perl или Python делают то же самое более четко.

  • AWK. Никогда. Как и sed, он отражает более раннюю эру вычислений. Вместо того, чтобы поддерживать этот язык (в дополнение ко всем остальным, необходимым для успешной системы), более приятно просто делать все на одном приятном языке.

  • Perl. Любая проблема программирования любого рода. Если вам нравится свободно мысливающий синтаксис, когда существует множество способов сделать то же самое, Perl - это весело.

  • Python. Любая проблема программирования любого рода. Если вам нравится довольно ограниченный синтаксис, где меньше вариантов, меньше тонкости и (возможно) больше ясности. Объектно-ориентированная природа Python делает его более подходящим для больших и сложных задач.

Предыстория - я не ругаю седь и ака из невежества. Я выучил awk более 20 лет назад. Сделал много вещей с этим; раньше преподавал его как основной навык Unix. Я изучил Perl около 15 лет назад. Сделал много сложных вещей с этим. Я оставил оба, потому что я могу делать то же самое в Python - и это проще и понятнее.

Есть две серьезные проблемы с sed и awk, ни одна из которых не имеет возраста.

  1. Незавершенность их реализации. Все, что можно сделать с помощью sed и awk, можно сделать на Python или Perl, часто более просто, а иногда и быстрее. У конвейера оболочки есть некоторые преимущества производительности из-за его мультиобработки. Python предлагает subprocessмодуль, позволяющий мне восстановить эти преимущества.

  2. Необходимость выучить еще один язык. Делая вещи в Python (или Perl), ваша реализация зависит от меньшего количества языков, что приводит к увеличению ясности.

19
31.12.2008 08:02:09
Несколько довольно глупых аргументов против awk / sed. Разводной ключ не вытеснил открытый гаечный ключ по той же причине, что и SED, и WKK все еще отправляют. Иногда простой инструмент является лучшим для работы. Я пишу много Perl, но для простой цепочки команд по конвейеру, awk / sed быстрее, чем perl -e
RET 14.12.2008 23:19:39
Вы не можете предполагать наличие чего-либо, кроме sh, sed и awk в большинстве не-linux unix систем. Если вы хотите, чтобы что-то работало на готовой установке Solaris, HP / UX или AIX, вы застряли с sed и awk.
ConcernedOfTunbridgeWells 14.12.2008 23:32:50
Половина моих сценариев оболочки использует либо sed, либо awk. Они далеко не мертвы. Python - мой любимый язык сценариев, но иногда sed и awk - лучший инструмент для работы. То, что они используются уже много лет, не означает, что они устарели.
Jeremy Cantrell 15.12.2008 04:01:46
@ S.Lott: Я не предлагаю, чтобы кто-то пытался создать веб-приложение в awk, но сказать, что их никогда не следует использовать, немного возмутительно. Для простого s & r и / или твика (особенно для текстового файла с разделителями) perl -e или python -c никогда не будут такими эффективными, как sed / awk с одной строкой.
RET 15.12.2008 05:50:30
Мне не нравятся такие ответы. Sed и awk легко понять за несколько часов, они гораздо легче и широко доступны, чем полноценный язык. Программирование в оболочке так же актуально, как и раньше, говоря, что «НИКОГДА» не использовать тот или иной инструмент просто с задержкой. Но не была ли эта отсталая идея одной из основ, на которых возник Perl? О well--
ata 19.10.2011 11:29:36

Когда их использовать: awk - никогда - S. Lott.

Я думаю, что С.Лотт слегка пропустил эту рекомендацию. Дело в том, что в Linux и других средах UNIX awk является полезным инструментом, который можно использовать с bash, sh и ksh для быстрой обработки текста. Сама идея написания сценариев заключается в том, что вы решаете свою проблему, склеивая этот инструмент, этот инструмент. Следовательно, в сценариях администрирования обычно используются ls, grep, |, awk, time, ps и т. Д. Каждый из них представляет собой инструмент, который сценарий объединяет как строитель по кирпичику, чтобы завершить построение (чтобы решить проблему). ,

Например, я являюсь членом команды, управляющей поставками пейнтбольного снаряжения.доткомов. Этот сайт электронной коммерции основан на стеке LAMP. Для автоматической обработки и нормализации потоков данных от различных поставщиков в серверную базу данных мы используем и поддерживаем разнообразное сочетание сценариев, включая bash, perl, php и даже ожидаемо. У каждого есть свои сильные стороны, основанные на доступных модулях и API. В скриптах bash мы выполняем быстрое сопоставление шаблонов и выполняем соответствующие действия с шаблонами по мере необходимости, используя awk без необходимости переключения на PERL. Я также хотел бы отметить одну вещь, которая не была подчеркнута в этой теме, это то, что значительное количество этих скриптов было куплено или получено из открытого исходного кода. Если скрипт пришел как Perl, мы поддерживаем его как Perl; если скрипт пришел как Php, мы поддерживаем его как Php; если это было как bash, мы поддерживаем его как bash;

14
8.09.2014 16:34:53
это тот ответ, который вы цитировали, написал С.
plusplus 10.08.2010 11:25:58
В качестве примечания к этому довольно старому ответу: никогда не анализируйте выходные данные ls, вместо этого используйте glob. прочитайте это.
user529649 30.06.2012 15:33:39

Освоив несколько десятков языков, вы устали от таких людей, как С. Лотт (см. Его неоднозначный ответ на этот вопрос - почти вдвое меньше отрицательных голосов по сравнению с (+ 45 / -22) через шесть лет после ответа).

Sed - лучший инструмент для чрезвычайно простых конвейеров командной строки. В руках Sed Master, он подходит для разовых задач произвольной сложности, но его не следует использовать в производственном коде, за исключением очень простых конвейеров замещения. Вещи как 's / this / that /.'

Gawk (GNU awk) - безусловно, лучший выбор для сложного переформатирования данных, когда имеется только один входной источник и один выход (или несколько выходов, последовательно записанных). Поскольку большая часть реальной работы соответствует этому описанию, и хороший программист может выучить gawk за два часа, это лучший выбор. На этой планете проще и быстрее, тем лучше!

Perl или Python намного лучше, чем любая версия awk или sed, если у вас очень сложные сценарии ввода / вывода. Чем сложнее проблема, тем лучше вы используете python с точки зрения обслуживания и читабельности. Обратите внимание, однако, что хороший программист может писать читаемый код на любом языке, а плохой программист может писать не поддерживаемую ерунду на любом полезном языке, поэтому выбор perl или python можно смело оставить на усмотрение программиста, если указанный программист умелый и умный.

91
8.09.2014 15:20:15
100% согласились. Знание большинства, если не всех инструментов И когда использовать каждый из них - вот что отличает хорошего техника от посредственного.
ata 19.10.2011 11:33:13
Я добавлю, что еще одна причина выбрать Python или Perl вместо awk - это когда ваши требования к преобразованию включают сложную проверку или логику, для которой другой язык имеет существующий, надежный модуль. Подумайте, что нужно для правильной обработки, например, адресов электронной почты или улиц в awk, и вы поймете, что я имею в виду: в perl и python есть библиотеки, которые делают подобные вещи тривиальными, в awk они необычны или недоступны.
sorpigal 30.01.2012 14:27:16
На самом деле, как Perl был разработан, чтобы охватить как Сед и Awk; Мне легче написать это на Perl, чем изучать Sed или Awk.
Brad Gilbert 19.10.2013 17:11:18
@BradGilbert: как я только что упомянул в верхнем ответе, предостережение о Perl (и Python, ruby ​​и т. Д.) В связи с awk заключается в том, что какое-то регулярное выражение в действительности значительно медленнее в первом: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac 12.02.2016 16:35:16
@OlivierDulac Да, это показывает патологический случай. Если вы измените с a?ⁿaⁿна a??ⁿaⁿзатем запустить его в Perl 5 с 1 000 000, он будет запущен менее чем за две секунды. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Если вы запускаете наивный, это занимает более двух секунд всего за 25. То, что вы должны понять, это то, что Perl имеет больше возможностей регулярных выражений, чем те, что более быстрые, включая возможность иметь код Perl внутри регулярного выражения, который изменяет то, что ему соответствует. , Вы можете реализовать модуль, который заменяет встроенный для одного из тех других, если хотите.
Brad Gilbert 12.02.2016 17:38:10