GNU/Linux >> Tutoriels Linux >  >> Linux

3 commandes Linux incontournables pour la manipulation de texte

Les administrateurs système utilisent un nombre incalculable d'outils en ligne de commande, et vous utilisez probablement régulièrement les trois abordés dans cet article :grep , sed , et awk . Mais connaissez-vous toutes les façons dont vous pouvez les utiliser pour manipuler du texte ? Si ce n'est pas le cas (ou si vous n'êtes pas sûr), continuez à lire.

Avant de commencer, voici l'origine des noms des commandes :

  1. grep :Selon Wikipédia, le nom " vient du ed commande g/re/p (g rechercher globalement un r e régulier xpression et p rint matching lines), ce qui a le même effet." ed est un "éditeur de texte orienté ligne". Même pour quelqu'un qui aime la ligne de commande, l'édition de fichiers ligne par ligne semble trop démodée, mais les gens devaient commencer par quelque chose dans les temps anciens ).
  2. sed :Le nom vient de son utilisation principale, en tant que s streamer ed itor.
  3. awk :Son nom vient des initiales de ses auteurs (Aho, Weinberger et Kernighan). Si le nom de Kernighan vous dit quelque chose (jeu de mots), c'est parce que cet informaticien canadien a contribué à la création d'Unix et a co-écrit le premier livre sur le langage C.

C'est excellent pour tracer l'arbre généalogique des commandes, mais ce qui compte vraiment, c'est que ces commandes sont très utiles pour la manipulation de texte.

Dans les exemples suivants, j'utiliserai un fichier nommé quotes.txt pour illustrer comment utiliser les commandes. Voici le contenu de ce fichier :

$ cat quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55

"Not only does God play dice but... he sometimes throws them where they cannot be seen."
- Stephen Hawking

"I regard consciousness as fundamental..."
- Max Planck

"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

"[T]he atoms or elementary particles themselves are not real; they form a world of potentialities or possibilities rather than one of things or facts."
- Werner Heisenberg

grep

La façon la plus simple d'utiliser grep est :

$ grep universe quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Cet exemple fournit la chaîne à rechercher (univers) et l'endroit où la rechercher (quotes.txt).

S'il y a des espaces dans la chaîne que vous souhaitez rechercher, vous devez mettre des guillemets autour :

$ grep "the universe" quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Quelques variations courantes lors de l'utilisation de grep sont :

  • Ignorer la casse :grep -i string-to-search filename
  • Recherche dans plusieurs fichiers :grep -i string-to-search *.txt

Vous pouvez rechercher une expression régulière :

$ grep "191[0-9]" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55

Si vous souhaitez activer les modèles d'expression régulière étendus pour utiliser des symboles tels que + , ? , ou | , vous pouvez utiliser le egrep commande, qui est un raccourci pour ajouter le -E indicateur pour grep . Cela vous permet également de rechercher plusieurs chaînes :

$ egrep -i "albe|hawk" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55
- Stephen Hawking

Pour afficher les lignes contenant le mot "univers" plus la ligne suivante (afin d'inclure le nom de l'auteur) :

$ grep -i universe -A 1 quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
--
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

Comme vous pouvez probablement le deviner, vous pourriez en afficher plus lignes en passant un nombre différent. Ou vous pouvez afficher les lignes avant en utilisant le drapeau -B .

Jusqu'à présent, j'ai montré grep s'exécutant seul, mais il est très courant de l'avoir dans une chaîne de commandes :

$ echo "Authors who mentioned 'universe'"; cat quotes.txt | grep -i universe -A 1 | grep "^-"

- Albert Einstein, The Born-Einstein Letters 1916-55
- Carl Sagan

[ Vous pourriez également être intéressé par la lecture de 11 commandes Linux dont je ne peux pas me passer . ]

sed

Mon utilisation préférée de sed est de remplacer les chaînes dans les fichiers. Par exemple :

$ cat quotes.txt | sed 's/universe/Universe/g'

Cela remplacera universe avec Universe et envoyer le résultat à stdout . Le g flag signifie "remplacer toutes les occurrences de la chaîne dans chaque ligne."

Voici quelques variantes :

  • Remplacez la chaîne uniquement si elle se trouve dans les trois premières lignes :
    sed '1,3 s/universe/Universe/g' quotes.txt
  • Remplacer le n -ième occurrence d'un motif dans une ligne (par exemple, la deuxième occurrence) :
    sed 's/universe/Universe/2' quotes.txt

