web-dev-qa-db-fra.com

Quelles sont les différences entre Perl, Python, AWK et sed?

je veux juste savoir quelles sont les principales différences entre eux? et le pouvoir de chaque langue (où il est préférable de l'utiliser).

Edit: ce n'est pas "vs." comme sujet, juste des informations.

241
Khaled Al Hourani

Par ordre d'apparition, les langues sont sed, awk, Perl, python.

Le programme sed est un éditeur de flux et est conçu pour appliquer les actions d'un script à chaque ligne (ou plus généralement à des plages de lignes spécifiées) du ou des fichiers d'entrée. Son langage est basé sur ed, l'éditeur Unix, et bien qu'il ait des conditions, etc., il est difficile de travailler avec des tâches complexes. Vous pouvez faire de petits miracles avec cela, mais au détriment des cheveux sur votre tête. Cependant, il s’agit probablement du programme le plus rapide lorsqu’il tente d’exécuter des tâches relevant de sa compétence. (Il contient les expressions régulières les moins puissantes des programmes examinés - adéquates pour de nombreuses raisons, mais certainement pas pour PCRE - Expressions régulières compatibles Perl)

Le programme awk (nom tiré des initiales de ses auteurs - Aho, Weinberger et Kernighan) est à l'origine un outil permettant de formater des rapports. Il peut être utilisé comme un soupé sed; dans ses versions les plus récentes, il est complet sur le plan informatique. Il utilise une idée intéressante - le programme est basé sur les "modèles appariés" et les "actions entreprises lorsque le modèle correspond". Les motifs sont assez puissants (expressions régulières étendues). Le langage utilisé pour les actions est similaire à C. Une des caractéristiques clés de awk est qu’il divise automatiquement les lignes d’entrée en champs.

Perl a été écrit en partie comme un awk-killer et un sed-killer. Deux des programmes fournis sont a2p et s2p pour convertir awk scripts et sed scripts en Perl. Perl est l’un des premiers de la prochaine génération de langages de script (Tcl/Tk peut probablement revendiquer la primauté). Il possède une puissante gestion de l'expression régulière intégrée avec un langage beaucoup plus puissant. Il donne accès à presque tous les appels système et dispose de l’extensibilité des modules CPAN. (Ni awk ni sed ne sont extensibles.) L'un des slogans de Perl est "TMTOWTDI - Il y a plus d'une façon de le faire" (prononcé "tim-toady"). Perl a des "objets", mais c'est plus un ajout qu'un élément fondamental du langage.

Python a été écrit en dernier et probablement en partie en réaction à Perl. Il a quelques idées syntaxiques intéressantes (indenter pour indiquer les niveaux - pas d'accolades ni d'équivalents). Il est plus fondamentalement orienté objet que Perl; il est aussi extensible que Perl.

OK - quand utiliser chacun?

  • sed - lorsque vous devez effectuer de simples transformations de texte sur des fichiers.
  • awk - lorsque vous n'avez besoin que d'un simple formatage et d'un résumé ou d'une transformation des données.
  • Perl - pour presque toutes les tâches, mais surtout lorsque celle-ci nécessite des expressions régulières complexes.
  • python - pour les mêmes tâches que celles pour lesquelles vous pouviez utiliser Perl.

Je ne suis au courant de rien que Perl puisse faire. Python ne peut pas, ni l'inverse. Le choix entre les deux dépendrait d'autres facteurs. J'ai appris Perl avant qu'il y ait un Python, donc j'ai tendance à l'utiliser. Python a une syntaxe moins compliquée et est en général un peu plus simple à apprendre. Perl 6, lorsqu'il sera disponible, sera un développement fascinant.

(Notez que les "aperçus" de Perl et de Python, en particulier, sont terriblement incomplets; des livres entiers pourraient être écrits sur le sujet.)

529
Jonathan Leffler

Après avoir maîtrisé quelques dizaines de langues, vous en avez assez des gens comme S. Lott (voir sa réponse controversée à cette question, près de la moitié moins de votes négatifs que plus (+ 45/-22) six ans après la réponse).

Sed est le meilleur outil pour des pipelines en ligne de commande extrêmement simples. Dans les mains d'un sed master, il convient à des opérations uniques de complexité arbitraire, mais il ne devrait pas être utilisé dans le code de production, sauf dans des pipelines de substitution très simples. Des trucs comme 's/this/that /.'

Gawk (the GNU awk) est de loin le meilleur choix pour le reformatage de données complexes lorsqu'il n'y a qu'une seule source d'entrée et une seule sortie (ou plusieurs sorties écrites de manière séquentielle). du travail dans le monde réel est conforme à cette description, et un bon programmeur peut apprendre gawk en deux heures, c’est le meilleur choix. Sur cette planète, plus simple et plus rapide, mieux!

Perl ou Python sont bien meilleurs que n’importe quelle version de awk ou sed lorsque vous avez des scénarios d’entrée/sortie très complexes. Plus le problème est complexe, meilleure est votre utilisation de python à partir d’une maintenance. Notez cependant qu’un bon programmeur peut écrire du code lisible dans n’importe quel langage et qu’un mauvais programmeur peut écrire des conneries impossibles à maintenir dans n’importe quel langage utile, de sorte que le choix de Perl ou python peut être laissé en toute sécurité aux préférences du programmeur, si celui-ci est habile et malin.

89
Charlie

Premièrement, il y a deux choses sans rapport dans la liste "Perl, Python awk et sed").

