Pages

dimanche 26 janvier 2014

Exercice corrigés Linux : Outils de manipulation de texte

Exercice 1:

Recherchez dans le fichier /etc/passwd :
- L’entrée correspondant à votre login (solution indépendante du login).
- Le nombre de lignes contenant la chaîne de caractères : MICHEL ou michel.
- Le nombre de lignes contenant la chaîne de caractères : /home/.

Correction exercice 1 :

§ Recherche dans /etc/passwd de:
§ mon login :
kyle> grep $LOGNAME /etc/passwd
kyle:!:201:200:Alberto XSTRA:/home/xstra:/bin/bash
§ Nombre de lignes contenant MICHEL ou michel
kyle> grep –i MICHEL /etc/passwd | wc –l
§ Nombre de lignes contenant /home/
kyle> grep –c '/home/' /etc/passwd
27
kyle>

Exercice 2:

Recherchez dans le fichier /etc/inetd.conf :
- Le nombre de lignes contenant un point .
- Le nombre de lignes ne commençant pas par # .
- Toutes les lignes de plus de 50 caractères.
- Toutes les lignes de plus de 50 caractères (hors commentaires).

Correction exercice 2 :

kyle> fgrep . /etc/inetd.conf
§ attention au point avec grep
kyle> grep –cv '^#' /etc/inetd.conf
kyle> awk 'length>50' /etc/inetd.conf
kyle> awk '!/^#/ && length>50' /etc/inetd.conf

Exercice 3:

Écrivez une commande awk permettant de lister le contenu d’un fichier sans les
lignes vides et en les numérotant. Testez votre solution avec l’entrée standard.

Correction exercice 3 :

La solution awk est la suivante:
kyle> awk '!/^$/ {n++;print n,$0}'
§ tapez plusieurs lignes dont des vides
§ terminez par <ctrl D>
§ observez le résultat
§ Sous linux, ce résultat est obtenu par :
kyle> cat b

Exercice 4:

Le fichier annuaire.txt contient des adresses sous la forme suivante :
Prénom NOM Date-de-naissance Sexe Numéro-de-téléphone
Le fichier est supposé très long, et il peut contenir des erreurs comme dans
l’exemple ci-dessous :
Georges TARTEMPION 12 2 1967 M 038898422524
Hortense HYABLANT 7 4 1944 F 0146872556
Adrien DUBOUCHON 27 11 1938 M 0154896372
Ludwig SCHMILLBLEERCK 28 12 1957 M 0258459887
Antonio VAVILDA 16 5 1937 M
Hughes CARPETTE 8 11 1958 M 0123568629
J'en ai assez de ce travail fastidieux!
Dagobert ELOY 14 7 1947 M 0225415487
ligne vide
Anatole SUISSE 1 2 1965 n 4
Antonino SZWPRESWKY 16 5 8937 M 0298358745
Écrire les trois commandes grep permettant de :
- supprimer les lignes vides ;
- trouver les gens qui n’ont pas le téléphone ;
- trouver les lignes non conformes ;
Écrire une solution awk pour le dernier cas.

Correction exercice 4 :

