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

Documents pareils