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

253

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

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

Халед Аль Хурани
источник
142
Этот тип так называемых неконструктивных вопросов действительно полезен.
Steam
10
Конечно, вкладка на первой странице, чтобы найти их, была бы удобна ...
Для полезности Python в командной строке, см. Pyp
Нил Макгиган

Ответы:

550

В порядке появления, эти языки 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, в частности, крайне неполны; по этой теме могут быть написаны целые книги.)

Джонатан Леффлер
источник
82
A ++++ пост, буду читать снова!
Роберт Гэмбл
24
потрясающе особенно "когда использовать каждую" часть
Халед Аль Хурани
6
Обратите внимание, что дзен питона - это антитеза TMTOWTDI, так что я бы сказал, что это может быть реакцией на perl. iirc TCL был немного позже perl и также довольно реакционно настроен против perl, хотя реакция TCL заключается в синтаксисе и сложности языка, а не в способах выполнения задач
jk.
7
Какими бы ни были первоначальные намерения, ясно, что более поздняя разработка Python и сообщество Python предпочли удобочитаемость и согласованность по сравнению с более гибким, но лаконичным синтаксисом Perl. Отличный пост Джонатан
Мартин Беккет
4
@blasto: Для ETL, я бы приоритет awkнад sedдля обучения (хотя и до сих пор их использование). Что касается размера задачи: sedэто самое лучшее, когда он обрабатывает одну строку за раз, без хранения от строки к строке. awkчасто используется для создания ассоциативных массивов с данными, собранными из всех источников; он использует больше памяти и, следовательно, с большей вероятностью столкнется с проблемами с большими наборами данных, чем sedесть. Я не слышал, tsawkпрежде чем вы связались с этим. Я склонен прибегать к Perl (но вы могли бы лучше с Python), когда задача слишком много для awk.
Джонатан Леффлер
91

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

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

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

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

Чарли
источник
9
100% согласились. Знание большинства, если не всех инструментов И когда использовать каждый из них - вот что отличает хорошего техника от посредственного.
ата
6
Я добавлю, что еще одна причина выбрать Python или Perl вместо awk - это когда ваши требования к преобразованию включают сложную проверку или логику, для которой другой язык имеет существующий, надежный модуль. Подумайте, что нужно для правильной обработки, например, адресов электронной почты или улиц в awk, и вы поймете, что я имею в виду: в perl и python есть библиотеки, которые делают подобные вещи тривиальными, в awk они необычны или недоступны.
Сорпигал
3
На самом деле, как Perl был разработан, чтобы охватить как Сед и Awk; Мне легче написать это на Perl, чем изучать Sed или Awk.
Брэд Гилберт
@BradGilbert: как я только что упомянул в верхнем ответе, предостережение Perl (и Python, ruby, и т. Д.) В отношении awk заключается в том, что какое-то регулярное выражение на самом деле медленнее в первом: swtch.com/~rsc/regexp/regexp1.html
Оливье Дюлак
1
@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 внутри регулярного выражения, который изменяет то, что ему соответствует. , Вы можете реализовать модуль, который заменяет встроенный для одного из тех других, если хотите.
Брэд Гилберт
21

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

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

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

Роберт Гэмбл
источник
2
Я видел в Sed реализацию Sokoban, которая подразумевала бы полноту Тьюринга. Однако это также можно сказать о sendmail.cf и TeX.
ConcernedOfTunbridgeWells
7
Однажды я работал с парнем, который написал PostScript, чтобы превратить лазерный принтер в маршрутизатор.
Сэм Кингтон
10
@ Сэм: Вау! Я не знал, что лазер принтера может быть запущен достаточно, чтобы резать дерево! Ой, прости, неправильный вид роутера.
Приостановлено до дальнейшего уведомления.
2
седь, а не полноценный язык? Ну, это не совсем верно, так как sed завершается ;)
Бернард Паулс
1
Я видел реализацию четвертого языка в awk. (Так как awk можно рассматривать как синтаксический анализатор сам по себе, довольно просто реализовать в нем интерпретатор).
Татьяна Хойзер,
19

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

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

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

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

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

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

  • Perl.

  • Python.

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

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

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

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

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

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

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

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

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

С. Лотт
источник
66
Несколько довольно глупых аргументов против awk / sed. Разводной ключ не вытеснил открытый гаечный ключ по той же причине, что и SED, и WKK все еще отправляют. Иногда простой инструмент является лучшим для работы. Я пишу много Perl, но для простой цепочки переданных команд awk / sed быстрее, чем perl -e
RET
27
Вы не можете предполагать наличие чего-либо, кроме sh, sed и awk в большинстве не-linux unix систем. Если вы хотите, чтобы что-то работало на готовой установке Solaris, HP / UX или AIX, вы застряли с sed и awk.
ConcernedOfTunbridgeWells
27
Половина моих сценариев оболочки использует либо sed, либо awk. Они далеко не мертвы. Python - мой любимый язык сценариев, но иногда sed и awk - лучший инструмент для работы. То, что они используются много лет, не означает, что они устарели.
Джереми Кантрелл
16
@ S.Lott: Я не предлагаю, чтобы кто-то пытался создать веб-приложение в awk, но сказать, что его никогда не следует использовать, - это немного возмутительно. Для простого s & r и / или твика (особенно для текстового файла с разделителями) perl -e или python -c никогда не будут такими эффективными, как sed / awk с одной строкой.
RET
25
Мне не нравятся такие ответы. Sed и awk легко понять за несколько часов, они гораздо легче и широко доступны, чем полноценный язык. Программирование в оболочке так же актуально, как и раньше, говоря, что «НИКОГДА» не использовать тот или иной инструмент просто с задержкой. Но не была ли эта отсталая идея одной из основ, на которых возник Perl? О well--
ата
15

Когда их использовать: 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;

Тао Квам
источник
7
это был ответ С.Лотта, который вы цитировали, а не Брайан Д. Фой ...
plusplus
5
как примечание к этому довольно старому ответу: никогда не анализируйте вывод ls, используйте вместо этого glob. прочитайте это.