Ces exemples ne modifient pas le fichier d'origine. Si vous voulez sed pour changer le fichier en place, utilisez -i :

$ sed -i 's/universe/Universe/g' quotes.txt

Si vous utilisez le -i flag, assurez-vous que vous savez exactement quoi et combien d'occurrences sera affecté, car il modifiera le fichier d'origine. Pour le savoir, vous pouvez lancer un grep et recherchez d'abord le motif.

[ Vous voulez tester vos compétences d'administrateur système ? Faites une évaluation des compétences aujourd'hui. ]

mauvais

Le awk est très puissant, offrant de nombreuses options pour le traitement des fichiers texte.

La plupart des situations où j'utilise awk impliquent le traitement de fichiers avec une structure (colonnes) raisonnablement prévisible, y compris le caractère utilisé comme séparateur de colonne.

Quand awk traite un fichier, il découpe chaque ligne à l'aide du "séparateur de champs" (variable interne FS , qui est par défaut le caractère espace). Chaque champ est affecté à des variables positionnelles ($1 contient le premier champ, $2 contient le second, et ainsi de suite. $0 représente la ligne complète).

Vous pouvez également appliquer des filtres à chaque ligne. Par exemple :

$ cat quotes.txt | awk '/universe/ { print NR " - " $0 }'

1 - "God does not play dice with the universe."
10 - "The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Les commandes passées à awk utilisez des guillemets simples (c'est comme passer un mini-programme à interpréter) :

  • Le /universe/ la partie indique awk pour sélectionner uniquement les lignes qui correspondent à ce modèle.
  • Le programme "principal" va entre les accolades.
  • NR est la variable interne qui contient le numéro de l'enregistrement courant, par exemple, le numéro de la ligne courante.
  • J'ai ajouté le " -" chaîne pour l'esthétique.

Les variables internes dans awk sont :

  • NR  :Le nombre total d'enregistrements d'entrée vus jusqu'à présent par la commande
  • NF  :Le nombre de champs dans l'enregistrement d'entrée actuel
  • FS :Le séparateur de champ de saisie (un espace par défaut)

Voici un exemple utilisant un format de fichier plus "prévisible" :

$ cat /etc/passwd | awk '/nologin/ { FS=":"; print $1 }'

(output omitted)
...
redis
akmods
cjdns
haproxy
systemd-oom

Dans ce dernier exemple :

  • /nologin/ sélectionne uniquement les lignes qui contiennent ce modèle.
  • FS=": "; définit le séparateur de champs sur : au lieu de la valeur par défaut (espace).
  • print $1 imprime le premier champ de chaque ligne (en considérant que le séparateur est : ).

En savoir plus

Ce sont quelques exemples simples d'utilisation de grep , sed , et awk .

Si vous lisez le man pages pour chacun, vous remarquerez de nombreux paramètres et utilisations supplémentaires pour ces commandes pratiques.

Pour les cas d'utilisation simples et les choses que vous ne faites que de temps en temps, il est toujours bon d'avoir des outils comme ceux-ci dans votre boîte à outils.

Si l'action requise est plus complexe, il vaut la peine de se demander si ces outils ont toujours un sens pour vous. Pour un cas d'utilisation en entreprise ou pour gérer "tout en tant que code", je recommande d'utiliser Ansible. Les modules Ansible ont des fonctionnalités similaires qui vous permettent d'émuler les opérations décrites ci-dessus, avec l'avantage que les modules Ansible ont généralement une idempotence et que le processus complet sera documenté quelque part (comme dans votre dépôt Git interne).


Linux
  1. Mes commandes Linux préférées pour optimiser les images Web

  2. 20 commandes Linux essentielles pour chaque utilisateur

  3. 3 feuilles de triche Linux essentielles pour la productivité

  4. Aide-mémoire pour les commandes Linux courantes

  5. 12 commandes utiles pour filtrer le texte pour des opérations de fichiers efficaces sous Linux

Commande Grep sous Linux (Rechercher du texte dans des fichiers)

Principales commandes Linux pour les administrateurs système

eSpeak NG - Un synthétiseur de synthèse vocale pour Linux

Rechercher du texte dans des fichiers sous Linux à l'aide de grep

Commandes pour la gestion des processus sous Linux

Matériel de terminal texte (pour Linux)