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

209

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

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

  • 126
    Этот тип так называемых неконструктивных вопросов действительно полезен.
  • 9
    Конечно, вкладка на первой странице, чтобы найти их, была бы удобна ...
Показать ещё 1 комментарий
Теги:
awk
sed
language-comparisons

5 ответов

444
Лучший ответ

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

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

Программа awk (имя из инициалов ее авторов - Aho, Weinberger и Kernighan) - инструмент, первоначально предназначенный для форматирования отчетов. Его можно использовать в качестве суппорта sed; в его более поздних версиях, это вычислительно завершено. Он использует интересную идею - программа основана на "сопоставленных шаблонах" и "действиях, предпринятых при совпадении шаблона". Шаблоны довольно мощные (расширенные регулярные выражения). Язык для действий аналогичен C. Одной из ключевых особенностей awk является то, что он автоматически разбивает строки ввода на поля.

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

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

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

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

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

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

  • 79
    A ++++ пост, буду читать снова!
  • 23
    офигенно особенно "когда использовать каждую" часть
Показать ещё 14 комментариев
81

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

Sed - лучший инструмент для чрезвычайно простых конвейеров командной строки. В руках мастера sed он подходит для одноразовых задач произвольной сложности, но не должен использоваться в производственном коде, за исключением очень простых подстановочных конвейеров. Такие вещи, как '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 комментария
22

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

Thing 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, ни один из которых не является их возрастом.

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

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

  • 62
    Некоторые довольно глупые аргументы против awk / sed. Разводной ключ не вытеснил открытый гаечный ключ по той же причине, что и SED, и WKK все еще отправляют. Иногда простой инструмент является лучшим для работы. Я пишу много Perl, но для простой цепочки команд по конвейеру, awk / sed быстрее, чем perl -e
  • 26
    Вы не можете предполагать наличие чего-либо, кроме sh, sed и awk в большинстве не-linux unix систем. Если вы хотите, чтобы что-то работало на готовой установке Solaris, HP / UX или AIX, вы застряли с sed и awk.
Показать ещё 15 комментариев
19

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

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

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

  • 2
    Я видел в Sed реализацию Sokoban, которая подразумевала бы полноту Тьюринга. Однако это также можно сказать о sendmail.cf и TeX.
  • 7
    Однажды я работал с парнем, который написал PostScript, чтобы превратить лазерный принтер в маршрутизатор.
Показать ещё 4 комментария
10

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню