Environnement Unix

Programming, Unix Shell Scripting · lab

Voir tous les documents en systèmes d'exploitation et cloud

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