Le principe central d'Unix est qu'il existe plusieurs commandes simples qui peuvent �tre li�es ensemble gr�ce aux pipes et aux redirections pour accomplir des t�ches plus compliqu�es. Regardez les exemples suivants (je n'expliquerai que les plus compliqu�s ; pour les autres, reportez vous aux sections pr�c�dentes ou aux pages man).
ls
est trop rapide et je ne peux pas lire le nom de tous
les fichiers.
$ ls | less
$ cat fichier.txt | sort -r | lpr
$ sort fichier.dat | uniq> nouveaufichier.dat
$ find ~ -name "papier*"
Expliquons. find
est une commande tr�s utile qui liste tous les fichier
dans une arborescence (qui commence � partir du r�pertoire home dans ce
cas). Sa sortie peut-�tre filtr�e selon plusieurs crit�res comme par exemple
-name
.
SEARCH
?
Bien s�r, essayez cela :
$ grep -l 'entropie' *
search entropy [...]*.*.*
, mais grep
n'est pas r�cursif.
$ find . -exec grep -l "entropy" {} \; 2> /dev/null
find .
sort tous les noms des fichiers � partir du
r�pertoire courant, -exec grep -l "entropy"
lance une commande sur chacun
des fichiers (repr�sent�s par {}
), \
termine la
commande). Si vous pensez que la syntaxe est horrible... vous avez raison :-)
Vous auriez aussi pu �crire le script suivant :
#!/bin/sh # rgrep: grep r�cursif if [ $# != 3 ] then echo "Utilisation : rgrep <param�tres> <motif> <r�pertoire>" exit 1 fi find $3 -name "*" -exec grep $1 $2 {} \; 2> /dev/null
grep
marche comme SEARCH
et combin� avec
find
nous obtenons le meilleur des deux mondes.
$ awk 'NL> 2 {print $2, "\t", $5}' fichier.dat> nouveaufichier.dat
awk
est en fait un langage de programmation. Pour chaque ligne � partir de
la troisi�me, on affiche le second et le cinqui�me champ en les s�parant par
une tabulation. Apprenez � vous servir de awk --- il vous fera gagner beaucoup
de temps.
ls-lR.gz
d'un FTP. Pour chaque sous
r�pertoire, il y a une ligne � total x �, avec x la
taille en Kilo-octets du r�pertoire. J'aimerais avoir le total de toutes ces
valeurs.
zcat ls-lR.gz | awk ' $1 == "total" { i += $2 } END {print i}'
zcat
sort le contenu du fichier .gz
. La sortie est envoy�e
vers awk dont je vous recommande chaudement de lire la page man.
monprog
, pour
calculer un param�tre � partir d'un fichier de donn�es. Je voudrais le lancer
sur des centaines de fichiers et avoir la liste des r�sultats, mais c'est une
calamit� de demander chaque fois le nom du fichier. Sous VMS, j'aurais �crit un
long fichier de commande. Et sous Linux ?
Un script tr�s court. Faites votre programme pour qu'il cherche
le programme mesdonn�es.dat et pour qu'il afficher le r�sultat sur l'�cran
(stdout) et �crivez ensuite ce petit script :
#!/bin/sh # monprog.sh: lance la m�me commande sur plusieurs fichiers # usage: monprog.sh *.dat for fichier in $* # pour tous les param�tres (e.g. *.dat) do # ajouter le nom du fichier dans r�sultat.dat echo -n "${fichier}: ">> r�sultats.dat # copie le param�tre courant dans mesdonn�es.dat et lance monprog # et ajoute le sortie � r�sultats.dat cp ${fichier} mesdonn�es.dat ; monprog>> r�sultats.dat done
#!/bin/sh # remplace $1 par $2 dans $* # utilisation : remplace "vieux-motif" "nouveau-motif" fichier [fichier...] VIEUX=$1 # premier param�tre NOUVEAU=$2 # second shift ; shift # enlever les deux premier param�tres ; les suivants sont # les noms des fichiers for fichier in $* # pour tous les fichier donn�s en param�tres do # remplace toutes les occurrences de VIEUX par NOUVEAU et sauve cela # dans un fichier temporaire sed "s/$VIEUX/$NOUVEAU/g" ${fichier}> ${fichier}.nouveau # renommer le fichier temporaire /bin/mv ${fichier}.new ${fichier} done
#!/bin/sh # prune.sh: efface les n-1�me et n-2�me ligne de fichiers # utilisation : prune.sh fichier [fichier...] for fichier in $* # pour chaque param�tre do LIGNES=`wc -l $fichier | awk '{print $1}'` # nombre de ligne dans fichier LIGNES=`expr $LIGNES - 3` # LIGNES = LIGNES - 3 head -n $LIGNES $fichier> $fichier.new # sort les premi�res lignes # de LIGNES tail -n 1 $fichier>> $fichier.new # ajoute la derni�re ligne done
ed
:
#!/bin/sh # prune.sh: efface les n-1�me et n-2�me ligne de fichiers # utilisation : prune.sh fichier [fichier...] for fichier in $* # pour chaque param�tre do printf '$-2,$-1d\nw\nq\n' | ed -s $fichier done
J'esp�re que ces exemples vous auront ouvert l'app�tit.
Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:25