Supprimer les lignes vides
kyle> grep v '^$' <fich1 >fich2
Trouver les gens qui n’ont pas le téléphone
kyle> egrep '[^0 9]{8}$' fich1
Trouver les lignes non conformes
kyle> grep v '^[A Z][a z]+ [A Z]+ [0 9]{1,2} \
[1 9][0 2]? 19[0 9]{2} F|M [0 9]{8}$' fich1
Cette solution est approximative. awk permet une analyse beaucoup plus fine. Le
fichier check.awk contient :
{error=0
if (NF != 5) error++
if ($1 !~ /[A Z][a z]+/) error++
if ($2 !~ /[A Z]+/) error++
combien=split($3,ladat," ")
if (combien != 3) error++
if (ladat[1] < 1 || ladat[1] > 31 ) error++
if (ladat[2] < 1 || ladat[2] > 12 ) error++
if (ladat[3] < 1789 || ladat[3] > 2002 ) error++
if (length($4) != 1) error++
if ($4 !~ /[MF]/) error++
if (length($5) != 10) error++
if ($5 !~ /0[0 9]{9}/) error++
if (error != 0) print NR,error,$0
}
Ce qui signifie : pour chaque ligne (condition manquante) l’action à entreprendre
consiste à : mettre la variable error à zéro, variable qui sera incrémentée pour chaque
anomalie détectée. Les vérifications sont ensuite faites dans l’ordre.
Vérifier que la ligne comporte cinq champs
Le premier champ doit être une majuscule suivie de minuscules
Le deuxième champ doit être une suite de majuscules
Couper le troisième champ en sous-champs sur le caractère "-"
Vérifier qu’il y a trois sous-champs
Que ces trois sous-champs ont des valeurs plausibles
Vérifier que le quatrième champ contient un seul caractère
Et que ce caractère est "M" ou "F" et rien d’autre
Vérifier que le cinquième champ comporte dix caractères
Et qu’il contient 0 suivi de dix chiffres
La commande suivante liste les lignes non conformes, en les faisant précéder du
numéro de ligne et du nombre d’erreurs détectées :
kyle> awk –posix –f check.awk annuaire.txt
1 1 Georges TARTEMPION 12 2 1967 M 038898422524
5 3 Antonio VAVILDA 16 5 1937 M
7 11 J'en ai assez de ce travail fastidieux!
9 11 ligne vide
10 3 Anatole SUISSE 1 2 1965 n 4
11 1 Antonino SZWPRESWKY 16 5 8937 M 0298358745

Exercice 5:

Listez les noms de login de tous les utilisateurs de votre système qui n’ont pas de
programme de démarrage (dans /etc/passwd).

Correction exercice 5 :

Il faut tester si le septième champ du fichier /etc/passwd est vide.
kyle> awk –F: '$7 = "" {print $1}' /etc/passwd

Exercice 6:

Les messages électroniques SMTP sont constitués exclusivement de caractères
ASCII imprimables (pas de caractères spéciaux). Leur structure est simple : un entête
précède le corps du message.
L’en-tête commence toujours par une ligne : "From " (From suivi d’un espace). La
fin de l’en-tête est toujours signalée par une ligne vide. Vous savez que votre boite
d’entrée est le fichier /var/spool/mail/$LOGNAME. Vous savez donc tout ce
qu’il faut savoir pour écrire un shell script qui envoie sur sa sortie standard :
- le nombre de messages en attente dans votre boite d’entrée ;
- les champs "From: " et "Subject: " du dernier message.

Correction exercice 6 :

Le fichier chkmail.awk contient :
/^From / {n++}
/^From: / {FROM=$0}
/^Subject: / {SUBJ=$0}
END {print n," messages";print FROM;print SUBJ}
Le fichier checkmail contient le script suivant :
#!/bin/sh
awk f chkmail.awk /var/spool/mail/$USER
Le lancement de ce script donne le résultat suivant :
xstra> ./checkmail
3 messages
From: jpa@pinson.u strasbg.fr
Subject: ou en est le chapitre 14 ???

Exercice 7:

Améliorez le script précédent pour qu’il fasse son travail deux fois par minute.

Correction exercice 7 :

Le script checkmail est modifié de la façon suivante :
#!/bin/sh
while true ; do
awk f chkmail.awk /var/spool/mail/$USER
sleep 30
done
Et il est maintenant lancé en tâche de fond :
kyle> ./checkmail &

Exercice 8:

Améliorer le script précédent pour qu’il reste silencieux si aucun message n’est
arrivé dans la période qui précède.

Correction exercice 8 :

