ENSI-II2
Environnement Unix
Correction du TP 3 : Les filtres
Exercice 1
•
•
• Trouver les utilisateurs qui n’ont pas de mot de passe (2ème champs vide)
Imprime les fichiers qui peuvent être lus ou écrits par tous les utilisateurs
Imprime les lignes décrivant un répertoire
Exercise 2
if test $# -eq 1
then
if test -f $1
then
tr –s ‘ ‘ ‘\012‘ < $1 > fic
for i in cat $1
do
x=grep –w $i fic|wc -l
echo $i “existe” $x “fois” >> result
fi
done
sort –u result
rm result
else
echo "$1 n est pas un fichier"
fi
else
echo "nombre d’arguments invalide "
fi
Exercise 3
find $1 -newer $2 -type f > hh 2>/dev/null
if [ -s hh ]
then
cat hh
Publicité
else
echo "non "
fi
Exercice 4
if test $# -eq 1
then
if test -f $1
then
for i in cat $1
do
x=grep –w $i $2 | wc –l
if test $x -eq 0
then
echo "le mot $i ne figure pas ds le dictionnaire !"
H. IDOUDI
1
Environnement Unix
ENSI-II2
fi
done
else
echo "$1 n est pas un fichier"
fi
else
echo "nombre d’arguments invalide "
fi
Exercice 5
if [ $# -ne 2 ]
then
echo "nombre d’arguments invalide "
else
if test ! -f $1
then
echo "Erreur : le fichier $1 n existe pas"
Publicité
else
head -$2 $1 | tail -1
fi
fi
Exercice 6
tr –s ‘ ‘ ‘\012‘ < $1 | grep ‘[A-Z][A-Z][A-Z]’
Exercice 7
ici on suppose que la commande date donne un affichage en français de la forme :
nom_jour num_jour mois année
jour =`date | cut -f2 -d" "
mois= jour =`date | cut –f3 -d" "
an= jour =`date | cut –f4 -d" "
case $ mois in
“janvier”) mois=”Jan”;;
..
..
..
“décembre”) mois=”Dec”;;
esac
echo $mois the $jour”th” $an
Exercice 8
grep '^\(.\) .* \1$' f1
Exercice 9
grep '^\([^” “]\) . \1$' f1
Exercice 10
find . \( -name core –o –name "*.o" \) –size +2 –exec rm {} \ ;
H. IDOUDI
2
ENSI-II2
Environnement Unix
Exercice 11 (mots palindromes)
#!/bin/bash
if test $# -eq 1
then
Publicité
if test -f $1
then
for i in cat $1
do
l=echo $i | wc -c|cut -d' ' -f1
j=expr $l - 1
inverse=””
while [ $j –ge 1 ]
do
x=echo $i|cut -c $j
inverse=$inverse$x
j=expr $j - 1
done
if [ $i = $inverse ]
then
echo $i est palindrome
fi
done
Exercice 12
C'est l'option -name qui permet de spécifier le nom du ou des fichiers recherchés. On peut
indiquer le nom d'un fichier complet (bofichier.tex), ou utiliser des expressions régulières
(celles du shell, pas celles de grep...) :
• L'étoile (*) désigne «un ou plusieurs caractères»;
• Le point d'interrogation remplace un (et un seul) caractère quelconque;
• Les crochets permettent de désigner une série de caractères au choix.
Dans notre cas, le premier caractère est un «a» ou un «A» ([aA]), suivi de quelque chose (*)
et terminé par un chiffre entre 3 et 6 ([3456] ou [3-6]). On écrit donc :
find . -name '[aA]*[3-6]' –print
Exercice 13-14-15-16
Voir cours
Exercice 11 (autre méthode)
for j in cat $1
do
l=echo $j | wc -c|cut -d' ' -f1
Publicité
m=expr $l \/ 2
i=1
while [ $i -le $m ]
do
nb=expr $l - $i
H. IDOUDI
3
ENSI-II2
Environnement Unix
chaine=echo $j|cut -c $i-$nb
x=echo $chaine|grep '^\(.\).*\1$' | wc –l
if [ $x –eq 0 ]
then
echo $j non palindrome
break
fi
i=expr $i + 1
done
if [ $i lgt $m ]
then
echo $j palindrome
fi
done
else
echo "$1 n est pas un fichier"
fi
else
echo "nombre d’arguments invalide "
fi
H. IDOUDI
4