Académique Documents
Professionnel Documents
Culture Documents
Guy Tremblay
Professeur
Département d’informatique
UQAM
http://www.labunix.uqam.ca/~tremblay_gu
INF600A
11 septembre 2018
Labo. du 13 septembre 2018
find xargs
Un graphe illustrant l’évolution d’Unix depuis ses
débuts, ses différentes versions et déclinaisons. . . 3
http://www.levenez.
com/unix/unix.pdf
Don’t be chatty
Don’t be chatty
Quel style de programmation est-ce que cela permet/favorise ?
Don’t be chatty
Quel style de programmation est-ce que cela permet/favorise ?
Filtres et pipelines
Source: «Classic Shell Scripting», Robbins & Beebe, 2005.
La philosophie d’Unix et des outils Unix ? 10
«Don’t be chatty»
Rule of silence = Developers should design programs so that
they do not print unnecessary output. This rule aims to allow
other programs and developers to pick out the information they
need from a program’s output without having to parse verbosity.
$ cat f1.txt
abc
def
$ cat f2.txt
xxx yyy zzz
$ cat f1.txt
abc
def
$ cat <f1.txt
abc
def
La commande cat 15
$ cat <f2.txt
xxx yyy zzz
Note : «tail -F» : La commande attend qu’une ligne soit ajoutée au fichier
puis affiche cette ligne. Termine avec ˆC.
La commande echo 17
$ VAR=Bonjour
$ echo VAR
VAR
$ echo $VAR
Bonjour
$ echo VAR
VAR
$ echo $VAR
Bonjour
$ echo -n Bonjour
Bonjour$ echo le monde
le monde
$ echo -e "abc\ndef\nghi"
abc
def
ghi
$ echo -e "abc\ndef\nghi\n"
abc
def
ghi
$
La commande printf ? 21
Exécution sur java.labunix avec LANG=fr_CA.utf8
Donc : Le format «%q» utilisé avec une chaine imprime l’argument pour qu’il
soit utilisable comme entrée du shell — le «q» est pour «quote»
La commande tee 24
$ cat f2.txt
cat: f2.txt: Aucun fichier ou dossier de ce type
$ cat f2.txt
abc def
ghi
Note : Utile pour voir la sortie d’un programme au fur et à mesure où elle est
produite tout en la conservant dans un fichier pour utilisation ultérieure.
2.2 Comparaison de fichiers
La commande cmp 26
Pour déterminer «rapidement» si deux fichiers sont égaux ou pas
‘lar’ Add the lines in range r of the second file after line l of the first file.
For example, ‘8a12,15’ means append lines 12–15 of file 2 after line 8 of
file 1 ; or, if changing file 2 into file 1, delete lines 12–15 of file 2.
‘fct’ Replace the lines in range f of the first file with lines in range t of the
second file. This is like a combined add and delete, but more compact.
For example, ‘5,7c8,10’ means change lines 5–7 of file 1 to read as lines
8–10 of file 2 ; or, if changing file 2 into file 1, change lines 8–10 of file 2
to read as lines 5–7 of file 1.
‘rdl’ Delete the lines in range r from the first file ; line l is where they would
have appeared in the second file had they not been deleted.
For example, ‘5,7d3’ means delete lines 5–7 of file 1 ; or, if changing file
2 into file 1, append lines 5–7 of file 1 after line 3 of file 2.
Source: http://www.chemie.fu-berlin.de/chemnet/use/
info/diff/diff_3.html
La commande diff 30
Pour comparer des fichiers de texte avec un contexte
$ cat fich1.txt
a BCDEF ghi
x x yy
Z
La commande diff 35
Pour ignorer ??
$ cat fich1.txt
a BCDEF ghi
x x yy
Z
La commande diff 35
Pour ignorer la casse, les espaces blanches et les lignes blanches
$ cat fich1.txt
a BCDEF ghi
x x yy
Z
La commande sdiff ? 36
Pour comparer les deux fichiers côtes à côtes
$ cat ff0.txt
Tri alphanumérique en ordre, en
123345
89
ordre inverse vs. numérique
123 $ sort ff0.txt
123
123345
89
$ sort -n ff0.txt
Note : L’option «-r» 89
peut aussi 123
s’employer pour un 123345
tri alphanumérique.
$ sort -nr ff0.txt
123345
123
89
3. Expressions régulières
Il y a deux sortes d’expressions régulières 41
Certains outils utilisent une sorte, d’autres outils utilisent l’autre sorte
Note : grep -o vérifie si les lignes reçues matchent une expr. rég.
et, si oui, émet toutes les parties qui produisent un match !
Avec 0, 1 ou plusieurs. . . ??
$ echo aaadef | grep -o ".*"; echo $?
??
Exemple
$ echo xxaaayy | grep -o "a+b?"
$ echo xxaaayy | grep -o "a\+b\?"
aaa
[. . . ]
BUGS
Having two kinds of REs is a botch.
4. Traitement de fichiers de texte
4.1 Analyse et recherche
La commande wc 66
man grep
SYNOPSIS
grep [options] motif [fichier...]
DESCRIPTION
grep recherche dans les fichiers indiqués (ou depuis
l’entrée standard si aucun fichier n’est fourni, ou si un simple
trait d’union - est fourni en tant que nom de fichier) les lignes
correspondant à un certain motif. Par défaut, grep affiche les
lignes qui correspondent au motif.
La commande grep ? 68
Les principales options
Option Signification
-E Utilise une expression régulière étendue
-i Ignore la casse (minuscule/MAJUSCULE)
-l Émet seulement le nom du fichier s’il y a un
match, pas les lignes matchées
-q Retourne uniquement un code d’erreur, sans
émettre les lignes matchées
-v Émet les lignes qui ne matchent pas
La commande grep 69
Quelques exemples
Option Signification
-F Utilise une chaine fixe
-h N’indique pas le nom du fichier, même quand
plusieurs fichiers sont traités
-n Préfixe chaque ligne matchée par son numéro
de ligne
-o Affiche la partie matchée, et non pas la ligne
au complet
-r Fouille récursivement tous les fichiers
e.g., grep -r motif repertoire
-w Matche le motif seulement si c’est un mot com-
plet
Note : L’option «-o» est utile pour voir (comprendre ! ?) ce qui est
vraiment matché. De plus, tous les matchs sont indiqués.
La commande grep ? 72
Quelques exemples : grep -F = fgrep
$ grep -F . bar.txt
??
$ grep -F . bar.txt
abc.def
Option Signification
-d Supprime les caractères de cars-source
-s Élimine les répétitions de caractères pour ne
conserver qu’une seule occurrence
La commande tr 79
Quelques exemples
Transpositions simples
$ cat f1.txt
abc
def
ghi
$ cat f1.txt
abc
def
ghi
man sed
SYNOPSIS
sed [options]... {script-seulement-si-pas-d-autre-script
[fichier-d-entrée]...
DESCRIPTION
sed est un éditeur de flux. Un éditeur de flux est utilisé pour effectuer des
transformations de texte basiques sur un flux d’entrée (un fichier ou l’entrée
d’un tube). Alors que d’une certaine manière il est similaire à un éditeur qui
permet des éditions scriptées (comme ed), sed fonctionne en seulement une
passe sur l’entrée(s) et est, par conséquent, plus efficace. Mais c’est sa
capacité à filtrer du texte dans un tube qui le distingue des autres éditeurs.
Notes :
Chaque expression d’édition s’applique sur chacune des lignes du flux
d’entrée qui matche le motif et la ligne modifiée est émise en sortie sauf
évidemment si l’action est d.
Le caractère utilisé pour délimiter la commande, le patron et la chaine
peut être n’importe quel caractère répété — pas nécessairement «/»
La commande sed ? 84
Quelques options
Option Signification
-e script
--expression=script Ajoute le script aux commandes
à exécuter
-f fich
--script-file=fich Ajoute le contenu de fich aux
commandes à exécuter
-i[EXT]
--in-place[=EXT] Édite le fichier en ligne
Crée un fichier de sauvegarde si une
EXTension est spécifiée
-E Utilise des expressions régulières éten-
dues plutôt que des expr. rég. simples
La commande sed 85
Quelques exemples de suppression
while !STDIN.eof? do
ligne ← STDIN.readline
emettre_ligne ← true # On l’emet... sauf si action = ’d’
$ ls fich*
fich.txt fich.txt.bak
$ cat fich.txt
123 yyy zzz
d/e/f
$ cat fich.txt.bak
xxx yyy zzz
d/e/f
La commande sed ? 95
Quelques exemples avec plusieurs expressions
$ cat actions.txt
s/^xxx \(.*\) \(.*\)$/\2:\1/g
s;/\(e\)/;\1;
Exemples
Autres exemples
$ echo "a,b,c,d" | cut -d, -f2,3
b,c
$ type type
type est une primitive du shell
$ type ls
ls est un alias vers <<ls -CF>>
$ type +materiel
+materiel est une fonction
+materiel ()
{
dest=${1:-$(coursParDefaut)};
pushd+ ~/$dest/Materiel
}
La commande type 104
$ type --all ls
ls est un alias vers << ls -CF >>
ls est /usr/bin/ls
ls est /bin/ls
Si «foo» est un alias, alors «\foo ignore l’alias 105
$ ls
f1.txt f2.txt
$ type rm
rm est un alias vers << rm -i >>
$ rm f1.txt
rm : supprimer fichier << f1.txt >> ? oui
$ ls
f2.txt
$ \rm f2.txt
$ ls
$
La commande which 106
$ which type
which: no type in
(...:/usr/local/bin)
$ which ls
/bin/ls
$ which +materiel
which: no +materiel in
(...:/usr/local/bin)
On veut trouver tous les
fichiers avec une extension
«.bak», y compris dans les
sous-répertoires.
Comment peut-on faire
avec ce qu’on a vu ?
Trouver tous les fichiers avec une extension .bak 108
1 directory, 3 files
Trouver tous les fichiers avec une extension .bak 109
$ ls -1 Projet1/*.bak
Projet1/foo.bak
$ ls -R -1 *.bak
bar.bak
Trouver tous les fichiers avec une extension .bak 110
$ ls -R -1 | grep [.]bak
bar.bak
foo.bak
Sauf que. . .
Trouver tous les fichiers avec une extension .bak 110
$ ls -R -1 | grep [.]bak
bar.bak
foo.bak
Note : motif est une expression de file globbing, et non une expr. régulière !
La commande find 113
Quelques exemples
Sauf que. . .
Supprimer tous les fichiers avec une extension .bak 117
Solution avec pipeline et commande directe /
$ find . -name "*.bak"
./Projet1/foo.bak
./bar.bak
$ ls fich*
fich0.txt fich1.txt
$ cat fich0.txt
abc def ghi
xx yy
$ cat fich1.txt
a BCDEF ghi
x x yy
$ ls fich*
fich0.txt fich1.txt
$ cat fich0.txt
abc def ghi
xx yy
$ cat fich1.txt
a BCDEF ghi
x x yy
$ ls fich?.txt
fich0.txt fich1.txt
$ ls fich?.txt
ls: impossible d’acceder a fich?.txt:
Aucun fichier ou dossier de ce type
La commande xargs 127
Quelques options
Option Signification
-I chaine Remplace les occurrences de chaine dans
les arguments par les noms lus depuis l’en-
trée standard.
-i Équivalent à «-I {}».
--max-lines=k Utilise au plus k lignes d’entrée pour former les argu-
ments fournis à la commande.
Forme courte = -l k.
$ ls Backup
$ ls Backup
f1.bak f2.bak f3.bak
$ ls Backup
f1.bak.old f2.bak.old f3.bak.old
La commande xargs consomme autant d’arguments
que requis par la commande qui doit être exécutée ? 130
Mais sans utiliser plus que le nombre de lignes spécifiées par max-lines
Note : Option «-d» non reconnue sous Mac OS (BSD). Solution alternative :
$ find . -name "*.txt" | tr ’\n’ ’\0’ | xargs -0 ls
L’option «-exec» de find peut souvent être utilisée à
la place de xargs 133
man cmd