Chaque Linux Geek a besoin de connaître Sed et Awk. Voici pourquoi…

Deux des utilitaires Linux sous-estimés les plus criminellement sont les Sed et Awk, qui sont des arcanes. Mais qu'est-ce qu'ils sont? Comment sont-ils utilisés? Et comment facilitent-ils le traitement du texte?

Deux des utilitaires Linux sous-estimés les plus criminellement sont les Sed et Awk, qui sont des arcanes.  Mais qu'est-ce qu'ils sont?  Comment sont-ils utilisés?  Et comment facilitent-ils le traitement du texte?
Publicité

Deux des utilitaires Linux sous-estimés le plus criminellement sont Sed et Awk. Bien que cela puisse sembler un peu obscur, si vous devez apporter des changements répétitifs à de gros morceaux de code ou de texte, ou si vous devez analyser un texte, Sed et Awk sont inestimables.

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

Qu'est-ce que Sed?

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

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

La façon dont cela fonctionne est simple: il lit le texte, ligne par ligne dans un tampon. Pour chaque ligne, il effectuera les instructions prédéfinies, le cas échéant.

Par exemple, si quelqu'un devait écrire un script Sed qui remplaçait le mot «beer» par «soda», puis passerait dans un fichier texte contenant les paroles entières de «99 bouteilles de bière sur le mur», il irait à travers ce fichier sur une base ligne par ligne, et imprimer "99 bouteilles de soda sur le mur", et ainsi de suite.

Le script Sed le plus basique est un Hello World. Ici, nous utilisons l'utilitaire Unix Echo, qui ne fait que produire des chaînes, pour imprimer "Hello World". Mais nous l'envoyons à Sed, et lui disons de remplacer "World" par "Dave". Des trucs explicatifs.

 echo "Bonjour tout le monde" | 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 de Reddit hilarant, je vais prendre les paroles de Take On Me d'A-Ha, et remplacer chaque instance de "I", "Moi", et "Mon", avec Greg.

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 préféré est Vim Le Top 7 raisons de donner à l'éditeur de texte Vim Une chance Les 7 meilleures raisons de donner à l'éditeur de texte Vim Une chance Depuis des années, j'ai essayé un éditeur de texte Je l'ai nommé, je l'ai essayé, j'ai utilisé chacun de ces éditeurs pendant plus de deux mois comme mon principal éditeur au jour le ... Lire la suite, mais Nano nano vs vim: Terminal Comparaison de nano et de vim: éditeurs de texte de terminal comparés Bien que Linux soit devenu assez facile à utiliser pour n'importe qui sans avoir à utiliser le terminal, certains d'entre nous l'utilisent régulièrement ou sont curieux de savoir comment contrôler. En savoir plus et Gedit gedit: l'un des éditeurs de texte brut les plus complets [Linux & Windows] gedit: l'un des éditeurs de texte brut les plus complets [Linux & Windows] Quand vous pensez aux éditeurs de texte brut, la première chose l'application Bloc-notes de Windows peut vous venir à l'esprit: elle fait exactement la description de son travail. - les fonctions simples pour un texte simple ... Lisez plus sont deux excellents choix), et ajoutez les lignes suivantes. Assurez-vous que le fichier que vous créez se termine par .sed.

sed-greg-sed

Vous pourriez remarquer que dans l'exemple ci-dessus, je me suis répété (par exemple s / moi / Greg / et s / Me / Greg /). En effet, certaines versions de Sed, comme celle fournie avec Mac OS X, ne prennent pas 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 "Moi", "Moi" et "Mon" à la main. Rappelez-vous, nous utilisons simplement cela comme un exercice pour démontrer comment vous pouvez regrouper les instructions Sed en un seul script, puis les exécuter avec une seule commande.

Ensuite, nous devons invoquer 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 n'utilisons pas Echo ici. Nous utilisons Cat. C'est parce que Cat imprimera tout le contenu du fichier, echo imprimera seulement le nom du fichier. Vous aurez également remarqué que nous utilisons Sed avec le drapeau "-f". Cela lui indique d'ouvrir le script en tant que fichier.

Le résultat final est ceci.

sed-greg-script

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

Voici un exemple de comment cela pourrait fonctionner. Nous allons prendre les paroles de chansons mentionnées ci-dessus, mais utiliser regex pour imprimer chaque ligne qui ne commence pas par "Take".

 chat tom.txt | sed / ^ Prendre / d 

sed-regex-prendre

Sed est, bien sûr, incroyablement utile. Mais c'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 tandis que Sed est utilisé pour traiter et modifier le texte, Awk est principalement utilisé comme un outil d' analyse et de reporting .

Comme Sed, Awk a été développé au Bell Labs dans les années 1970. Son nom ne vient pas de ce que fait le programme, mais plutôt des 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 tandis que Sed et Awk peuvent partager des buts similaires, ils sont deux langues complètement différentes, avec deux philosophies de conception complètement différentes. Awk ressemble plus à certaines langues à usage général Comment choisir un langage de programmation pour apprendre aujourd'hui et obtenir un excellent travail en 2 ans Comment choisir un langage de programmation pour apprendre aujourd'hui et obtenir un bon travail en 2 ans Cela peut prendre des années de travail dédié à devenir un programmeur vraiment bon; Y a-t-il un moyen de choisir la bonne langue pour commencer 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 pour des choses comme l'itération et les variables (James Bruce a expliqué comment fonctionne l'itération) Les bases absolues de la programmation pour les débutants (Partie 2) 2 de notre guide des débutants absolus à la programmation, je vais couvrir les bases des fonctions, des valeurs de retour, des boucles et des conditions ... Lire la suite). En termes simples, cela 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-longueur

L'exemple suivant que j'ai vanté sans vergogne de la documentation officielle d'Awk. Mais c'est un excellent exemple du potentiel de ce langage puissant mais minuscule. C'est aussi une belle démonstration de la façon dont les choses fonctionnent comme l'itération et les variables. D'abord, créez un fichier appelé "WordCount.awk" et ajoutez les lignes suivantes.

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

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

 awk -f WordCount.awk tom.txt 

awk-wordcount
Cool, n'est-ce pas? Vous remarquerez probablement qu'ils ne sont pas dans un ordre quelconque. Vous pouvez trier les résultats en utilisant l'utilitaire de tri Unix. Mais nous allons laisser ça pour un autre jour. Nous allons rester simple.

Combiner les deux

Awk et Sed sont incroyablement puissants lorsqu'ils sont combinés. Vous pouvez le faire en utilisant des tuyaux 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 commençant par "Take" . Ensemble, tout cela ressemble à ceci:

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

Et produit ceci:

awk-longueur-sed

Maintenant, retournons ça. Nous allons commencer par supprimer toutes les lignes qui commencent par Take, puis les rediriger vers Awk, où nous comptons combien de fois 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 y a tellement de choses que vous pouvez expliquer dans un seul article. Mais j'espère avoir illustré combien Sed et Awk sont incroyablement puissants. En termes simples, ils sont une puissance de traitement de texte.

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

Avez-vous trouvé une utilisation intéressante pour Sed et Awk? Y a-t-il d'autres utilitaires Linux qui vous semblent sous-estimés? Faites-moi savoir dans les commentaires ci-dessous, et nous allons discuter.

In this article