Quelle est la difference entre sed et awk? [fermé]

497
  • Quelle est la difference entre awk et sed?
  • Quel type d'application sont les meilleurs cas d'utilisation pour les outils sed et awk?
Rachel
la source
2
Un contrôle qualité connexe sur unix.stackexchange: existe-t-il un didacticiel de base pour grep, awk et sed?
Dani

Réponses:

550

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

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

awkest orienté vers des champs délimités ligne par ligne. Il a beaucoup plus des structures de programmation robuste , y compris if/ else, while, do/ whileet for(C-style et itération de tableau). Il existe une prise en charge complète des variables et des tableaux associatifs à une dimension plus (IMO) des tableaux multidimensionnels kludgey. Les opérations mathématiques ressemblent à celles de C. Elle a printfet fonctionne. Le "K" dans "AWK" signifie " K ernighan" comme dans "Kernighan and Ritchie" du livre "C Programming Language" (sans oublier A ho et W einberger). On pourrait imaginer écrire un détecteur de plagiat académique en utilisant awk.

GNU awk( gawk) possède de nombreuses extensions, y compris de vrais tableaux multidimensionnels dans la dernière version. Il existe d'autres variantes d' awkinclure mawket nawk.

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

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

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

J'utiliserais awklorsque le texte ressemble plus à des lignes et des colonnes ou, comme il se awkréfère à eux "enregistrements" et "champs". Si je devais faire une opération similaire à celle ci-dessus, mais uniquement sur le troisième champ d'un 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 la gamme complète des capacités que chacun a à offrir.

En pause jusqu'à nouvel ordre.
la source
7
Pour voir quelques exemples de repousser les limites de sed: sed.sourceforge.net/#scripts
pause jusqu'à nouvel ordre.
@DennisWilliamson - Suis-je désavantagé si j'apprends seulement awk? Est-ce que awk est beaucoup plus utilisé que sed?
Steam
4
@blasto: Ma recommandation est d'apprendre les deux mais en mettant davantage l'accent sur awk. De nombreuses expressions régulières s'appliquent aux deux (et à d'autres outils et langages). Utilisez sed pour des choses plus simples et essayez d'éviter les choses complexes. C'est vraiment cool que vous puissiez faire des boucles et des branches dans sed, mais les lignes de commande résultantes sont complexes et difficiles à lire. La réponse à votre question dépend vraiment de ce que vous faites.
pause jusqu'à nouvel ordre.
@DennisWilliamson - Qu'est-ce qui serait le plus utile pour un développeur ETL? ETL ou Extract Transform and Load est un terme de stockage de données. En termes simples, le travail implique l'EXTRACTION de données provenant de différentes sources disparates (telles que les bases de données, les fichiers Excel, les fichiers csv, etc.), la TRANSFORMATION des mêmes, puis le CHARGEMENT dans un datawarehouse (DW) pour l'analyse, la recherche de modèles dans les données ou tout simplement l'historique enregistrements. par exemple. Utilisation finale d'un DW - Les algorithmes appliqués à un DW d'une épicerie contenant des données des 10 dernières années peuvent révéler que les personnes qui ont tendance à acheter des pommes achètent également des oranges ou quelque chose de similaire.
Steam
1
Juste un FYI pour quiconque tombe sur cela sur un mac, essayez "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" pour le premier exemple sed
Daniel Schmidt
124

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 simplement manipuler du texte. C'est un langage de programmation en lui-même avec la plupart des choses que vous apprenez en programmation, comme les tableaux, les boucles, le contrôle de flux if / else, etc. Vous pouvez également "programmer" dans sed, mais vous ne voudrez pas conserver le code écrit dedans. .

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à de ça, awk c'est mieux. En fait, vous pouvez complètement abandonner sed et simplement utiliser awk. Comme leurs fonctions se chevauchent et awk peut faire plus, utilisez simplement awk. Vous réduirez également votre courbe d'apprentissage.

ghostdog74
la source
7
Joli point sur la courbe d'apprentissage .. trop d'outils peuvent mélanger .. donc je préférerais apprendre grep et awk uniquement .. oublions sed :)
Valeur aberrante
174
^^ Assez sed. (désolé, je devais)
Greg M. Krsak
8
Je trouve que sed est beaucoup plus facile à apprendre, donc vous devez en tenir compte. Au fur et à mesure que vous apprenez à maîtriser awk, il peut être utile d'apprendre rapidement sed pour pouvoir l'utiliser plus rapidement pour des choses que vous ne savez pas encore comment faire dans awk.
Didier A.
1
@GregKrsak vous avez fait ma journée. (désolé, je devais)
Abel Callejo
15
Ne laissez pas tomber sed, 's/search/replace'est beaucoup plus facile à taper que awkla syntaxe et c'est ce dont vous avez besoin la plupart du temps.
sjas
55

Les deux outils sont destinés à fonctionner avec du texte et il existe des tâches pour lesquelles les deux outils peuvent être utilisés.

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

N'oubliez pas non plus grep. A utiliser grepsi vous souhaitez uniquement rechercher / extraire quelque chose dans un texte (fichier)

hek2mgl
la source