Grep et sed Demystified

Grep. Vous l'entendez beaucoup. Vous voyez ces types informatiques cryptiques saisir la commande, les administrateurs système la mentionnant en passant, vous la voyez même dans certains scripts shell. Il semble que l'une de ces choses existe, mais ne vous concerne pas. Cet article va changer cela - nous allons expliquer et jeter un coup d'œil sur grep (et son ami moins célèbre sed) dans ce nouvel opus d'OS X Demystified.


introduction

Grep

Grep est un utilitaire de ligne de commande permettant de rechercher et de filtrer un type d’entrée de texte en fonction des paramètres que vous lui indiquez.

Grep est un utilitaire de ligne de commande permettant de rechercher et de filtrer une sorte d’entrée de texte en fonction de paramètres que vous lui communiquez. En d'autres termes, il s'exécute dans le terminal (Applications → Utilitaires → Terminal), et est utilisé exclusivement en tapant des commandes. Il y a bien sûr des interfaces graphiques qui aident un peu, mais aucune n'est aussi puissante ni aussi polyvalente que l'utilisation de la ligne de commande à corps nu, c'est pourquoi nous allons nous concentrer sur.

C'est bien, mais que fait-il réellement? Cela semble-t-il trop vague? Voici un exemple. Supposons que vous avez un bloc de texte dans un fichier appelé jungle.txt avec cinq lignes:

Un lion dort dans la jungle Un lion dort ce soir Un tigre se réveille dans le marais Le perroquet observe Wimoweh, wimoweh, wimoweh, wimoweh

Afin de trouver la ligne qui contient le mot tigre, nous utilisons grep ainsi:

grep tiger jungle.txt

Le résultat qui nous est donné est:

"Un tigre se réveille dans le marais"

Ok, c'est clair, non? Faisons un pas en arrière si.

Mise à niveau de Grep

Comme il s'avère que Mac grep est plus lent que GNU grep, faisons d'abord une mise à jour. Pour installer un grep plus rapide, entrez les informations suivantes dans Terminal et appuyez sur entrer:

brew install https://raw.github.com/Homebrew/homebrew-dupes/master/grep.rb

Veuillez noter que vous devez avoir installé Homebrew pour pouvoir le faire. Pour savoir comment installer Homebrew, consultez mon article précédent..

Un large éventail de geeklets aura souvent recours à grep pour récupérer les données de gros fichiers texte ou de sites Web collectés.

Qu'avons-nous accompli en effectuant cette mise à niveau? De nombreuses applications utilisent l'outil grep natif installé pour fonctionner. Par exemple, un large éventail de geeklets aura souvent recours à grep pour extraire des données de gros fichiers texte ou de sites Web collectés. Ainsi, tout vos geeklets utilisant grep seront désormais plusieurs fois plus rapides dans leurs parties greppy. En outre, vous pouvez parfois avoir besoin de grep d'une sorte de journal des erreurs (supposons que vous ayez un journal d'erreurs énorme d'une application et que le service de support de l'application vous demande de les coller "grep port-1723"). Si le journal contient des millions de lignes de code, vous pourriez gagner beaucoup de temps en utilisant ce grap beaucoup plus rapide..

Une fois que Homebrew a installé votre nouveau grep, procédez comme suit si vous avez créé les fichiers. Sinon, lancez-les, puis exécutez la commande pour vous assurer que tout fonctionne.

grep tiger jungle.txt

Sed

Sed est un stream editor. En termes clairs, il faut une entrée, le modifie et affiche le contenu modifié. Qu'il s'agisse de l'édition dans un fichier ou directement du terminal, cela n'a aucune importance pour sed: il possède une fonction hautement avancée et configurable, et l'exécute au mieux de ses possibilités..

Sed prend un peu de texte, une commande sur la façon de le changer, et produit un résultat modifié

Alors, où est sed utilisé? Éditer le contenu des fichiers et autres, bien sûr, mais il se trouve que cela fonctionne parfaitement, main dans la main avec grep. Voyons d'abord quelques exemples de sed pur. Tapez le texte suivant dans Terminal:

echo "Bonjour"

et appuyez sur Entrée. Le terminal dit bonjour. Maintenant tapez

echo "Bonjour" | sed 's / Hell / Heaven /'

