1 Utilisation de grep, cut, join, sort
Transcription
1 Utilisation de grep, cut, join, sort
L3 UNIVERSITÉ DE CAEN Système U.F.R. de Sciences TP 3 : Unix awk Corrigé indicatif [email protected] 1 Utilisation de 1.1 Utilisation de grep, cut, join, sort grep La diculté est de bien choisir le motif an de ne ltrer que ce qui est demandé. Dans le chier passwd : 1. récupérez la ligne d'information qui correspond à l'utilisateur man ; grep 'man' /etc/passwd peut sure ici. 2. récupérez la ligne d'information qui correspond à l'utilisateur bin ; La solution précédente est insusante ici, et on doit écrire : grep '^bin:' /etc/passwd 3. récupérez la ligne d'information qui correspond à l'utilisateur dont le numéro d'identiant (uid) est 6. Il faut se prémunir des lignes où 6 peut apparaître entre des deux points autre que pour l'uid et donc écrire : grep '^[^:]*:[^:]:6:' /etc/passwd 1.2 Utilisation de cut Toujours à partir du chier passwd : 1. récupérez la liste de tous les noms de login autorisés en local sur la machine ; cut -d: -f 1 /etc/passwd 2. récupérez la liste de tous les numéros d'identiant des login autorisés en local sur la machine ; cut -d: -f 3 /etc/passwd 3. récupérez la liste de tous les noms de login autorisés en local sur la machine avec le champ commentaire ; cut -d: -f 1,5 /etc/passwd 4. récupérez la liste de tous les noms de login autorisés en local sur la machine avec seulement le nom complet issu du champ commentaire ; cut -d: -f 1,5 /etc/passwd | cut -d, -f 1 Vous devez maintenant être en mesure d'acher facilement le nom complet d'un utilisateur étant donné son uid. uid =6; cat / e t c / passwd | grep " ^ [ ^ : ] ∗ : [ ^ : ] : $uid : " | cut −d : − f 5 | cut −d , − f 1 On pourrait aussi se limiter au seul vrai login, c'est-à-dire ceux ayant pour le shell autre chose que /bin/false avec : grep −v ' / bin / f a l s e $ ' / e t c / passwd | grep " ^ [ ^ : ] ∗ : [ ^ : ] : $uid : " | cut −d : − f 5 | cut −d , − f 1 1.3 Utilisation de sort Pour changer, nous allons partir du chier group, pour : 1. acher le contenu du chier par ordre alphabétique des noms de groupe ; votre tri devrait fonctionner aussi sur le résultat de la commande : ( echo manu:x:2100: ; cat /etc/group ) ( echo manu : x : 2 1 0 0 : ; cat / e t c / group ) | s o r t − t : −k 1 ou ( echo manu : x : 2 1 0 0 : ; cat / e t c / group ) | s o r t − t : +0 Pour manu se retrouve bien devant man , il faut avoir dans son environnement LANG=C, autrement le : est pris comme une lettre, et man se retrouve avant ! 2. acher le contenu du chier par ordre numérique des identiants de groupe. s o r t −n − t : +2 / e t c / group avec l'option -k les champs sont numérotés à partir de 1 : s o r t −n − t : −k 3 / e t c / group 1.4 Utilisation de join Acher la liste de tous les noms de login de la machine avec leur groupe. Note : join nécessite que les deux chiers à croiser soient triés alphabétiquement et non numériquement sur les clés de jointure. #! / b i n / sh # nom de l o g i n avec l e u r groupe # on peut donner l ' e n t r é e s t a n d a r d à j o i n avec − , # mais comme i l f a u t une deuxième e n t r é e i l f a u t f a i r e un f i c h i e r t e m p o r a i r e tmpgroup=/tmp/ group$$ t r a p ' / bin /rm − f $tmpgroup ' 0 1 2 3 15 grep −v "^#" / e t c / group | s o r t − t : −k 3 >$tmpgroup grep −v "^#" / e t c / passwd | s o r t − t : −k 4 | j o i n − t : − j 1 4 − j 2 3 −o 1 . 1 2 . 1 − $tmpgroup 1.5 Utilisation de l'annuaire LDAP On peut refaire les exercices de cette section en prenant comme donnée non pas les chiers passwd et group locaux à la machine mais en prenant les données de l'annuaire LDAP obtenues par les commandes : getent passwd et getent group. uid =405; g e t e n t passwd | grep " ^ [ ^ : ] ∗ : [ ^ : ] : $uid : " | cut −d : − f 5 permet d'obtenir en résultat : Jacques Madelaine. 2 Utilisation de awk 2.1 Refaire les exercices du 1.1 et du 1.2 en awk. 2 | cut −d , − f 1 2.2 Utilisation de grep La diculté est de bien choisir le motif an de ne ltrer que ce qui est demandé. Dans le chier passwd : 1. récupérez la ligne d'information qui correspond à l'utilisateur man ; awk '/man/' /etc/passwd peut sure ici. 2. récupérez la ligne d'information qui correspond à l'utilisateur bin ; La solution précédente est insusante ici, et on doit écrire : awk '/^bin:/' /etc/passwd 3. récupérez la ligne d'information qui correspond à l'utilisateur dont le numéro d'identiant (uid) est 6. Il faut se prémunir des lignes où 6 peut apparaître entre des deux points autre que pour l'uid et donc écrire : awk '/^[^:]*:[^:]:6:/' /etc/passwd 2.3 Utilisation de cut Toujours à partir du chier passwd : 1. récupérez la liste de tous les noms de login autorisés en local sur la machine ; awk -F: '{print $1}' /etc/passwd ou en plus compliqué : awk 'BEGIN { FS=":"} {print $1}' /etc/passwd 2. récupérez la liste de tous les numéros d'identiant des login autorisés en local sur la machine ; awk -F: '{print $3}' /etc/passwd 3. récupérez la liste de tous les noms de login autorisés en local sur la machine avec le champ commentaire ; awk -F: '{print $1,$5}' /etc/passwd 4. récupérez la liste de tous les noms de login autorisés en local sur la machine avec seulement le nom complet issu du champ commentaire ; awk -F: '{print $1,$5}' /etc/passwd | awk -F, '{print $1}' ou en un seul appel à awk : awk -F: '{i=index($5,","); print $1,(i==0 ? $5 : substr($5,1,i-1))}' /etc/passwd Vous devez maintenant être en mesure d'acher facilement le nom complet d'un utilisateur étant donné son uid. Remarquer l'astuce an que le shell remplace la valeur de uid : uid=6; awk -F: '/^[^:]*:[^:]:'"$uid"':/ { i=index($5,","); print (i==0 ? $5 : substr($5,1,i-1))}' /etc/passwd On pourrait aussi se limiter au seul vrai login, c'est-à-dire ceux ayant pour le shell autre chose que /bin/false avec : awk -F: '/:\/bin\/false$/ { next } /^[^:]*:[^:]:'"$uid"':/ { i=index($5,","); print (i==0 ? $5 : substr($5,1,i-1))}' /etc/passwd 3