Chose 1 - outils de manipulation de texte simplistes.

  • sed. Son champ de travail est fixe et relativement simple, défini par l’idée de lire et d’examiner chaque ligne d’un fichier. sed n'est pas conçu pour être particulièrement lisible. Il est conçu pour être très petit et très efficace sur de très petits serveurs Unix.

  • awk. Son champ de travail est légèrement moins fixe et moins simple. Cependant, la boucle principale d'un programme awk est définie par la lecture implicite des lignes d'un fichier source.

Ce ne sont pas des langages de programmation "complets". Bien que vous puissiez - avec quelques travaux - écrire des programmes assez sophistiqués dans awk, cela devient rapidement compliqué et difficile à lire.

Chose 2 - langages de programmation à usage général. Celles-ci ont une grande variété de types d'instructions, de nombreuses structures de données intégrées et aucune hypothèse ou raccourci câblé à proprement parler.

  • Perl.

  • Python.

Quand les utiliser.

  • sed. Jamais. Il n’a vraiment aucune valeur dans l’ère moderne des ordinateurs avec plus de 32K de mémoire. Perl ou Python fait les mêmes choses plus clairement.

  • awk. Jamais. Comme sed, il reflète une ère antérieure de l'informatique. Plutôt que de conserver cette langue (en plus de toutes les autres nécessaires au bon fonctionnement du système), il est plus agréable de tout faire dans une langue agréable.

  • Perl. N'importe quel problème de programmation Si vous aimez la syntaxe libre, où il y a beaucoup, beaucoup de façons de faire la même chose, Perl est amusant.

  • Python. N'importe quel problème de programmation Si vous aimez la syntaxe assez limitée, où il y a moins de choix, moins de subtilité et (peut-être) plus de clarté. La nature orientée objet de Python le rend plus adapté aux grands problèmes complexes.

Arrière-plan - Je ne dénigre pas pour autant l'ignorance. J'ai appris awk il y a plus de 20 ans. Fait beaucoup de choses avec elle; utilisé pour l'enseigner comme une compétence Unix de base. J'ai appris Perl il y a environ 15 ans. A fait beaucoup de choses sophistiquées avec elle. J'ai oublié les deux parce que je peux faire la même chose avec Python - et c'est plus simple et plus clair.

Sed et awk posent deux problèmes graves, dont l’âge n’est pas le leur.

  1. L'inachèvement de leur mise en œuvre. Tout ce que sed et awk peuvent faire peut être fait avec Python ou Perl, souvent plus simplement et parfois plus rapidement, aussi. Un pipeline Shell présente certains avantages en termes de performances grâce à son traitement multiple. Python propose un module subprocess pour me permettre de récupérer ces avantages.

  2. La nécessité d'apprendre encore une autre langue. En effectuant des opérations dans Python (ou Perl), votre implémentation dépend de moins de langues, ce qui entraîne une augmentation de la clarté.

21
S.Lott

Je n'appellerais pas sed un langage de programmation à part entière, c'est un éditeur de flux avec des constructions de langage destinées à l'édition de fichiers texte par programmation.

Awk est un peu plus un langage à usage général, mais il convient toujours au traitement de texte.

Perl et Python sont des langages de programmation généraux à part entière. Perl a ses racines dans le traitement de texte et possède un certain nombre de constructions de type awk (il existe même un script awk-to-Perl flottant Il y a beaucoup de différences entre Perl et Python, votre meilleur pari est probablement de lire les résumés des deux langues sur quelque chose comme Wikipédia pour bien comprendre ce qu’ils sont.

20
Robert Gamble

Quand les utiliser: awk - jamais - S. Lott.

Je pense que S. Lott a légèrement raté la cible avec cette recommandation. Le fait est que, sous Linux et les autres environnements UNIX, awk est un outil utile à utiliser avec bash, sh et ksh pour les traitements de texte rapides. L’idée du script lui-même est que vous résolvez votre problème en collant ensemble cet outil, cet outil. Par conséquent, dans les scripts d’admin, il est courant d’avoir ls, grep, |, awk, time, ps, etc. Chacun est un outil que le scénariste combine comme un constructeur brique par brique pour terminer le bâtiment (pour résoudre le problème actuel). .

Par exemple, je suis un membre de l'équipe qui gère fournitures de matériel de paintball dotcom. Ce site de commerce électronique est basé sur la pile LAMP. Pour le traitement automatisé et la normalisation des flux de données de divers fournisseurs dans la base de données back-end, nous utilisons et maintenons un mélange diversifié de scripts, notamment bash, Perl, php et même prévu. Chacun a ses points forts basés sur les modules et l'API disponibles. Dans les scripts bash, nous faisons correspondre les modèles rapides et les actions appropriées sur les modèles à l'aide de awk sans qu'il soit nécessaire de passer à Perl. Une chose que je voudrais également souligner, et qui n’a pas été soulignée dans le fil de discussion, est qu’un bon nombre de ces scripts ont été achetés ou obtenus à partir de l’open source. Si le script est venu en tant que Perl, nous le maintenons en tant que Perl; si le script est venu en tant que Php, nous le maintenons en tant que Php; si c'est venu comme bash, nous le maintenons comme bash; nous ne le réécrivons pas dans une autre langue simplement parce que nous pensons qu'il est moins efficace que dans la langue d'origine.

12
tao quam