Le script checkmail est modifié de la façon suivante :
#! /bin/sh
MABOITE=/var/spool/mail/$USER
STAMP=/tmp/timestamp.$USER
# ce fichier sert a connaitre l'instant auquel j'ai
# remarque une modification de ma boite aux lettres
rm –f $STAMP
while true ; do
if [ s $MABOITE ] ; then
if [ $MABOITE –nt $STAMP ] ; then
clear;
awk f chkmail.awk $MABOITE
touch $STAMP
fi
fi
sleep 30
done

Exercice 9:

Si vous travaillez dans l’environnement X11, lancez ce script en background dans
une petite fenêtre dans un coin de votre écran. Il est supérieur au programme xbiff
à deux points de vue :
- vous savez si le message qui vient d’arriver mérite le dérangement ;
- vous avez la satisfaction de l’avoir fait vous-même.

Correction exercice 9 :

kyle> xterm –geometry 60x7 0+0 +sb e ./checkmail &

Exercice 10:

Écrire un script qui lit un message sur son entrée standard et recopie :
- l’en-tête du message dans le fichier "./_header" ;
- le corps du message dans le fichier "./_body".
Un tel script est l’outil de base permettant d’automatiser le traitement des messages
à l’arrivée. Écrire une solution sed et une solution awk.

Correction exercice 10:

Le fichier splitmail.sed contient :
#n
1,/^$/w _header
/^$/,$ {
 /^$/d
w _body
}
La commande sed traitant le message est :
kyle> cat message | sed –f splitmail.sed
Le fichier splitmail.awk contient :
BEGIN {FICH = "_header"}
/^$/ {FICH = "_body"}
{print > FICH }
La commande awk traitant le message est :
kyle> cat message | awk –f splitmail.awk

Exercice 11:

Chercher un motif dans un fichier avec egrep, c’est facile :
egrep 'ere' fichier
Remplacer une chaîne qui vérifie une expression régulière par une nouvelle chaîne,
c’est facile aussi, mais moins, et c’est surtout long à taper, et il faut rediriger, ... Ce
qu’il faudrait, c’est un sed simplifié "à la grep", nommé remplace, à utiliser dans
les cas tous simples, comme par exemple :
remplace 'pays' 'paysage' *.txt
Ce qui signifie : dans tous les fichiers d’extension .txt, remplacer toute occurrence
de la chaîne pays par paysage.
Bien sûr, comme pour egrep, le premier argument est une expression régulière.

Correction exercice 11 :

#!/bin/bash
if [ $# lt 3 ] ; then # Il faut au moins trois arguments
echo erreur : remplace 'ere' 'nchaine' file..
exit 1
fi
ERE="$1" # le premier arg est l'expression
REPLACE="$2" # le deuxieme arg est la nouvelle chaine
SEP='%' # nous utiliserons % comme separateur
# (le caractere / pourra apparaitre dans l'expression)
shift; shift
# maintenant, $1 contient le premier nom de fichier
# faire une boucle sur tous les fichiers passes
# en arguments
while [ z$1 != z ] # teste si $1 n'est pas vide
# (encore un fichier a traiter?)
do
if [ f $1 ] ; then # $1 est un fichier
sed "s${SEP}${ERE}${SEP}${REPLACE}${SEP}g" $1 \
>/tmp/replace.$$
# le resultat est dirige vers un fichier
# temporaire qui est recopie sur le fichier
# d'origine si sed a effectue au moins une modification
[ $? = 0 ] && cat /tmp/replace.$$ >$1
else
echo $1 n\'est pas un fichier, ignore
# $1 peut etre un repertoire
fi
shift # pour passer au suivant, decaler les
# arguments d'un pas vers la gauche
done # et passer au suivant : fin de la boucle.
rm f /tmp/replace.$$
# faire le menage quand tout est fini


Aucun commentaire:

Enregistrer un commentaire

Partenaires

Computers Blogs

Contactez-nous

Nom

E-mail *

Message *

Tous droits resérvés-www.exercices-corriges.com Seo Blogger Templates