Publicité

Sed et Awk sont deux des utilitaires Linux les moins appréciés du point de vue criminel. Certes, ils peuvent sembler un peu mystérieux, si vous devez apporter des modifications répétitives à de gros morceaux de code ou de texte, ou si vous devez analyser du texte, Sed et Awk sont inestimables.

Alors, quels sont-ils? Comment sont-ils utilisés? Et comment, lorsqu'ils sont combinés ensemble, facilitent-ils le traitement du texte?

Qu'est-ce que Sed?

Sed a été développé en 1971 à Bell Labs, par le légendaire pionnier de l'informatique Lee E. McMahon.

Le nom signifie éditeur de fluxet c'est un peu ce qu'il fait. Il vous permet de modifier des corps ou des flux de texte par programmation, grâce à un langage de programmation compact et simple, mais complet de Turing.

Le fonctionnement est simple: il lit le texte ligne par ligne dans un tampon. Pour chaque ligne, il exécutera les instructions prédéfinies, le cas échéant.

Par exemple, si quelqu'un devait écrire un script Sed qui remplaçait le mot «bière» par «soda», puis passait dans un fichier texte contenant la totalité paroles de "99 bouteilles de bière sur le mur", il passerait par ce fichier ligne par ligne, et imprimerait "99 bouteilles de soda sur le mur", et ainsi sur.

instagram viewer

Le script Sed le plus basique est un script Hello World. Ici, nous utilisons l'utilitaire Unix Echo, qui ne fait que produire des chaînes, pour imprimer «Hello World». Mais nous lisons ceci à Sed, et lui disons de remplacer «World» par «Dave». Trucs explicites.

écho "Hello World" | sed s / monde / Dave
sedawk-dave

Vous pouvez également combiner des instructions Sed dans des fichiers, si vous avez besoin de faire des modifications plus compliquées. Inspiré par ce fil Reddit hilarant, Je vais prendre les paroles de A-Ha Prendre sur moiet remplacez chaque instance de «I», «Me» et «My» par Greg.

Tout d'abord, je vais mettre les paroles de la chanson dans un fichier texte appelé tom.txt. Ensuite, je vais ouvrir mon éditeur de texte préféré (mon le favori est Vim Les 7 meilleures raisons de donner une chance à l'éditeur de texte VimPendant des années, j'ai essayé un éditeur de texte après l'autre. Vous l'appelez, je l'ai essayé. J'ai utilisé chacun de ces éditeurs pendant plus de deux mois comme principal éditeur au jour le jour. D'une certaine manière, je ... Lire la suite , mais Nano nano vs. vim: Comparaison des éditeurs de texte de terminalBien que Linux soit devenu assez facile à utiliser pour pratiquement tout le monde sans jamais avoir à utiliser le Terminal, certains d'entre nous l'utilisent régulièrement ou sont curieux de savoir comment on peut contrôler ... Lire la suite et Gedit gedit: l'un des éditeurs de texte brut les plus riches en fonctionnalités [Linux et Windows]Lorsque vous pensez aux éditeurs de texte brut, la première chose qui peut vous venir à l'esprit est l'application Bloc-notes de Windows. Il fait exactement ce que sa description de travail indique - des fonctionnalités simples pour un texte brut ... Lire la suite sont tous deux d'excellents choix) et ajoutez les lignes suivantes. Assurez-vous que le fichier que vous créez se termine avec .sed.

sed-greg-sed

Vous remarquerez peut-être que dans l'exemple ci-dessus, je me suis répété (par exemple s / me / Greg / et s / Me / Greg /). En effet, certaines versions de Sed, comme celle fournie avec Mac OS X, ne pas prendre en charge la correspondance insensible à la casse. Par conséquent, nous devons écrire deux instructions Sed pour chaque mot, afin qu'il reconnaisse la version capitalisée et non capitalisée.

Cela ne fonctionnera pas parfaitement, comme si vous aviez remplacé chaque instance de "Je", "Moi" et "Mon" à la main. N'oubliez pas que nous utilisons cela comme un exercice pour montrer comment vous pouvez regrouper des instructions Sed dans un script, puis les exécuter avec une seule commande.

Ensuite, nous devons appeler le fichier. Pour ce faire, nous exécutons cette commande.

chat tom.txt | sed -f greg.sed

Ralentissons et regardons ce que cela fait. Les lecteurs aux yeux d'aigle auront remarqué que nous sommes ne pas en utilisant Echo ici. Nous utilisons Cat. En effet, alors que Cat imprimera tout le contenu du fichier, echo imprimera uniquement le nom du fichier. Vous avez également remarqué que nous exécutons Sed avec le drapeau "-f". Cela lui indique d'ouvrir le script sous forme de fichier.

Le résultat final est le suivant.

sed-greg-script

Il convient également de noter que Sed prend en charge les expressions régulières (REGEX). Ceux-ci vous permettent de définir des modèles dans du texte, en utilisant une syntaxe spéciale et compliquée.

Voici un exemple de la façon dont cela pourrait fonctionner. Nous allons prendre les paroles des chansons susmentionnées, mais utilisez l'expression régulière pour imprimer chaque ligne ne fait pas commencez par «Take».

chat tom.txt | sed / ^ Prendre / d
sed-regex-take

Sed est, bien sûr, incroyablement utile. Mais il est encore plus puissant lorsqu'il est combiné avec Awk.

Qu'est-ce que Awk?

