Які відмінності між Perl, Python, AWK та sed? [зачинено]


253

просто хочу знати, які основні відмінності між ними? і потужність кожної мови (де її краще використовувати).

Редагувати: це не "проти" як тема, просто інформація.


142
Цей тип так званих неконструктивних питань справді корисний.
Пара

10
Звичайно, вкладка на першій сторінці, щоб знайти їх було б зручно ...

Про корисність python у командному рядку див. Pyp
Ніл

Відповіді:


550

У порядку появи, ці мови sed, awk, perl, python.

sedПрограма потоковий редактор і призначена для застосування дій від сценарію до кожного рядка (або, в більш загальному плані , в певні діапазони рядків) вхідний файл або файли. Її мова заснована на edредакторі Unix, і хоча він має умовні умови тощо, з цим складно працювати з складними завданнями. З ним можна творити незначні чудеса - але ціною, що стосується волосся на голові. Однак це, мабуть, найшвидший з програм при спробах завдань в межах його компетенції. (У ньому є найменш потужні регулярні вирази обговорюваних програм - адекватні для багатьох цілей, але, звичайно, не PCRE - Perl-Compatible Regular вирази)

awkПрограма (назва від ініціалів її авторів - Ахо, Вайнбергер і Керниган) є інструментом , спочатку для форматування звітів. Його можна використовувати як суп-ап sed; в останніх версіях він обчислювально завершений. Тут використовується цікава ідея - програма заснована на "узгоджених моделях" та "діях, що вживаються, коли шаблон відповідає". Шаблони досить потужні (Розширені регулярні вирази). Мова для дій схожа на C. Однією з ключових особливостей програми awkє те, що вона розбиває вхід автоматично на записи, а кожен запис на поля.

Перл був написаний частково як невдаха-убивця та сім-вбивця. Дві програми, що надаються разом з ним, a2pі s2pдля перетворення awkсценаріїв і sedсценаріїв в Perl. Perl - одна з найбільш ранніх мов сценаріїв наступного покоління (Tcl / Tk, можливо, може претендувати на першість). Він має потужну інтегровану обробку регулярних виразів із значно більш потужною мовою. Він забезпечує доступ до майже всіх системних дзвінків і має розширюваність модулів CPAN. (Ні, awkні sedрозширюється.) Один із девізів Перла - "TMTOWTDI - Існує більше одного способу зробити це" (вимовляється "тем-тоді"). У Perl є "об'єкти", але це більше доповнення, ніж фундаментальна частина мови.

Пітон був написаний останнім, і, ймовірно, частково як реакція на Perl. У ньому є кілька цікавих синтаксичних ідей (відступ для позначення рівнів - немає дужок або еквівалентів). Він більш принципово об'єктно-орієнтований, ніж Perl; це так само розширюється, як Perl.

Гаразд - коли використовувати кожен?

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

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

(Зауважте, що "огляди" Перла та Пітона, зокрема, жахливо неповні; на цю тему можна було написати цілі книги.)


82
Повідомлення ++++, читатиметься ще раз!
Роберт Гембл

24
дивовижно, особливо "коли використовувати кожну" частину
Халед Аль Хурані

6
Зауважте, дзен пітона в основному є антитезою TMTOWTDI, тому я б сказав, що це може бути реакцією на перл. 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, він підходить для одноразових довільних складностей, але його не слід використовувати у виробничому коді, за винятком дуже простих трубопроводів заміни. Такі речі, як "s / this / that /".

Gawk (GNU awk) на сьогоднішній день є найкращим вибором для складного переформатування даних, коли є лише одне джерело вводу та один вихід (або кілька записів, записаних послідовно). Оскільки велика кількість справжньої роботи відповідає цьому опису, і хороший програміст може навчитися гоуку за дві години, це найкращий вибір. На цій планеті простіше і швидше краще!

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


9
100% погодились. Знаючи більшість, якщо не всі інструменти І коли їх використовувати - це те, що відрізняє хорошого техніка від посереднього.
ота

6
Я додам, що ще одна причина вибору Python або Perl замість awk - це те, що ваші вимоги перетворення передбачають складну перевірку чи логіку, для якої інша мова має існуючий надійний модуль. Подумайте, що знадобиться для правильної обробки, наприклад, електронної пошти чи вуличних адрес у awk, і ви побачите, що я маю на увазі: у perl та python є бібліотеки, які роблять такі речі, як тривіальні, у awk вони нечасті чи недоступні.
сорпігал

3
Насправді, як Perl був розроблений, щоб охопити і Sed, і Awk; Мені легше просто написати це на Perl, а не вивчити Sed або Awk.
Бред Гілберт

@BradGilbert: як я щойно згадував у верхній відповіді, застереження Perl (& Python, ruby ​​і т. Д.) Над awk - це те, що якесь регулярне випробовування реалізується повільніше в колишньому: swtch.com/~rsc/regexp/regexp1.html
Олів'є Дулак

1
@OlivierDulac Так, це свідчить про патологічний випадок. Якщо ви переключитесь a?ⁿaⁿна, a??ⁿaⁿтоді запустіть це в Perl 5 зі 1000000, він запуститься менше ніж за дві секунди. 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-perl). Існує багато розбіжностей між Perl та Python, найкраще вам, мабуть, читати резюме обох мов на чомусь, наприклад, у Вікіпедії, щоб добре зрозуміти, що вони є.


2
Я бачив sed реалізацію Sokoban, яка б передбачала Тюрінг Повноти. Однак це також можна сказати про sendmail.cf та TeX.
Занепокоєння

7
Я колись працював з хлопцем, який писав PostScript, щоб перетворити лазерний принтер на маршрутизатор.
Сем Кінгтон