et appuyez sur Entrée. Vous devriez voir "Heaveno". Qu'est-ce qui vient juste de se passer? Vous voyez, sed fonctionne en prenant deux arguments. Le premier est le flux, l'entrée, et le second est une chaîne (vous pouvez voir que c'est une chaîne parce qu'elle est entre guillemets) qui lui indique les actions à effectuer sur le premier argument. Dans notre cas c'est:

  • s (substitut)
  • / (délimiteur - dans notre cas, barre oblique, voir les alternatives au paragraphe suivant)
  • Hell (modèle d'expression régulière à rechercher)
  • Heaven (chaîne de remplacement)

Le deuxième élément de la liste mentionne des alternatives au délimiteur de barre oblique; Parfois, ils s'avèrent très utiles car ils doivent par exemple écrire des URL ou des chemins de fichiers. Prenons par exemple l'URL mon dossier / mon dossier / mon fichier. Si nous mettons cela dans sed afin de le remplacer par myotherfolder / myotherfile, le paramètre ressemblerait à ceci: s / mon dossier / mon dossier / mon dossier / mon dossier / mon dossier / ce qui est juste un gros sac de bêtises - sed ne peut absolument pas savoir lequel de ces fragments est l'expression rationnelle et lequel est la chaîne de remplacement. Par conséquent, nous aurions besoin de échapper les barres obliques dans notre chemin de fichier avec une barre oblique inverse, de sorte que chaque barre oblique dans le chemin se transforme en \ /. Je suppose que vous pouvez voir le problème. Le nouveau paramètre sed ressemble à ceci:

sed 's / myfolder \ / mysubfolder \ / myfile / myotherfolder \ / myotherfile /'

Ce format difficilement lisible est appelé "palissade" et, pour l’éviter, sed prend en charge différents délimiteurs tels que le soulignement (_), les deux points (:) et le tuyau (|). Par exemple, si nous voulions utiliser le caractère de pipe comme délimiteur, nous aurions le résultat suivant:

Le dossier | myfolder / mysubfolder / myfile | myotherfolder / myotherfile | 'de sed

Beaucoup mieux, non?

Une autre chose, cependant. Nous avons dit que sed prenait deux arguments, mais nous n'en donnions jamais qu'un - juste après le sed commander. C’est à cause du caractère de pipe après notre écho commander. Le tuyau sert à diriger la sortie de l'opérande gauche dans l'entrée de l'opérande droit. Dans notre cas, le personnage de pipe a dit à la sed programme "Prenez comme entrée ce que vous recevez de ce que vous voyez à gauche de moi". sed Je ne sais pas du tout qu'il y a un écho - il n'a pas besoin de savoir. Tout ce qu'il sait, c'est que cela prend de la saisie de texte. Discuter du pipeline plus en détail dépasse le cadre de cet article, mais n'hésitez pas à le lire si cela vous intéresse..

Le tuyau sert à diriger la sortie de l'opérande gauche dans l'entrée de l'opérande droit.

Alors, comment pouvons-nous le combiner avec grep? C'est exactement pareil. En prenant notre exemple précédent, entrons ce qui suit dans le terminal.

grep tiger jungle.txt | sed 's / swamp / desert /'

et nous obtenons la sortie

"Un tigre se réveille dans le désert"

Voyons maintenant un cas d'utilisation réel.


Application dans le monde réel

Pour notre "dissection", nous allons prendre la commande grep + sed d'un geeklet météo populaire et l'expliquer au fur et à mesure. Allez-y et téléchargez l'exemple de geeklet. Une fois téléchargé, ouvrez-le avec un éditeur de texte quelconque. Vous remarquerez que ce n'est pas plus qu'un fichier XML. Si vous n'avez aucune expérience en XML, ne vous inquiétez pas - Josh a déjà publié un article étonnant sur Geektool et ses tenants et aboutissants. Nous n'allons pas nous occuper de rien du tout aujourd'hui. Au lieu de cela, concentrons-nous sur la partie entre le Mots clés:

 curl --silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(Conditions actuelles: | C// '-e' /// '-e' /<\/b>// '-e' /
// '-e' s /// '-e' /<\/description>// '

Ce désordre cryptique est une simple commande Terminal - rien de plus. Vous pouvez même le coller dans Terminal et vous obtiendrez les conditions météorologiques de la ville de Makati aux Philippines, que l'auteur initial a définies pour le rapporter. Le geeklet dit à Geektool d'exécuter ladite commande et de prendre le résultat obtenu en l'exécutant. Jetons un coup d'oeil, segment de tuyau par segment de tuyau, et expliquons en détail:

curl --silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c"

boucle est un outil de transfert de données avec une syntaxe d'URL. Cela signifie qu'il peut accéder à une URL et récupérer des données à partir de celle-ci..

Curl est un outil utilisé pour transférer des données avec une syntaxe d'URL sur la ligne de commande.

Si vous collez l'URL citée dans votre navigateur (ou cliquez simplement ici), vous remarquerez que vous obtenez un fichier XML de Yahoo! - ils ont un service de conditions météo en direct auquel vous pouvez facilement accéder et récupérer des données. C’est la même chose que vous obtenez lorsque vous boucle il; seulement au lieu du navigateur, l'entrée est envoyée au terminal. le --silencieux flag indique à Curl de ne rien dire sur la progression, le statut et les erreurs, de sorte que le seul résultat obtenu soit celui dont nous avons besoin (ou rien, s'il échoue).

grep -E '(Conditions actuelles: | C 

Le caractère de pipe suit, ce qui signifie la sortie de boucle est envoyé dans grep en entrée. Grep reçoit ce fichier XML téléchargé au format texte et effectue une recherche à l'aide du bouton -E drapeau, qui signifie expression régulière étendue. La valeur recherchée est soit la chaîne Conditions actuelles: ou C (le caractère de pipe à l'intérieur d'un ereg signifie "ou"). Pour plus de précisions, si vous avez tapé ce qui suit dans notre exemple précédent:

grep -E '(tigre | weh)' jungle.txt

vous auriez

Un tigre se réveille dans le marais Wimoweh, wimoweh, wimoweh, wimoweh

car il retourne toutes les lignes contenant "tiger" ou "weh".

Donc, si nous combinons ces deux premiers segments de tuyau de la manière suivante:

curl --silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(Conditions actuelles: | C 

nous obtenons ce qui suit:

Conditions actuelles:
Haze, 23 C

Mais nous voulons seulement obtenir "Haze, 23 C". C'est ici que sed entre. Nous remplaçons simplement tout ce que nous ne voulons pas par une chaîne vide (rien) pour la supprimer.

sed -e '/ Conditions actuelles: //' -e 's /
// '-e' /// '-e' /<\/b>// '-e' /
// '-e' s /// '-e' /<\/description>// '

le -e le drapeau est court pour --expression = et nous permet de chaîner plusieurs sed commandes. Par conséquent, nous remplaçons d'abord la chaîne "Conditions actuelles:" par rien, puis remplaçons
avec rien, etc. jusqu’à ce que nous arrivions au bout de la ligne ().

En fin de compte, tout ce qui reste est "Haze, 23 C".

Je devrais mentionner que le geeklet que nous avons utilisé comme exemple aurait pu être beaucoup mieux fait, mais la complexité de la commande utilisée semblait être une très bonne occasion de couvrir plusieurs exemples à la fois. L’auteur aurait pu, par exemple, simplement extraire la ligne contenant "Conditions actuelles:" et la ligne suivante avec les -Un 1 combinaison de drapeaux, sans s'appuyer sur le symbole de la température (dans ce cas, nous nous appuyons sur Celsius, mais si nous voulions Fahrenheit? L'auteur C la recherche de grep échouerait). Néanmoins, l’exemple servait à quelque chose - c’était vous présenter le monde merveilleux de grep et sed.


Plus de ressources

Bien que l'enseignement des expressions régulières avancées et des fonctionnalités plus profondes de grep, curl et sed dépasse de loin le cadre de cet article (et de ce site Web), n'hésitez pas à consulter les ressources suivantes si vous souhaitez en savoir plus..

  • Guide Sed
  • Guide du débutant à grep
  • Exemples pratiques de commandes Unix Grep
  • Documentation Grep chez IBM
  • Curl documentation
  • Expressions régulières

Conclusion

Vous connaissez maintenant les bases de grep, sed et même boucle. Bien que ce cours intensif ait été loin d’être suffisant pour faire de vous un expert, nous espérons que cela a été au moins suffisant pour vous intéresser à essayer votre propre collecte et interrogation de données. À tout le moins, il y a quelque chose à dire autour de la fontaine d'eau lundi.

J'espère que vous avez apprécié le jeu et que si vous êtes prêt à relever le défi, essayez de réécrire le Geeklet afin qu'il ne soit pas seulement agnostique avec le symbole de température, mais également pour déterminer seul l'emplacement de l'utilisateur, sans avoir à modifier manuellement 'paramètre dans le Yahoo! URL.