Каковы различия между 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. прочитайте это.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.