Awk, comme Sed, est un langage de programmation conçu pour traiter de grands corps de texte. Mais alors que Sed est utilisé pour traiter et modifier du texte, Awk est principalement utilisé comme un outil pour une analyse et rapports.

Comme Sed, Awk a été développé pour la première fois aux Bell Labs dans les années 1970. Son nom ne vient pas de ce que le programme Est-ce que, mais plutôt les noms de famille de chacun des auteurs - Alfred Aho, Peter Weinberger et Brian Kernaghan.

Awk fonctionne en lisant un fichier texte ou un flux d'entrée une ligne à la fois. Chaque ligne est analysée pour voir si elle correspond à un modèle prédéfini. Si une correspondance est trouvée, une action est effectuée.

Mais alors que Sed et Awk peuvent partager des objectifs similaires, ce sont deux langages complètement différents, avec deux philosophies de conception complètement différentes. Awk ressemble plus à certains langages à usage général Comment choisir un langage de programmation pour apprendre aujourd'hui et obtenir un excellent travail en 2 ansCela peut prendre des années de travail dévoué pour devenir un vrai bon programmeur; existe-t-il un moyen de choisir la bonne langue pour commencer à partir d'aujourd'hui, afin d'être embauché demain? Lire la suite , comme C, Python et Bash. Il a des choses comme des fonctions et une approche plus semblable à C à des choses comme l'itération et les variables (James Bruce expliqué comment fonctionne l'itération Les bases absolues de la programmation pour les débutants (partie 2)Dans la partie 2 de notre guide de programmation pour débutants, je couvrirai les bases des fonctions, des valeurs de retour, des boucles et des conditions. Assurez-vous d'avoir lu la partie 1 avant d'aborder ce sujet, où j'ai expliqué le ... Lire la suite ). En termes simples, il ressemble plus à un langage de programmation.

Alors, essayons. En utilisant les paroles de Take On Me, nous allons imprimer toutes les lignes de plus de 20 caractères.

awk 'length ($ 0)> 80' tom.txt awk-length

Le prochain exemple que j'ai sans gêne bercé de la documentation officielle d'Awk. Mais c'est un excellent exemple du potentiel de ce langage puissant et pourtant minuscule. C'est aussi une excellente démonstration du fonctionnement de choses comme l'itération et les variables. Créez d'abord un fichier appelé «WordCount.awk» et ajoutez les lignes suivantes.

{pour (i = 1; i <= NF; i ++) freq [$ i] ++ }
END {for (word in freq) printf "% s \ t% d \ n", word, freq [word] }

Enregistrez-le, puis exécutez-le avec la commande suivante.

awk -f WordCount.awk tom.txt

awk-wordcount
Cool, non? Vous remarquerez probablement qu'ils ne sont dans aucun ordre. Vous pouvez trier les résultats à l'aide de l'utilitaire de tri Unix. Mais nous laisserons cela pour un autre jour. Nous allons rester simple.

Combiner les deux

Awk et Sed sont tous deux incroyablement puissants lorsqu'ils sont combinés. Vous pouvez le faire en utilisant des canaux Unix. Ce sont les «|» bits entre les commandes.

Essayons ceci: nous allons répertorier toutes les lignes de Take On Me qui ont plus de 20 caractères, en utilisant Awk. Ensuite, nous allons supprimer toutes les lignes qui commencent par "Prendre". Ensemble, tout ressemble à ceci:

awk 'length ($ 0)> 20' tom.txt | sed / ^ Prendre / d

Et produit ceci:

awk-length-sed

Maintenant, retournons cela. Nous allons commencer par supprimer toutes les lignes commençant par Take, puis les rediriger vers Awk, où nous compterons le nombre de fois que chaque mot apparaît. Cela ressemble un peu à ceci:

chat tom.txt | sed / ^ Prendre / d | awk -f WordCount.awk
awk-wordcount-sed

La puissance de Sed et Awk

Il n'y a que tant de choses que vous pouvez expliquer dans un seul article. Mais j'espère avoir illustré à quel point Sed et Awk sont incommensurablement puissants. Autrement dit, ils sont une centrale de traitement de texte.

Alors, pourquoi devriez-vous vous en soucier? Eh bien, outre le fait que vous ne savez jamais quand vous devez apporter des modifications répétitives et prévisibles à un document texte, Sed et Awk sont parfaits pour analyser les fichiers journaux. Ceci est particulièrement pratique lorsque vous essayez de déboguer un problème dans votre serveur LAMP Vous vous êtes inscrit à l'hébergement Web SSH uniquement? Ne vous inquiétez pas - installez facilement n'importe quel logiciel WebVous ne connaissez pas la première chose à propos du fonctionnement de Linux via sa puissante ligne de commande? Ne vous inquiétez plus. Lire la suite ou consultez vos journaux d'accès pour voir si votre serveur a été piraté.

Avez-vous trouvé une utilisation intéressante pour Sed et Awk? Existe-t-il d'autres utilitaires Linux qui, selon vous, sont sous-estimés? Faites-le moi savoir dans les commentaires ci-dessous, et nous discuterons.

Matthew Hughes est un développeur de logiciels et écrivain de Liverpool, en Angleterre. Il est rarement trouvé sans une tasse de café noir fort dans sa main et adore absolument son Macbook Pro et son appareil photo. Vous pouvez lire son blog sur http://www.matthewhughes.co.uk et suivez-le sur twitter à @matthewhughes.