Les Outils de Recherche et dEdition
Il existe une grande famille de programmes qui lisent une entr e, r alisent une transformation et
crivent un r sultat. Cest ce quon appelle des filtres.
Ce chapitre pr sente les filtres les plus utilis es. Nous commen ons par ceux qui effectuent des
recherches dans les fichiers (la famille grep) ou des recherches de fichiers (find). Le reste du chapitre sera
r serv l' tude de deux outils de "transformation de texte" programmables et universels. Ils sont
programmables, en ce sens que les transformations r aliser sont d finies dans un langage de programmation
simple. Ces programmes sont sed et awk qui sont des g n ralisations de grep.
1. Recherche d'une cha ne dans un fichier - la famille GREP -
Unix offre trois commandes de m me famille, grep, egrep et fgrep, pour afficher les lignes de fichiers
donn s en param tre et qui contient un motif donn . Leurs syntaxes est le m me :
grep [ option ] <motif> [<fichier> ...]
Le motif est une expression r guli re dans laquelle certains caract res ont une signification particuli re.
grep est tr s utile pour trouver les occurrences d'une variable dans un programme, ou des mots dans un
document, ou pour s lectionner des parties des sorties d'un programme.
Sauf option contraire, chaque ligne ayant cette propri t est crite sur la sortie standard. Il est
recommand d'entourer d'apostrophes les expressions contenant des caract res sp ciaux du langage de
commandes utilis .
Options
-v
-c
-i
seulement)
-l
-n
-e motif
-f fichier
seules les lignes ne contenant pas le motif sont affich es;
seul le nombre de lignes satisfaisantes est affich
ignore la distinction minuscule/majuscule dans les comparaisons (grep
seules les noms de fichiers contenant le motif sont affich s;
num rote les lignes affich es;
lorsque le motif commence par un tiret;
le motif est dans le fichier (egrep et fgrep)
Le code de retour est 0 si un motif a t trouv , 1 sinon,
et 2 s'il y' a eu des erreurs.
Exemples
$ grep -n variable *.ch
$ grep From $MAIL
$ grep From $MAIL grep - v marie
$ grep -c marie $HOME/lib/annuaire
$ who grep marie
$ ls grep -v temp
cherche variable dans les sources
affiche les en-t tes des messages
autre que marie
trouve le num ro de marie dans l'annuaire
est-elle connect e?
les noms de fichiers ne contenant temp
expressions r guli res de grep et fgrep (par ordre d croissant de pr c dence)
c
\c
^
$
.
[...]
[^...]
\n
r*
tout caract re non sp cial
ignore la signification sp ciale de c
d but de ligne
fin de ligne
n'importe quel caract re unique
n'importe quel caract re unique ...; des suites comme a-z sont possibles
n'importe quel caract re unique figurant pas parmi ...
ce qui a t identifi par la ni me sous expression \(...\) (grep seulement)
z ro ou plus occurrences de r
ENSI/OMS/Intro OS/II1/ page 1
r+
r?
r1 r2
\ (r \)
(r)
une ou plus occurrences de r
z ro ou une occurrence de r
r1 suivi de r2
sous expression r rep r e (grep seulement); peut tre imbriqu
expression r guli re r2 (egrep seulement), peut tre imbriqu
Exemples
$ grep '^From'$MAIL
$ ls-1 grep '^d'
$ ls -1 grep'^.......rw'
$ grep '^[^:]*::' /etc/passwd
imprime toutes les lignes commen ant par From
imprime seulement les lignes d crivant un r pertoire
imprime les fichiers qui peuvent tre lus ou crits par tous
trouver les utilisateurs qui n'ont pas de mots de passe
grep est le plus ancien membre d'une famille de programmes qui contient galement egrep et fgrep.
Leur comportement est peu pr s le m me. fgrep recherche plusieurs expressions simultan ment et egrep traite
de vraies expressions r guli res - les m mes que grep, mais avec un op rateur 'ou' et des parenth ses pour
grouper les expressions.
2. Recherche d'un fichier : find
find descend r cursivement des sous-hi rarchies de r pertoires donn es par leur racine, en cherchant
appliquer des fichiers pr cis s par un ou plusieurs crit res se s lection (nom, type, date) une commande
donn e.
find + +
r pertoire est la liste des racines des sous-hi rarchies parcourir. expression est une suite de primitives
exprimant la fois les crit res de s lection des fichiers et les actions leur appliquer. Lorsque le crit re est
vrai, l'action est ex cut e. Ces primitives sont :
-name <motif>
-user <nom>
-atime <n>
-mtime <n>
-newer <fichier>
-type <x>
-perm <octal>
-links <n>
-group <nom>
-size <n>
- exec commande
- inum <n>
-\(expression\)
Remarque
vrai si le motif s'applique sur le nom du fichier courant;
vrai si le fichier courant appartient l'utilisateur nom;
vrai si le fichier a t utilis dans les n derniers jours; peu utilisable;
vrai si le fichier a t modifi dans les n derniers jours;
vrai si le fichier courant a t modifi plus r cemment que fichier;
vrai si le type du fichier est x avec :
b pour fichier sp cial bloc,
c pour fichier sp cial caract re,
d pour fichier r pertoire
f pour fichier ordinaire,
p pour tube nomm (System III/V);
vrai si les permissions du fichier correspondent au nombre octal donn ;
vrai si le fichier a n liens;
vrai si le groupe propri taire du fichier est nom;
vrai si le fichier contient <n> blocs;
vrai si la commande restitue une valeur de sortie nulle;
la fin de la commande doit tre ponctu e par \;
et le nom du fichier examin est repr sent par {};
le nom de fichier doit tre imprim ;
vrai si le i-noeud du fichier pour num ro n;
a pour valeur bool enne celle de l'expression parenth s e.
Toutes ces primitives peuvent tre compos es avec les op rateurs bool ens : de n gation !, de
conjonction (concat nation des expressions), de disjonction -o, et les parenth ses \(\).
Exemple
find . \( -name .c -o -name .f \) -mtime -30 exec ls -1 {} \;
on applique la commande ls -1 tous les fichiers qui sont des sources C ou FORTRAN modifi s
depuis moins d'un mois, et qui appartiennent la hi rarchie dont la racine est le r pertoire courant (.):
ENSI/OMS/Intro OS/II1/ page 2
find $HOME -newer datesauv -print
affiche les fichiers de l'arborescence d finie par le r pertoire personnel de l'usage modifi s apr s le
fichier datesauv
3. Tri et fusion
3.1- Tri
sort ] + [<fichier> ] +
trie les lignes et crit les r sultats sur la sortie standard sauf si l'option -est utilis e. Le tri sur les lignes
est lexicographique sur l'ensemble des fichiers.
options
-c
-u
-o <fichier>
-d
-f
-n
-i
-r
-b
-t<x>
cl
Exemples
sort + 1 -2 f
(check) v rifie que le fichier est tri ; la sortie n'existe que si le fichier n'est pas tri ;
(unique) ne garde qu'une ligne parmi toutes celles qui ont la m me cl ;
(output) envoie la sortie sur <fichier>
(dictionary) les comparaisons ne se font qu'avec les lettres, les chiffres et les blancs;
lettre minuscules et majuscules sont confondues;
cl num rique (sign e ventuellement);
les caract res dont le code ASCII est ext rieur l'intervalle octal 040-0176 sont ignor s;
Publicité
renverser l'ordre du tri;
ignorer les blancs en d but de champ;
le d limiteur de champ dans les lignes est le caract re <x> et non le TAB
limite le champ des comparaisons aux portions de lignes, elle est de la forme + debut -fin
debut est le premier champ servant faire la cl (num rotation partir de z ro),
fin est le num ro du premier champ qui n'appartient pas la cl .
trie f sur une cl format par le deuxi me champ de chaque ligne
Une cl peut tre pr ciser des portions de champs. Dans ce cas, debut et fin sont de la forme m.n
( ventuellement l'une des options b d f i ou r) o m donne le nombre de champs sauter depuis le
d but de ligne et n le nombre de caract res sauter en d but de champ avant de commencer la
comparaison.
$ sort + 2.3 -5.0 f
trie f sur une cl qui commence au troisi me champ, et qui se termine la
fin du cinqui me champ.
$ ls sort
trie les noms de fichiers en ordre alphab tique
$ ls -s sort -nr
trie par ordre de taille d croissante
$ ls -1 sort + 3 nr
trie par taille d croissant; apr s avoir sauter les 3 premiers champs
$ who sort + 4n
trie les plus anciennes connexions
$ sort -t, + 4bf -5bf -0f - 1f. ft>diplome.t
Soit f.t un fichier d' tudiants qui la format suivant :
nom, pr nom, jj/mm/aa, code Dipl me
tri sur dipl me, puis alphab tiquement, sortie sur diplome.t
$ sort -t, +2.7b -2.9b + 2.4b - 2.6b + 2b. - 2.2b f.t >age.t
Soit f.t un fichier d' tudiants qui la format suivant :
nom, pr nom, jj/mm/aa, code Dipl me
tri par ge, la date tant la date de naissance, sortie sur age.t.
Damargi, Mariam,
0
1
01/03/70,
2
cISET
3
champs
+ 2.7 signifie que la cl commence sur le 7 me caract re du champ 3 (soit le premier a de ...
jj/mm/aa, le chiffre 7), et -2.9 signifie qu'elle s'arr te au 9 me caract re apr s la fin du deuxi me
champ (0 de 70, sur l'exemple). Le b coll pour ignorer les ventuels blans entre la virgule et la date.
ENSI/OMS/Intro OS/II1/ page 3
3.2 Fusion
sort -m ] + [<fichier1> ] +
Les fichiers doivent pr alable tre tri s sur les cl s de fusion.
4. L' diteur de flot sed
sed est un diteur non interactif qui permet le traitement de fichiers texte. Il utilise surtout dans les sous-
programmes scell, et comme filtre dans les listes de commandes.
sed [ -n] [<requ te>] [ -e <requ te>] [ -f <script> ]] [<fichier>]
sed recopie le ou les fichiers <fichier> (par d faut l'entr e standard) sur la sortie standard, en appliquant
chaque ligne les requ tes qui suivent l'option -e (un par requ te), ou les requ tes qui se trouve dans le fichier
<script>, ou la requ te s'il y en a une.
4.1. Forme g n rale des requ tes de sed
Une requ te sed est de la forme :
] commande arguments]
L'option -n demande sed de n'afficher sur la sortie que les lignes sur lesquelles on applique la
commande p.
adresse est le num ro absolu d'un ligne de texte ( dans le cas o il ya plusieurs fichiers sources, sed
consid re qu'il y a en un form de la concat nation des diff rents fichiers), ou le $ pour derni re ligne, ou une
expression r guli re palace entre deux barres (/.../) et d finissant un motif figurant dans la ligne adress .
4.2 Mode de fonctionnement
sed ne travaille pas sur une image du fichier en m moire : tampon ne contient qu'une ou quelques lignes
du fichier un instant donn . Toutes les requ tes que l'on fournit sed sont appliqu es chacune des lignes
d filant dans le tampon, en fonction de l'adressage de ces lignes dans les redu tes. Un tampon auxiliaire permet
les d placements de blocs de texte dans le fichier.
4.3 Les commandes de manipulation de l'espace de travail
commande est une lettre suivi d'arguments. Toutes les requ tes peuvent avoir z ro, une ou plusieurs
adresses sauf a et i (z ro ou une).
a\ <texte>
b <etiq>
c\
d
i\
l
q
r fichier
s/<anc>/<nouv>/ f : substitue l'expression r guli re <anc> par la cha ne de substitution nouv. f est un
indicateur :
ajoute des lignes la sortie jusqu' la premi re ligne ne se terminant pas par \
saut la commande : <etiq>
remplace des lignes comme pour a
d truit la ligne courante; lit la suivante
ins re le texte avant la prochaine sortie
imprime la ligne
termine
lit fichier et copie son contenu en sortie
g : remplace toutes occurences trait es;
p : le contenu du tampon est crit si une substitution est effectu e
w <fichier> crit dans <fichier> si une substitution est effectu e
t <etiq>
w <fichier>
y/<ch1>/<ch2>/
=
! commande-sed
{ et }
N
branchement : <etiq> si la derni re substitution a r ussi
crit dans <fichier>
toutes les occurences du tampon des caract res figurant dans la cha ne 1
sont remplac s par le caract re correspondant de la cha ne 2.
imprime le num ro de la ligne
la commande est effectu e sur les lignes non s lectionn es
associe un espace d'adressage une liste de commandes
la ligne courante est ajout e au tampon qui en contient alors deux
ENSI/OMS/Intro OS/II1/ page 4
D
P
h
H
g
G
x
d truit le d but du tampon jusqu' la premi re fin de ligne include
affiche le d but du tampon jusqu' la premi re fin de ligne incluse
le tampon est copi dans le tampon auxili re dont le contenu est d truit
le tampon est ajout dans le tampon auxili re; le s parateur est la fin de ligne
le tampon auxili re est copi dans le tampon dont le contenu est d truit
le tampon auxili re est ajout dans le tampon ;; le s parateur est la fin de ligne
change entre les contenus du tampon et du tampon auxili re.
Exemples
$sed 's/UNIX/UNIX (TM)/g' f1 f2
remplace la cha ne UNIX par UNIX (TM) dans f1 f2
$sed '10,/{#.}/s/ //g' f>>f
remplace les espaces qui se suivent par un seul blanc de la dixi me ligne jusqu' la premi re
ligne (apr s la dixi me) qui contient une chine de la forme {#...#}
$ who\sed's/. * //
remplace un espace suivi d'un nombre quelconque de caract res jusqu'au dernier espace la
ligne par un seul espace
$ sed '/fin/ q'
imprime son entr e sur la sortie jusqu' la premi re ligne contenant le mot fin
$ sed'/^*/d'
d truit les lignes commen ant par *
$ sed 's/$^n'
ajoute une fin de ligne la fin de chaque ligne
$ sed '1,/^$/d
d truit jusqu' la premi re ligne vide
$ sed -n'/^$/,/^fin/p
imprime chaque groupe lignes depuis une ligne vide jusqu' une ligne d butant par fin
$ sed -n '/exp/w fichier 1> /exp/!w fichier2
crit les lignes v rifiant exp sur fichier1, sinon sur fichier2
exemple : Remplace une fin de ligne par le s parateur :, sauf s'il est suivi par !.
debut de la boucle
: debut
ajout de la suivante dans le tampon
N
remplacer la fin de ligne par s'il n'ya pas de!
s/ \n \([^!]\) / : 1 /
si la substitution a r ussi, recommencer
t debut
sinon, afficher la ligne d'adresse compl te
P
et d truire le ! qui reste dans le tampon
d
5. Le transformateur de texte AWK
awk est un outil non interactif pour traiter des textes, les transformer, les diter, faire des calculs
l mentaires sur le contenu. Le nom de awk vient de ses trois concepteurs : Alfred V. Aho, Peter J. Weinberger
et Brian W. Kernighan. (ebook en ligne : http://en.wikibooks.org/wiki/AWK)
awk manipule les fichiers ligne par ligne et adresse les champs l'int rieur des lignes. Pour traiter les
champs, le programmateur dispose de variables et des instructions classiques des langages de programmation.
Quelques-unes des limitations de sed sont lev es par awk. L'id e de base d'awk est la m me que celle
de sed, mais les d tails d rivent plut t du langage C que d'un diteur de texte.
awk [ -F <car>] { [ -f <fprog> <prog>]} [ <fichier>]*
traite les fichiers r f renc s ligne par ligne, et chaque ligne est soumise un programme awk (<fprog>,
ENSI/OMS/Intro OS/II1/ page 5
<prog>; si la ligne courante satisfaisant une ou plusieurs s lections propos es dans le programme les actions
correspondants sont ex cut es.
Une ligne d'un programme awk a le format suivant :
s lection {actions}
Les s lections sont des expressions les m mes que dans egrep, ou peuvent tre encore plus compliqu es.
awk fournit deux expressions particuli res, BEGIN et END. Les actions associ es BEGIN sont r alis es
avant que la premi re ligne soit lue; ce sont couramment des actions d'initialisation de variables. Les actions
associ es END sont r alis es apr s que la derni re ligne soit lue; ce sont couramment des actions
Publicité
daffichage de r sultats finaux.
$ awk '/<expression r guli re> / {print}' <fichier>...
fait la m me chose que egrep
$ awk' {print}' <fichier>&
fait la m me chose que cat
L'option -F permet de d finir le nouveau s parateur de champs, si ce n'est pas <espace> ou le caract re
<tab>. Les fichiers sont trait s dont l'ordre o ils sont donn s en param tres dans les lignes. Dans le cas o
aucun fichier n'est signal , c'est l'entr e standard qui le sera.
Les fichiers sont trait s dont l'ordre o ils sont donn es en param tres dans les lignes. Dans le cas o aucun
fichier n'est donn , c'est l'entr e standard qui le sera.
5.1. Traitement des champs
awk d coupe le fichier qui lui soumis en enregistrements logiques (par d faut les lignes) eux-m mes
d coup s en champs. Un enregistrement (resp. un champs) est une suite de caract res d limit e par un d limiteur
d'enregistrement qui par d faut est le caract re <newligne> (resp. un d limiteur de champ qui par d faut le
caract re <esspace>).
De fa on g n rale $1, $2, ...,$NF d signent le premier champ, le second champ, ... de l'enregistrement
courant not $0 et NF est une variable dont la valeur est le nombre de champs de la ligne courante.
$ who
rim
slim
tty2
tty4
Sep
Sep
29
29
11 : 53
12 : 15
$ who awk ' {print $1, $5}
rim
slim
11 : 53
12 : 15
imprime les noms et heurs de connexions
5.2. Les variables
- les variables utilisateurs
Les identificateurs sont d finis comme dans le langage C. La d claration et le type sont implicites. On
distingue les variables num riques (nombres flottants) et les variables cha nes. Les variables sont toutes
initialis es la cha ne vide ", cette cha ne ayant comme valeur 0 dans les expressions arithm tiques. La
conversion de type est automatique au cours de op rations. Il est enfin possible d'utiliser les tableaux,
l'indexation tant r alis e avec les crochets comme en c.
- les variables pr d finies
awk maintient des informations int ressantes en dehors du nombre de champs dans diff rentes variables
:
FILENAME
FS
NF
NR
OFMT
OFS
ORS
nom du fichier courant d'entr e
s parateur de champs dans l'enregistrement courant
nombre de champs dans l'enregistrement courant
num ro de l'enregistrement courant
format de sortie des nombres (d faut %g, voir printf ...)
s parateur de champs de sortie ( par d faut, un espace)
s parateur de lignes en sortie ( par d faut fin de ligne)
ENSI/OMS/Intro OS/II1/ page 6
RS
s parateur de lignes en entr e ( par d faut de ligne)
$ awk' {print NR, $0} ' monfichier
affiche le contenu de mon fichier avec le n de ligne
$ awk ' {printf "%4d %sn\n", NR, $0} monfichier
m me chose que pr c demment mais le n de ligne sur 4 caract res
5.3. Les s lections
Une s lection a l'une des formes suivantes :
- combinaison quelconque au moyen des op rateurs : ! && (et)
cf les d finition pour l'utilitaire grep.
- expression r guli re de la forme
< expression>~<expression r guli re>
<expression>!~<expression r guli re>
<expression><op rateur><expression>
avec <op rateur> est <<=><= ==!=
$2 ==""
$2 ~/$/
$2!~ /./
length ($2) == 0 2 me champ de longueur nulle
2 me champ vide
2 me champ identique la cha ne vide
2 me champ ne contient aucun caract re
$ awk -F: $2 == "" /etc/ passwd
affiche les utilisateurs qui n'ont pas de mot de passe
$ awk' BEGIN { FS =":"} $2 == ""' /etc/passwd
affiche les utilisateurs qui n'ont pas de mot de passe
- intervalle de la forme /motif/, /motif/
Les actions sp cifi es sont ex cut es pour toutes les lignes comprises entre la premi re ligne contenant le
premier motif et la ligne suivante contenant le second motif.
5.4. Les actions
=+= -=*=/= % =
Les op rateurs ( par ordre de priorit croissante)
op rateurs d'affectation
op rateur bool ens OU;
<<exp1>> <<exp2>> est vraie si l'une des deux l'est.
<<exp2>> n'est pas valu e si <<exp1>> est vraie
op rateur bool ens ET; <<exp1>> est vraie si les deux le sont
n gation
op rateurs relationnels ~ et !~ sont des op rateurs de correspondance.
op rateur de concat nation de cha nes
plus, moins
multiplication, division, reste
incr mentation, d cr mentation (pr fix ou postfix )
&&
!
>>=< <= ==!=~!~
<espace>
+ -
- / %
++ --
Les fonctions
cos (expr)
exp (expr)
getline()
index (s1, s2)
int (expr)
length (s)
log (expr)
sin (expr)
cosinus de expr
exponentielle de expr
lit la ligne suivante; retourne 0 si la fin de fichier, 1 sinon
position de la cha ne s1 dans la cha ne s2
partie enti re de expr
longueur de la cha ne s. Sans argument, $0 est pris comme argument.
logarithme naturel de expr
sinus de expr
ENSI/OMS/Intro OS/II1/ page 7
split (s, a, c)
sprintf(fmt,...)
substr(s, m, n)
d coupe s en a [1], a[2], ..., a suivant le d limiteur c ( par d faut la valeur de FS)
formate ... en accord avec la sp cification fmt
sous-cha ne de s; d but au caract re m, longueur maximale n
Les instructions
Elles apparaissent dans les actions et se terminent soit pat un; soit par un caract re de fin de ligne, soit par } ou
encore par # (d but d'un commentaire qui se termine la fin de ligne).
- Instruction de lecture
getline
getline var
getline < "fichier"
getline var < "fichier
"commande" | getline
"commande" | getline var
Lit et parse une nouvelle ligne depuis le fichier
courant dans les variables standard $0, $1, etc.
Lit une nouvelle ligne depuis le fichier courant
vers la variable var. La ligne n'est pas pars e.
$0, $1 ... ,
NR, FNR,
NF
juste var
Lit et parse une nouvelle ligne depuis le
fichier "fichier" dans les variables standard $0, $1,
etc.
$0, $1 ..., NF
Lit une nouvelle ligne depuis le
fichier "fichier" vers la variable var. La ligne n'est
pas pars e.
juste var
Lit une nouvelle ligne dans le tube i.e. depuis la
sortie standard de commande et vers les variables
standard $0, $1, etc.
$0, $1 ..., NF
Lit une nouvelle ligne dans le tube i.e. depuis la
sortie standard de commande et vers la
variablevar.
juste var
- Instructions d'affichage
print [<expression>, <expression> ...]
imprime les valeurs des expressions s par s par le caract re valeur de la variable OFS. Sans
argument, il y a impression de l'enregistrement complet ($0).L'impression se termine par une fin
Publicité
de ligne.
printf (<format>, [<expression>, <expression> ...] )
idem quen C, imprime les expressions dans le format demand .
Ces impressions peuvent tre redirig es en les faisant suivre de > fichier ou >>fichier.
- Instruction conditionnelle
if (<expression>)
<instruction>
else
<instruction>
- Instructions r p titives
while (<expression>)
<instruction>
for (< var; <expr>; <expr>)
<instruction>
for (<var> in <tableau>)
<instruction>
- les autres instructions
break
continue
exit
sortie de la boucle courant
poursuivre l'it ration suivante de la boucle
sortie du programme en cas d'ex cution de la section END
et sinon passage cette section
ENSI/OMS/Intro OS/II1/ page 8
next
abandon de l'enregistrement courant et passage au suivant
Les fonctions
d claration :
function identificateur (param 1, param 2, ... ,param n) {
<Instructions constituant la fonction>
}
appel :
identificateur( (param 1, param 2, ... ,param n)
Exemple :
function Bonjour(Ajout) {
print"Bonjour " Ajout
}
Appel de la fonction
BEGIN {
Bonjour("tout le monde")
}
5.5. Exemples
utilisation des tableaux
$ envers : imprime son entr e l'envers
awk' {ligne =$0}
END {for (i=NR; i>0; i--) ligne }
' $*
$
utilisation des tableaux associatifs
$ cat freqmot
#freqmot : compter les apparitions de mots dans un texte
awk '
{for (i=1; i< =NF; i++) num [$i]++}
END {for (mot in num) print mot, num }
' $*
$
un exemple plus complexe
$ cat double
recherche les mots doubles adjacents dans plusieurs fichiers
awk
FILENAME ! = prevfile {
#nouveau fichier
NR=1
prevfile=FILENAME
}
it ($i == $(i-1))
printf " double %s, fichier %s, ligne %s \n", $i, FILENAME, NR
if (NF >0) dernmot=SNF
NF<0 {
}
' $*
$
ENSI/OMS/Intro OS/II1/ page 9
Listes dexercices corrig s - Outils de Recherche et dEdition
Ecrire un script shell permettant de faciliter lutilisation de la commande find. Lobjectif est de pr senter
un menu lutilisateur pour choisir quel type de recherche il voudra r aliser partir dun r pertoire
donn e. Exemple : affichage de la liste des fichiers ordinaires, affichage de la liste des fichiers appartenant
un utilisateur donn , etc.
#script find1 qui affiche une liste de fichiers
#
#
selon les besoins de l'utilisateur exprim s
par un choix dans un menu
menu()
{
echo -e "\t\t 0) quitter"
echo -e "\t\t 1) sous r pertoires de $dir"
echo -e "\t\t 2) liste des fichiers ordinaires de $dir"
echo -e "\t\t 3) liste des fichiers sp ciaux de $dir"
echo -e "\t\t 4) fichiers de $dir ayant une taille donn e"
echo -e "\t\t 5) fichiers appartenant un utilisateur donn "
echo -e "\t\t 6) fichiers r cemment mis jour"
echo -e "\t\t 7) fichiers r cemment acc d s"
echo -e "\t\t 8) fichiers r cemment cr s"
echo -e "\t\t 9) fichiers ayant des droits d'acc s particuliers"
}
while true
do
echo -e "\n======================================================="
trap 'clear; exit' 2 3
echo -e "R pertoire traiter : \c"; read dir
if test "$dir" = "."; then dir=pwd
elif test -d $dir ; then :
else echo -e ">>>>>>>>>>>REPERTOIRE INCONNU <<<<<<<<<\n"; exit 1
fi
menu
echo -e "\n\t\tChoisir parmi : \c"; read choix
case $choix in
0) exit;;
1) find $dir -type d -print;;
2) find $dir \( -type f -o -type l \) -print;;
3) find $dir \( -type c -o -type b -o type p -o -type s\) -print;;
4) echo -e "\ttaille min en octets : \c"; read min
min=expr $min / 512
echo -e "\ttaille max en octets : \c"; read max
max=expr $max / 512 ; max=expr $max + 1
find $dir \( -size +$min -a -size -$max \) -print
;;
5) echo -e "\tnom de l'utilisateur : \c"; read nom
find $dir -user $nom -print
;;
6) echo -e "\tnombre de jours : \c"; read nbjour
find $dir -mtime -$nbjour -print
;;
7) echo -e "\tnombre de jours : \c"; read nbjour
find $dir -atime -$nbjour -print
ENSI/OMS/Intro OS/II1/ page 10
;;
8) echo -e "\tnombre de jours : \c"; read nbjour
find $dtime -$nbjour -print
;;
9) echo -e "\tpermission d'acc s : \c"; read droit
find $dir -perm -$droit -print
;;
*) echo -e "\n>>>>>>>>>>> ERREUR dans la saisie ! <<<<<<<<<<<<\n"
;;
esac
done
# find1
=======================================================
R pertoire traiter : mmm
>>>>>>>>>>>REPERTOIRE INCONNU <<<<<<<<<
# find1
=======================================================
R pertoire traiter : .
0) quitter
1) sous r pertoires de /home/omsaid/grepfind
2) liste des fichiers ordinaires de /home/omsaid/grepfind
3) liste des fichiers sp ciaux de /home/omsaid/grepfind
4) fichiers de /home/omsaid/grepfind ayant une taille donn e
5) fichiers appartenant un utilisateur donn
6) fichiers r cemment mis jour
7) fichiers r cemment acc d s
8) fichiers r cemment cr s
9) fichiers ayant des droits d'acc s particuliers
Choisir parmi : 9
permission d'acc s : 700
/home/omsaid/grepfind
/home/omsaid/grepfind/find1
=======================================================
R pertoire traiter : /tmp
&
Choisir parmi : 2
/tmp/.X0-lock
/tmp/Xconfig
/tmp/kfm-cache-0/index.html
/tmp/kfm-cache-0/index.txt
Publicité
=======================================================
R pertoire traiter : .
&
Choisir parmi : 1
/home/omsaid/grepfind
/home/omsaid/grepfind/ss1rep
/home/omsaid/grepfind/ss2rep
=======================================================
R pertoire traiter : ss1rep
&
Choisir parmi : 2
ss1rep/exple1
ENSI/OMS/Intro OS/II1/ page 11
ss1rep/exple2
=======================================================
Ecrire un script shell qui va traquer la liste des fichiers de taille nulle et ceux dont le bit SUID est mis en
place. Le script attend un param tre en entr e qui doit correspondre la sp cification du chemin dun
r pertoire partir duquel la recherche va tre op r e. Si ce param tre est absent, il sagit du r pertoire
courant.
#script find2 traquant les fichiers de taille nulle
et de SUID-Bit mis en place
#
if test $# -gt 1
then
echo erreur : trop de param tres
echo usage : $0
exit 1
fi
echo ${1:-pwd} 1>/dev/null 2>/dev/null
echo $1
echo "liste des fichiers de taille nulle"
echo "=================================="
nbre=find $1 -size 0 |wc -l
find $1 -size 0
echo -e "\n>>>>>>>> TOTAL = $nbre \n"
echo "liste des fichiers avec SUID-Bit=1"
echo "=================================="
nbre=find $1 -perm +4100 | wc -l
find $1 -perm +4100
echo -e "\n>>>>>>>>> TOTAL = $nbre \n"
# find2 /usr/man/fr
/usr/man/fr
liste des fichiers de taille nulle
==================================
>>>>>>>> TOTAL = 0
liste des fichiers avec SUID-Bit=1
==================================
/usr/man/fr
/usr/man/fr/man1
/usr/man/fr/man5
/usr/man/fr/man8
/usr/man/fr/man2
/usr/man/fr/man3
/usr/man/fr/man4
/usr/man/fr/man6
/usr/man/fr/man7
/usr/man/fr/man9
/usr/man/fr/mann
>>>>>>>>> TOTAL = 11
# find2
liste des fichiers de taille nulle
==================================
./vide
ENSI/OMS/Intro OS/II1/ page 12
>>>>>>>> TOTAL = 1
liste des fichiers avec SUID-Bit=1
==================================
>>>>>>>>> TOTAL = 0
#
Ecrire un script qui cherche tous les fichiers se trouvant dans une sous arborescence de racine le nom
dun r pertoire et appartenant un groupe dutilisateurs donn , et qui vous propose au travers dun
menu soit de les afficher, de les d truire ou de les archiver.
#script find3 qui cherche tous les fichiers appartenant un
#
#
groupe donn et qui ex cute une commande parmi une
liste donn e dans un menu
function menuordre ()
{
echo "=========================================="
echo " A)rchiver "
echo " D) truire "
echo " L)ister "
echo " Q)uitter "
echo "=========================================="
echo -n "
}
votre choix : "
clear
echo -n "nom du groupe : "; read groupe
if ! grep "^$groupe:" /etc/group 1>/dev/null 2>/dev/null
then echo "erreur : nom du groupe erron !!!"
exit 1
fi
echo -n "r pertoire de recherche : "; read dossier
if ! test -d $dossier
then echo "erreur : r pertoire inexisant ou inaccesible"
exit 2
fi
menuordre; read choix
case $choix in
) echo -n "nom de l'archive : "; read archive
find $dossier -group $groupe | cpio -ocvB > $archive
;;
) find $dossier -group $groupe -exec rm -f {} \;
;;
) find $dossier -group $groupe -print
;;
*) echo "erreur commande inconnu"
exit 3
;;
esac
# find3
nom du groupe : omsaid
r pertoire de recherche : .
==========================================
ENSI/OMS/Intro OS/II1/ page 13
A)rchiver
D) truire
L)ister
Q)uitter
==========================================
votre choix : l
./fic1
./fic3
# ll
total 0
-rw-r--r-- 1 omsaid omsaid 0 Mar 17 09:01 fic1
-rw-r--r-- 1 omsaid root 0 Mar 17 09:01 fic2
-rw-r--r-- 1 omsaid omsaid 0 Mar 17 09:01 fic3
# find3
nom du groupe : root
r pertoire de recherche : .
==========================================
A)rchiver
D) truire
L)ister
Q)uitter
==========================================
votre choix : d
# ll
total 0
-rw-r--r-- 1 omsaid omsaid 0 Mar 17 09:01 fic1
-rw-r--r-- 1 omsaid omsaid 0 Mar 17 09:01 fic3
# find3
nom du groupe : omsaid
r pertoire de recherche : .
==========================================
A)rchiver
D) truire
L)ister
Q)uitter
==========================================
votre choix : A
nom de l'archive : archive
1 block
# ll
total 5
-rw-r--r-- 1 root root 5120 Mar 17 09:28 archive
-rw-r--r-- 1 omsaid omsaid 0 Mar 17 09:01 fic1
-rw-r--r-- 1 omsaid omsaid 0 Mar 17 09:01 fic3
#
Ecrire un script utilisant la commande grep qui affiche les donn es compl tes connues propos dun
utilisateur. Ce script signalera de plus si lutilisateur en question poss de ou pas un mot de passe et si son
UID et GID sont valides.
#script gp1 cherchant si un utilisateur est connu du syst me
#
#
#attention : doit galement indiquer si l'utilisateur a ou non
#
et si oui affiche ses donn es caract ristiques pr sentes
dans le fichier /etc/passwd savoir son UID, GID, ...
Publicité
un mot de passe et renseig...