Table of Contents

Manipulation simple de texte : grep, cut, tr, join

Navigation rapide : Lundi / Mardi / Mercredi / Jeudi / Vendredi

L'objectif ici est d'utiliser les outils grep, join, cut et tr pour afficher, pour chaque utilisateur du système ayant /bin/bash comme shell, une ligne avec son login, son numéro d'utilisateur, son numéro de groupe, son nom complet, et son mot de passe chiffré.

Filtrer des lignes avec grep

La commande grep permet de sélectionner les lignes (terminées par un retour chariot) d'un fichier texte ou d'un flux de texte reçu sur son entrée standard. La sélection se fait via une expression régulière passée en argument. Utilisez grep pour ne retenir que les utilisateurs ayant /bin/bash comme shell dans le fichier /etc/passwd.

réponse

1: grep ':/bin/bash' /etc/passwd

Fusionner des lignes de fichiers textes avec join

La commande join opère une jointure entre les lignes de deux fichiers textes distincts partageant un même identifiant (clé). La seule contrainte imposée par la commande est que les lignes des deux fichiers soient triées de façon croissante selon l'identifiant. Pour cela nous allons utiliser la commande sort.

Regardons comment se présente une ligne du fichier /etc/passwd

bin:x:2:2:bin:/bin:/bin/sh

et du fichier /etc/shadow

bin:*:15250:0:99999:7:::

Sur chaque ligne, les différents champs d'informations sont séparés par le caractère : et c'est le nom de login qui identifie la ligne dans les deux cas (1er champ). Commencez par trier les deux fichiers (en plaçant le résultat dans un fichier temporaire) avec la commande sort. L'option -t vous permet d'indiquer le caractère de séparation des champs, et l'option -k le numéro du champ contenant la clé de tri.

réponse

1: sort /etc/passwd -t : -k 1 > passwd.sorted
2: sort /etc/shadow -t : -k 1 > shadow.sorted

Nous pouvons maintenant utiliser la commande join pour réunir les informations contenus dans /etc/passwd et /etc/shadow. En plus des options détaillées ci-dessous, la commande prend deux arguments sur sa ligne de commande représentant les deux fichiers à traiter. Le résultat sera affiché sur la sortie standard.

join [ options ] <file1> <file2>

Les options de la commande join sont les suivantes :

A partir des fichiers passwd.sorted et shadow.sorted générés précédemment, utiliser la commande join pour réunir les lignes en fonction du login (1er champ de chaque fichier).

reponse

1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted

Combiner maintenant cela avec la commande grep précédente pour ne retenir que les lignes pour lesquelles le shell bash (/bin/bash) est utilisé.

reponse

1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted | grep '/bin/bash'

Sélectionner certains champs avec la commande cut

Toujours dans le cas de fichiers textes où l'information est structurée en lignes avec plusieurs champs séparés par un caractère (: , espace), la commande cut permet de sélectionner certains champs. Ses options sont les suivantes :

Par exemple, la commande ci-dessous affiche le login (champ n°1) et le nom complet (champ n°5) des utilisateurs du fichier /etc/passwd.

cut -d ':' -f 1,5 /etc/passwd

Utilisez la commande cut pour n'afficher que les champs login, numéro d'utilisateur, numéro de groupe et nom complet de chaque utilisateur.

reponse

1: cut -d ':' -f 1,3,4,5 /etc/passwd

Utilisez la commande cut pour n'afficher que le mot de passe chiffré des utilisateurs, à partir du fichier shadow.

reponse

1: cut -d ':' -f 2 /etc/shadow

Combiner cela avec les précédentes commandes (join et grep) pour n'afficher que les champs login, numéro d'utilisateur, numéro de groupe, nom complet et mot de passe chiffré de chaque utilisateur ayant /bin/bash comme shell.

reponse

1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted| grep '/bin/bash' | cut -d ':' -f 1,3,4,8

Remplacer des caractères avec la commande tr

La commande tr prend en paramètres deux options. Son action est de remplacer sur le flot de l'entrée standard le caractère spécifié en première option par celui spécifié en seconde option. Ainsi l'exemple ci-dessous remplace les : du fichier /etc/passwd par des #. Le résultat est affiché sur la sortie standard.

tr ':' '#' < /etc/passwd

Combiner la commande tr avec celle de l'exercice précédent pour remplacer les : (deux points) par des espaces.

reponse

1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted| grep '/bin/bash' | cut -d ':' -f 1,3,4,8 | tr ':' ' '