10
@Sam: Нічого собі! Я не знав, що лазер принтера міг би бути досить кривошипним, щоб різати деревину! О, вибачте, неправильний роутер.
Призупинено до подальшого повідомлення.

2
sed, не повноцінна мова? Ну, це не зовсім вірно, як sed закінчується повним ;)
bernard paulus

1
Я бачив реалізацію четвертої мови дивним чином. (Оскільки awk можна вважати парсером власним правом, втілити в ньому перекладача досить просто).
Тетяна Хейзер

19

По-перше, у списку є дві незв’язані речі "Perl, Python awk and sed".

Річ 1 - спрощені засоби маніпулювання текстом.

  • sed. Він має фіксований, відносно простий обсяг роботи, визначений ідеєю читання та вивчення кожного рядка файлу. sed не розроблений так, щоб він був особливо читабельним. Він розроблений, щоб бути дуже маленьким і дуже ефективним на дуже крихітних серверах Unix.

  • awk Він має трохи менш фіксований, менш простий обсяг роботи. Однак основний цикл програми awk визначається неявним читанням рядків вихідного файлу.

Це не "повні" мови програмування. У той час як ви можете - за допомогою деякої роботи - писати досить складні програми дивним чином, це швидко ускладнюється і важко читається.

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

  • Perl

  • Пітон.

Коли їх використовувати.

  • sed. Ніколи. Це дійсно не має ніякої цінності в сучасній епосі комп'ютерів з більш ніж 32 Кб пам'яті. Perl або Python роблять ті самі речі чіткіше.

  • awk Ніколи. Як і sed, він відображає більш ранню епоху обчислень. Замість того, щоб підтримувати цю мову (крім усіх інших, необхідних для успішної системи), приємніше просто робити все однією приємною мовою.

  • Perl Будь-яка проблема програмування будь-якого типу. Якщо вам подобається синтаксис вільного мислення, де існує багато, багато способів зробити те саме, perl - це весело.

  • Пітон. Будь-яка проблема програмування будь-якого типу. Якщо вам подобається досить обмежений синтаксис, де менше варіантів, менше тонкощів і (можливо) більше чіткості. Об'єктно-орієнтована природа Python робить його більш придатним для великих, складних проблем.

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

Є дві серйозні проблеми з sed і awk, жодна з яких не є їхнім віком.

  1. Незавершеність їх реалізації. Все, що можна зробити, можна зробити в Python або Perl, часто простіше, а іноді і швидше. Трубопровід оболонки має деякі переваги в експлуатації через багаторазову обробку. Python пропонує subprocessмодуль, який дозволить мені відновити ці переваги.

  2. Необхідність вивчити ще одну мову. Роблячи дії в Python (або Perl), ваша реалізація залежить від меншої кількості мов, внаслідок чого ясність збільшується.


66
Деякі досить товсті аргументи проти awk / sed. Регульований гайковий ключ не витіснив відкритий гайковий ключ з тієї ж причини, що сідала і тука все ще поставляється. Іноді простий інструмент є найкращим для роботи. Я пишу багато perl, але для простого ланцюжка трубних команд awk / sed швидше perl -e
RET

27
Ви не можете припустити наявність нічого, крім sh, sed і awk у більшості нелінукс-систем Unix. Якщо ви хочете, щоб щось працювало над усталеною установкою Solaris, HP / UX або AIX, ви застрягли з sed і awk.
Занепокоєння

27
Половина моїх скриптів оболонок використовують або sed, або awk. Вони далеко не мертві. Python - моя краща мова сценаріїв, але іноді sed і awk - найкращий інструмент для роботи. Тільки тому, що вони використовуються вже багато років, не означає, що вони застаріли.
Джеремі Кантрелл

16
@ S.Lott: Я не припускаю, що хто-небудь повинен намагатися створити веб-додаток у див. Але сказати, що їх ніколи не слід використовувати, це трохи нецензурно. Для простого налаштування s & r та / або налаштування (особливо для файлу з обмеженим текстом), perl -e або python -c ніколи не буде настільки ефективним, як одно-вкладиш sed / awk.
RET

25
Мені не подобаються такі відповіді. Sed і awk легко зрозуміти за кілька годин і набагато легший і широко доступний, ніж повноцінна мова. Програмування оболонки так само актуально, як ніколи: "НІКОЛИ" використовувати той чи інший інструмент просто відстало. Але чи не була ця затримка ідеї однією з основ, на якій виник Перл? Про well--
ата

14

Коли їх використовувати: awk - ніколи - С. Лотт.

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

Наприклад, я є членом команди управління командою приладдям пейнтбольного обладнанняdotcom. Цей веб-сайт для електронної комерції базується на степі LAMP. Для автоматизованої обробки та нормалізації каналів даних різних постачальників у базі даних задніх частин ми використовуємо та підтримуємо різноманітну суміш сценаріїв, включаючи bash, perl, php та навіть очікувати. Кожен має свої сильні сторони на основі доступних модулів та API. У скриптах bash ми робимо швидкі відповідність шаблонів та відповідні дії за шаблонами за потребою за допомогою awk без необхідності перемикатися на PERL. Я хотів би також зазначити одне, що не було підкреслено ниткою, - це те, що досить багато цих сценаріїв було придбано або отримано з відкритого коду. Якщо сценарій вийшов Perl, ми підтримуємо його як Perl; якщо сценарій вийшов як Php, ми підтримуємо його як Php; якщо він прийшов як баш, ми підтримуємо його як баш;


7
саме С.Лотт написав цю відповідь, яку ви цитували, а не Брайан д фой ...
плюс

5
як бічне зауваження щодо цієї досить старої відповіді: ніколи не аналізуйте вихід ls, використовуйте глобул замість цього. Прочитай це.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.