Nombre de commandes Unix permettent de traiter un flux de données textuelles leur parvenant sur leur entrée standard, et restituent le résultat de leur opération sur la sortie standard : elles sont alors nommées filtres. Leur but principal est donc d'apporter une traitement particulier dans la chaine des traitements que constitue un script.
Cette section se bornera à citer les commandes incontournables pour l'écriture de scripts shell, il faudra donc se référer au man de chacune d'entre elles pour obtenir de plus amples renseignement quant à leur fonctionnement. La majorité d'entre elles se trouve dans le paquet debian coreutils !
Tableau 5. Opérateurs de tests portant sur des nombres :
commande | description synthétique | ||||
---|---|---|---|---|---|
awk | Recherche et traite des modèles (langage de programmation à part entière, développé infra.) | ||||
base64 | Encoder/décoder des données et les afficher sur la sortie standard. | ||||
comm | Compare ligne à ligne deux fichiers triés. | ||||
compress uncompress gzip gunzip bzip2 bunzip2 | Compressent et décompressent des données. | ||||
cpio tar | Archivent des données. | ||||
csplit | Découpe un fichier en sections définies par des lignes de contexte. | ||||
cut | Affiche des parties sélectionnées des lignes. | ||||
expand unexpand | Convertit les tabulations en espaces et vice-versa. | ||||
fmt | Formate simplement du texte. | ||||
fold | Coupe chaque ligne de texte à une longueur donnée. | ||||
grep egrep fgrep rgrep | Afficher les lignes correspondant à un motif donné (expressions rationnelles). | ||||
head | Affiche le début des fichiers. | ||||
join | Fusionne les lignes de deux fichiers ayant des champs communs. | ||||
nl | Numérote les lignes d'un fichier. | ||||
od | Affiche le contenu d'un fichier en octal ou sous d'autres formats. | ||||
paste | Regroupe les lignes de différents fichiers. | ||||
pr | Met en forme des fichiers de texte pour l'impression. | ||||
ptx | Génére un index croisé du contenu de fichiers. | ||||
rev | Renverse l'ordre des caractères pour chaque ligne. | ||||
sed | Filtre et transforme des textes (commande développé infra.) | ||||
shuf | Génère des permutations aléatoires. | ||||
sort tsort | Trie les lignes de fichiers texte | ||||
split | Découpe un fichier en différentes parties | ||||
sum cksum md5sum sha1sum sha224sum sha256sum sha384sum sha512sum | Calculent de sommes de contrôle (CRC). | ||||
tac | cat inversé... | ||||
tail | Affiche la dernière partie de fichiers. | ||||
tr | Convertit ou élimine des caractères. | ||||
uniq | Signale ou élimine les lignes répétées. | ||||
wc | Affiche le nombre de lignes, de mots et d'octets d'un fichier. | ||||
xargs | Construit et exécute des lignes de commandes à partir de l'entrée standard. |
Comme la précédente, cette section ne fera que citer les commandes utiles à l'écriture de scripts shell.
Tableau 6. Opérateurs de tests portant sur des nombres :
commande | description synthétique | ||||
---|---|---|---|---|---|
basename | Éliminer le chemin d'accès et le suffixe d'un nom de fichier. | ||||
chroot | |||||
date | Affiche ou configure la date et l'heure du système. | ||||
dd | Convertit et copie un fichier. | ||||
df | Indique l'espace occupé par les systèmes de fichiers. | ||||
dirname | Ne conserve que la partie répertoire d'un nom de fichier. | ||||
du | Évaluer l'espace disque occupé par des fichiers. | ||||
echo | Affiche une ligne de texte. | ||||
env | Exécute un programme dans un environnement modifié. | ||||
factor | Affiche les facteurs premiers d'un nombre. | ||||
groups | Affiche les groupes auxquels appartient un utilisateur. | ||||
hostid | Affiche le numéro d'identification de l'hôte actuel. | ||||
id whoami | Affiche les UID et GID effectifs et réels. | ||||
install | Copie des fichiers et positionne leurs attributs. | ||||
logname | Afficherle nom de connexion de l'utilisateur | ||||
nice | Exécute un programme avec un niveau de priorité (politesse) modifié. | ||||
nohup | Exécute une commande en la rendant insensible aux déconnexions, avec une sortie hors terminal | ||||
pathchk | Vérifie la validité et la portabilité d'un nom de fichier | ||||
printenv | Affiche l'ensemble ou une partie des variables d'environnement. | ||||
printf | Formate et affiche des données. | ||||
readlink | Affiche la valeur d'un lien symbolique. | ||||
seq | Affiche une séquence de nombres. | ||||
shred | Écrit par dessus un fichier pour en camoufler le contenu, et optionnellement l'effacer. | ||||
sleep | Endort un processus pour une durée déterminée. | ||||
stat | Affiche l'état d'un fichier ou d'un système de fichiers. | ||||
stty | Modifie et afficher la configuration de la ligne de terminal. | ||||
sync | Vide les tampons du système de fichiers. | ||||
tee | Lit depuis l'entrée standard et écrit sur la sortie standard et dans des fichiers. | ||||
test | Vérifie le type d'un fichier, et comparer des valeurs. | ||||
touch | Modifie l'horodatage d'un fichier ; le crée s'il n'existe pas. | ||||
tty | Affiche le nom de fichier du terminal associé à l'entrée standard. | ||||
uname | Affiche des informations sur le système. | ||||
users who | Afficher le nom des utilisateurs actuellement connectés sur cette machine. | ||||
yes | Affiche indéfiniment une chaîne de caractères jusqu'à ce que le processus soit tué. |
Deux des commandes filtres précédemment énumérées méritent une attention particulière car, outre les services qu'elles peuvent rendre dans le cadre du scripting, ce sont également des langages de programmation à part entière, dont l'étude sortirait toutefois du cadre présent document. Un survol de leur possibilité est toutefois nécessaire.
Sed signifie "Stream EDitor" autrement dit "éditeur de flux". De par son mode de fonctionnement, Sed peut être défini comme un éditeur non-interactif.
L'éditeur de flux Sed lit les lignes d'un ou plusieurs fichiers ou depuis l'entrée standard, et y applique des commandes lues elles aussi depuis l'entrée standard sous forme d'expressions (commandes d'édition) ou depuis un fichier texte (script), et écrit le résultat du traitement sur la sortie standard. Il est possible de résumer ainsi le mécanisme de fonctionnement de Sed :
lecture d'une ligne sur le flux d'entrée |
traitement de la ligne en fonctions des diverses commandes lues |
affichage (ou non) du résultat sur la sortie standard |
passage à la ligne suivante |
sed [-options] [commande] [<fichier(s)>] |
ou sa forme plus complète : |
sed [-n [-e commande] [-f script] [-i[.extension]] [l [cesure]] rsu] [commande] [<fichier(s)>] |
[adresse[,adresse]][!]commande[arguments] |
[adresse[,adresse]][!]{commande1; commande2; commande3 }[arguments] |
# : Commentaire (pas d'adressage autorisé). |
q : Quitter (adressage autorisé) . |
d : Suppression de la ligne (adressage autorisé) . |
p : Affichage (adressage autorisé). |
n : Ligne suivante (adressage autorisé). |
s/ch1/ch2/ : substitution (adressage autorisé). |
y/ch1/ch2/ : Transposition (adressage autorisé). |
a\texte\ : Ajout sur la ligne(une adresse autorisée). |
i\texte\ : Insertion (une adresse autorisée). |
c \texte : Echange le contenu de la ligne par le texte (adressage autorisé). |
r fichier : Lecture (et insertion) du fichier (une adresse autorisée). |
w fichier : Ecriture dans un fichier (une adresse autorisée). |
= : Affiche le n° de ligne courante (une adresse autorisée). |
l [largeur] : Affiche les caractères non imprimables et tronque éventuellement à N la ligne (adressage autorisé). |
g :susbtitution globale. |
[0-9]* : N° d'occurence à traiter. |
p : Affichage de la ligne(nécessite l'option -n). |
w fic_sortie : Enregistrement dans le fichier spécifié. |
e : Evaluation et exécution par le shell. |
I : Insensibilité à la casse. |
Exemples d'adressages et de commandes :
for i in $(seq 1 20); do echo "Ligne $i" >> fic.txt; done : résultat ??? |
sed -n 3p fic.txt : affiche la ligne 3 du fichier. |
sed -n 1~2p fic.txt : affiche toutes les deux lignes à compter de la ligne 1 du fichier. |
sed -n '3,6 p' fic.txt : affiche les lignes 3 à 6 du fichier. |
sed -n '/Ligne [123789][0]*/p' fic.txt : affiche les lignes correspondant au motif (ER) fourni entre les délimiteurs '/'. |
sed -n '/Ligne 3/,/Ligne 12/ p' fic.txt : affiche les lignes comprises enter deux correpondances. |
sed -n '2,/Ligne 6/ p' fic.txt : affiche les lignes 2 jusqu'àt la correspondance. |
sed -n '/Ligne 5/,+5 p' fic.txt : affiche les 5 lignes suivant la correspondance. |
sed '10,19 d' fic.txt : Supprime les lignes 10 à 19. |
sed '/1[0-9] d' fic.txt : Supprime les lignes 10 à 19. |
sed '2,/Ligne [569]/ s/Ligne/Bonjour/' fic.txt : Substitue Ligne par Bonjour sur les lignes 2 à 5 et affiche les autres sans modification. |
sed -n '2,/Ligne [569]/ s/Ligne/Bonjour/' fic.txt : Substitue Ligne par Bonjour sur les lignes 2 à 5 les affiche. |
sed -e "s/\([0-9][0-9]*\)/--\1--/" fic.txt : Substitue le n° suivant Ligne par -- numéro - via l'extraction de sous-chaine ciblée. |
sed -e "s/\(Ligne\).*\([0-9][0-9]*\)/--\2 \1--/" fic.txt : Affiche le -- n° Ligne -- via l'extraction de 2 sous-chaines ciblées. |
sed -n '1~2 s/Ligne/Bonjour/ p; $a\LA FIN' fic.txt : Substitue Ligne par Bonjour une ligne sur 2 et ajoute 'LA FIN' en fin de fichier. |
Exemples d'utilisation commune de sed (mono-lignes) :
- Supprimer les lignes vides : sed '/^\t*$/d' . |
- Supprimer les commentaires : sed 's/#.*$//' . |
- insérer une ligne vide avant la ligne repérée par le motif : sed '/ER/{x;p;x;}' . |
- insérer une ligne vide après la ligne repérée par le motif : sed '/ER/G' . |
- insérer une ligne vide avant et après la ligne repérée par le motif : sed '/RE/{x;p;x;G;}' . |
- compter les lignes d'un fichier : sed -n '$=' . |
- Eliminer les espaces blancs en début de ligne : sed 's/^[ \t]*//'. |
- Eliminer les espaces blancs en fin de ligne : sed 's/[ \t]*$//'. |
- Aligner du texte à droite (ici 79° colonne) : sed -e :a -e 's/^.\{1,78\}$/ &/;ta' . |
- Centrer du texte à droite (ici sur 80 colonnes) : sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' . |
- Renverser l'ordre des caractères : sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' . |
- Formater des nombres décimaux : sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1.\2/;ta' . |
Sed est autrement plus riche que les fonctions basiques qui ont été décrites dans cette section, et mérite sûrement une étude plus poussée, ne serait-ce que par la lectrure attentive d'un des nombreux tutoriels qui vent être trouvés sur internet.
awk est un autre outil particulièrement adapté au traitement de données textuelles, son nom provient des initiales de ses 3 concepteurs : AHO, WEINBERGER et KERNIGHAN. Il s'agit en fait d'un véritable langage de script mais ses fonctionnalités de base en font également un outil incontournable pour l'écriture de scripts.
La syntaxe de base est la suivante :
awk [options] '{actions [; action]}' [fichier] |
ou |
awk [options] -f script [fichier] |
Lors du parcours d'un fichier, awk procède au découpage de chacune des lignes (enregistrement) pour en extraire des variables (champs) sur lesquels il sera possible ensuite travailler. Ce découpage est effectué en fonction des valeurs d'un certain nombre de variables internes à awk :
Tableau 7. Opérateurs de tests portant sur des nombres :
variable | valeur par défaut | rôle | |||
---|---|---|---|---|---|
RS | \n (newline) | Record Separator : caractère séparateur d'enregistrement (lignes). | |||
FS | Caractères blancs (espaces ou séparations) | Field Separator : caractère séparateur de champs. | |||
OFS | espace | Output Field Separator : caractère séparateur de champ utilisé pour l'affichage. | |||
ORS | \n (newline) | Output Record Separator : caractère séparateur d'enregistrement utilisé pour l'affichage. |
Tableau 8. Opérateurs de tests portant sur des nombres :
variable | valeur | |
---|---|---|
$0 | L'enregistrement en cours de traitement (la ligne). | |
NF | Nombre de champs de l'enregistrement courant. | |
$1, $2, ... $NF | Les champs découpés dans l'enregistrement courant. | |
NR | Numéro de l'enregistrement courant (1 pour la première ligne, etc...) | |
FNR | Indice de l'enregistrement courant relatif au fichier en cours de traitement. | |
FILENAME | Nom du fichier en cours de traitement. |
ps -edfal | awk '{print $3, $15}' |
ps -edfal | awk '{print "Commande", $15, "lancee par", $3, "- durée :", $14}' |
ls -l | grep -v total | awk '{ print "La taille du fichier",$9,"est",$5," octets."}' |
ls -l | awk '!/total/ { print "La taille du fichier",$9,"est",$5," octets."}' |
ls -al | awk '$9 ~ /[a-w]+/ { print "La taille du fichier",$9,"est",$5," octets."}' |
ls -al | awk '! /total/ && $9 !~ /^\./ { print "La taille du fichier",$9,"est",$5," octets."}' |
ls -l | awk 'NR==2 { print "La taille du fichier",$9,"est",$5," octets."}' |
ls -l | awk 'NR==2 || NR==4 { print "La taille du fichier",$9,"est",$5," octets."}' |
ls -l | awk 'NR==2, NR==4 { printf("La taille du fichier %s est %s octets.\n",$9, $5)}' |
Il est également possible de faire exécuter un traitement particulier avant et après le traitement du flux via l'utilisation des mots clés BEGIN et END :
ls -l | awk 'BEGIN {print "Les fichiers correspondants :"} \ |
NR==2 || NR==4 { print "La taille du fichier",$9,"est",$5," octets."} \ |
END {print "============= FIN ================="}' |
ls -l | awk -f ls.awk avec le fichier ls.awk contenant : |
# Section BEGIN => Appelée avant le traitement du flux BEGIN { print "Les fichiers correspondants :" } # Un section traitant le flux NR==2 || NR==4 { printf("La taille du fichier %s est %d octets\n",$9,$5) } # Section END invoquée après la lecture du flux de données END { print "============= FIN =================" }
awk permet de définir plusieurs sections de traitement pour le flux, lesquelles seront (conditionnellement) invoquées séquentiellement. |