web-dev-qa-db-fra.com

Sed et awk Quelle est la différence entre?

  • Quelle est la différence entre awk et sed?
  • Quel type d'application sont les meilleurs cas d'utilisation pour les outils sed et awk?
474
Rachel

sed est un éditeur de flux. Il fonctionne avec des flux de caractères ligne par ligne. Il a un langage de programmation primitif qui inclut des boucles de style goto et des conditions simples (en plus de la correspondance de modèle et de correspondance d’adresse). Il n'y a essentiellement que deux "variables": l'espace de modèle et l'espace de maintien. La lisibilité des scripts peut être difficile. Les opérations mathématiques sont au mieux extraordinairement maladroites.

Il existe différentes versions de sed avec différents niveaux de prise en charge des options de ligne de commande et des fonctionnalités linguistiques.

awk est orienté vers les champs délimités ligne par ligne. Il possède des structures de programmation beaucoup plus robustes, notamment if/else, while, do/while et for (style C et itération de tableau ) La prise en charge complète des variables et des tableaux associatifs à une dimension et des tableaux multidimensionnels kludgey (IMO). Les opérations mathématiques ressemblent à celles de C. Elle a printf et fonctionne. Le "K" dans "AWK" signifie "K ernighan" comme dans "Kernighan et Ritchie" du livre "C Programming Language" renommée (à ne pas oublier A ho et W einberger). On pourrait concevoir un détecteur de plagiat académique en utilisant awk.

GNU awk (gawk) possède de nombreuses extensions, y compris de véritables tableaux multidimensionnels de la dernière version. Il existe d'autres variantes de awk, notamment mawk et nawk.

Les deux programmes utilisent des expressions régulières pour sélectionner et traiter du texte.

J'aurais tendance à utiliser sed là où il y a des motifs dans le texte. Par exemple, vous pouvez remplacer tous les nombres négatifs de certains textes sous la forme "signe moins suivi d'une séquence de chiffres" (par exemple "-231.45") par le formulaire "parenthèses du comptable" (par exemple, "(231.45)" ) en utilisant ceci (ce qui peut encore être amélioré):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile

J'utiliserais awk lorsque le texte ressemblerait davantage à des lignes et à des colonnes ou, étant donné que awk se réfère à eux "enregistrements" et "champs". Si je voulais effectuer une opération similaire à celle décrite ci-dessus, mais uniquement sur le troisième champ d'un simple fichier délimité par des virgules, je pourrais faire quelque chose comme:

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile

Bien sûr, ce ne sont que des exemples très simples qui n'illustrent pas toute la gamme des fonctionnalités offertes par chacun.

527
Dennis Williamson

1) Quelle est la différence entre awk et sed?

Les deux sont des outils qui transforment le texte. MAIS awk peut faire plus que manipuler du texte. C'est un langage de programmation à part entière avec la plupart des choses que vous apprenez en programmation, telles que les tableaux, les boucles, le contrôle de flux if/else, etc. Vous pouvez aussi "programmer" dans sed, mais vous ne voudrez pas conserver le code écrit .

2) Quel type d'application sont les meilleurs cas d'utilisation pour les outils sed et awk?

Conclusion: utilisez sed pour une analyse de texte très simple. Au-delà, awk est meilleur. En fait, vous pouvez laisser tomber sed et simplement utiliser awk. Comme leurs fonctions se chevauchent et que awk peut faire plus, utilisez simplement awk. Vous réduirez également votre courbe d'apprentissage.

117
ghostdog74

Les deux outils sont conçus pour travailler avec du texte et il existe des tâches pour lesquelles ils peuvent être utilisés.

Pour moi, la règle pour les séparer est la suivante: Utilisez sed pour automatiser manuellement les tâches que vous feriez autrement dans un éditeur de texte. C'est pourquoi il s'appelle stream editor. (Vous pouvez utiliser les mêmes commandes pour éditer du texte dans vim). Utilisez awk si vous souhaitez analyser du texte, c'est-à-dire compter des champs, calculer des totaux, extraire et réorganiser des structures, etc.

Aussi, vous ne devez pas oublier grep. Utilisez grep si vous voulez seulement chercher/extraire quelque chose dans un texte (fichier)

45
hek2mgl