Programmation en exploitation sous UNIX

Transcription

Programmation en exploitation sous UNIX
Licence GSINFO
Programmation
Nadia Abchiche Mimouni
Gilney Damm
Département GEII, IUT Évry
en exploitation sous
UNIX
Octobre 2003
Avertissement
• Ce document est un support de cours. Il ne
constitue en aucun un ouvrage de référence à la
programmation en exploitation. Son exploitation
est subordonnée à la présence au cours dispensé
par l’enseignant.
• Il est fortement conseillé d’annoter ce document
grâce aux explications et exemples fournis durant
le cours.
• Pour toute remarque, envoyer un courrier à
[email protected]
Le Shell
Un programme C non intégré au noyau
• Interpréteur de commandes
• Langage de programmation
• Permet d’étendre les commandes du système
d’exploitation
• Nombreuses versions
Caractéristiques de l’interprète
• Analyse et interprète des lignes de commandes
• Création et lancement des processus associés aux commandes
(contrôle de processus)
• Distinction entre processus bloquant et tâche de fond
• Redirection des E/S
• Mécanisme de substitution de chaînes de caractères
• Accès aux ressources de la machine : le processeur (implicitement),
le(s) disque(s), imprimantes,…
via des commandes.
• Affiche un prompt pour signifier qu'
il est prêt à interpréter une
commande
• Permet d’étendre les commandes du système l’exploitation
• Propose un véritable langage de programmation
• Nombreuses versions (sh, csh, ksh, bash,…)
Structure de la boucle d’interprétation
• Le shell est un programme dont l’algo pourrait être :
Tant que vrai
– Lire une ligne
– Identifier la commande (vérifier la syntaxe et sémantique)
– Création d’un processus exécutant le fichier associé à la
commande
– Attente de la fin d’exécution de ce processus
Fin Tant que
Choix du shell
Nombreuses versions
• sh shell Bourne (disponible sur toutes les
machines)
• csh Berkeley (Bill Joy)
• bash (bourne again shell)
• rsh exécution à distance
• tcsh, ksh, bash, vsh,…
Langage shell : généralités
• Variables utilisateurs (chaînes de caractères)
– Contenu obtenu en préfixant $ à la variable
– Affectation par l’opérateur = ( autrement selon le shell)
Exemple : v=bonjour
echo $v
Afficher bonjour
• Variables prédéfinies
– Affectées par le shell : # ? $ ! –
– Affectées avant l’exécution : HOME PATH MAIL TERM
PS1 PS2 IFS (variables de configuration)
– Macroprocesseur de substitution
– Commandes internes break continue cd eval exit export
login newgrp read shift set wait unmask trap
• Structure de contrôles : if-then-else for-do-done
while-do-done case-in-esac
Variables d'
environnement prédéfinies
• HOME
chemin d'
accès au répertoire initial de l'
utilisateur
• PATH
suite de chemins d'
accès aux répertoires des exécutables
• PS1
invite principale du shell en mode interpréteur
• PS2
invite secondaire du shell en mode programmation
• IFS
séparateurs de champ des arguments
• MAIL
chemin d'
accès à la boite aux lettres utilisateur
• MAILCHECK
intervalle en sec au bout duquel le mail est
contrôlé
• DISPLAY nom de l’écran d’affichage
• TERM
nom du type de terminal
Quotage
Rôle
le quotage est utilisé pour supprimer les fonctionnalités de certains caractères
spéciaux du shell, dont les métacaractères.
Méta-caractères: \ $ * ` " '
Caractère d ’échappement: \
le caractère \ préserve la valeur littérale du caractère qui le suit
Simples quotes '
...'
les caractères inclus entre 2 simples quotes ne sont pas évalués
Doubles quotes "..."
les caractères inclus entre 2 doubles quotes conservent leur valeur à l'
exception
de $ ` et \.
Exemple
TOTO='
bonjour ’
echo '
$TOTO et '"$TOTO"
$TOTO et bonjour
Syntaxe des commandes
$ <cmde> [<option> [<option[… ]]] [<fichier> [<fichier> […]]]
• $ est le prompt shell (modifiable par PS1)
• <cmde> correspond à un nom de commande (fichier exécutable)
• Une commande peut contenir plusieurs lignes (utiliser \) le
prompt devient alors « > » (modifiable par PS2)
• Une option est une lettre précédée par « - »
• Les espaces sont des séparateurs
• Pour les noms de fichiers, il existe des caractères génériques
(métacaractères) :
–
–
–
–
« * » pour n’importe quelle chaîne
« ? » pour n’importe quel caractère
« […] » n’importe quel caractère de la liste
« - » séparateur d’intervalle
Les commandes
• Le symbole $ invite l’utilisateur à taper une
commande (interprète de commandes)
• Les commandes sont tapées en minuscules
– $ <nom de la commande> [options] [paramètres]
– $ man <nom de la commande> donne une
documentation en ligne. Exemple : man login
– La variable MANPATH contient le répertoire où est
installé le manuel
• Voir les commandes whatis et catman
• Pour stopper la saisie de paramètres faire ctrl D
Les méta caractères (ou jockers)
Un méta caractère est un caractère qui a une signification
particulière
– Le caractère * représente un nombre quelconque de
caractère quelconques
– Le caractère ? représente un et un seul caractère
quelconque
– Le caractère [ commence une définition d’ensemble
qui se termine par ]
• Exemple1 : a[bc]d = abd acd
• Exemple2 : a[0-9] représente tous les fichier dont le nom
commence par a suivi d’un chiffre.
La commande man
•
Name
syntaxe et arguments
• Synopsis
usage
• Description
exemples, fichiers, exit values
• See also
Fichiers et autres commandes liés
• Variable MANPATH contient le chemin d’accès aux sources la
documentation
• Documentation organisés par thèmes en chapitres
Exemple : les commandes utilisateurs sont dans le chapitre 1 et les primitives
système dans le chapitre 2.
• Pour savoir dans quel répertoire vous vous trouvez,
utiliser la commande pwd :
pwd pour print working directory
pwd donne le chemin absolu de ce catalogue
• Pour changer de répertoire, utiliser la commande cd
–cd pour change directory
Syntaxe : cd <nom du répertoire destination>
Exemple1 : cd /users/ens/
Exemple 2 : cd ramène dans le répertoire de login
Lister le contenu d’un répertoire
• La commande ls –l liste les fichiers en donnant des informations.
• Exemple : Si on est dans gesinfo, ls –l donne :
total 2
-rwx r-x r-x
drwx r-x r-x
1
2
etud1
etud1
Propriétaire
du fichier
51
512
Taille du
fichier
Nombre de liens
Spécification d’accès pour le autres
Spécification d’accès pour le groupe
Spécification d’accès pour le propriétaire
Spécification du type de fichier
Oct 1 12:00
Oct 1 12:00
planing
src
Nom du fichier
Date dernière modification
Les options de la commande ls
• –a affiche tous les fichiers même ceux cachés
(commençants par .)
• -A affiche tous les fichiers même ceux cachés sauf
les répertoires . et ..
• -d affiche les répertoires en tant qu’objets et non pas
répertoire
• -l format long, donne toutes les informations sur les
objets.
• -t trie les fichiers selon la date de dernière
modification
• -R (Récursif) affiche le contenu des répertoires et
sous- répertoires associées.
Créer un répertoire
• mkdir pour make directory crée un
répertoire ou un sous répertoire
• Exemples :
$ mkdir sources
$ mkdir lettres jeux
$ mkdir /users/cours projets
$ mkdir –p lettres /jeux
Supprimer un répertoire
• rmdir pour remove directory supprime tout
répertoire vide
• $ rmdir projets
Changer les attributs d’un fichiers
• Possibilité de modifier les droits d’accès à un
fichier avec la commande
chmod pour change mode
• chmod <utilisateurs> [+-=][rwx]
• Paramètres :
u
g
User
groupe
+
-
Ajouter
Retirer
r lecture
w écriture
o
Others
=
Positionner
x
exécution
Exemples d’utilisation de la commande chmod
$ chmod o-r toto retire le droit de lecture pour les autres
utilisateurs pour le fichier toto
$ chmod ug+w toto ajout du droit d’écriture pour le
proriétaire et le groupe
$ chmod –rwx toto enlève tous les droits pour tout le
monde
$ chmod =r toto positionne pour tout le monde le droit de
lecture
$ chmod u=rw,go-rwx toto positionne les droits de
lecture/écriture pour le propriétaire, et retire tous les
droits pour le groupe et les autres
Afficher le contenu d’un fichier
• cat pour concatenate, admet plusieurs
paramètres
• Pour arrêter le défilement, taper ctrl s
• Pour reprendre le défilement, taper ctrl q
La commande more
• more accepte plusieurs fichiers : met en en tête
de chaque fichoer une bannière avec le nom du
fichier courant.
• Offre plusieurs options
–
–
–
–
? Permet de voire toutes les options
Return passe à la ligne suivante
Espace passe à la page suivante
q sort de l’affichage prématurément
Copier un fichier
Deux utilisations de la commande cp
• cp fichier1 fichier2 duplique fichier1 dans
fichier2
• cp fichier1 fichier2… fichiern repertoire
• cp –R rep1 rep2
Renommer/déplacer un fichier
• mv (move)
• Exemples :
–
–
–
–
mv toto titi
mv essai toto
mv toto titi /tmp
mv toto /tmp/titi
(renome toto en titi)
(renome essai en toto)
(déplace deux fichiers)
(déplace et renomme)
Détruire un fichier
• rm (remove) efface un ou plusieurs fichiers
• Exemples :
– rm toto
– rm essai1 essai2
– rm –r users/ens
• Options possibles :
– -f (force malgré les protections)
– -i pour confirmer la destruction
– -r pour détruire récursivement un répertoire
Commandes de manipulation de
fichiers
• basename permet d’extraire le nom le plus
relatif d’un fichier : $ basename <nom de
fichier> [suffixe]
• Exemples :
– $ basename /users/ens/moncompte
moncompte
– $ basename moncompte/src/pgme.c .c
pgme
– $ basename moncompte/src/pgme.c e.c
pgm
Pas de vérification de l’existence des fichiers
La commande dirname
• Extrait le chemin du fichier
• Exemple :
– dirname /etc/passwd
/etc
La commande cut
• Découpe des lignes d’un fichier ou de l’entrée
standard
• $ cut –cliste [<nom de fichier>]
• $ cut –fliste [-d<caractère>] [-s] [<nom de fichier>]
liste est une liste d’entiers séparés par des virgules
correspondant aux caractères
• Exemples de valeurs de liste :
–
–
–
–
1,4,7
1-3, 8
-5,10
3-
1 et 4 et 7
1 à 3 et 8
1 à 5 et 10
3 à la fin
Les options de la commande cut
• -c découpe selon les caractères
• -f découpe par champ selon le caractère
séparateur de champ donné par –d.
Par défaut le caractère séparateur est le
caractère tab
• -s supprime les lignes qui ne contiennent
pas de séparateur
Exemples d’utilisation de cut
• $ cut –c-5 /etc/passwd
extrait les 5
premiers caractères de chaque ligne du fichier
/etc/passwd
• $ cut –f1,5 –d: /etc/passwd
extrait le
premier champ (nom de login) et le cinquième
champ (nom réél de l’utilisateur) du fichier
/etc/passwd
La commande find
• Exécute une recherche selon les critères
définis dans une expression depuis le
chemin indiqué.
• Syntaxe : find <chemin> [<expression>]
Les expressions possibles pour find
• -name <nom>
recherche le fichier portant un nom
• -links <n>
recherche les fichiers possédant n liens
• -user <utilisateur>
recherche les fichiers appartenant à un
utilisateur
• -group <groupe>
recherche les fichiers appartenant à un
groupe
• -type <type> recherche les fichiers ayant un type (f=fichier,
d=répertoire, b=périphérique)
• -ctime <date> recherche les fichiers créés avant ou après une
date de création
• -print affiche le fichier pour lequel l’expression est réalisée
• -exec <commande> exécute une commande pour le fichier
trouvé
• -perm <masque> recherche les fichier ayant le mode
correspondant à un masque (3 chiffres en octal)
Exemples commande find
• $ find / -name passwd –print
• $ find .. –user u1 –print
• $ find . –type d –print –exec ls –l {}; print
• $ find / -name core –exec rm {} \; -print
• $ find / -name core –exec ls -l \; -exec rm
{}\;
La commande grep
• Recherche une chaîne de caractères dans un ou
plusieurs fichiers
• $ grep [<options>] <chaine> [<fichier>]
• Les options :
–
–
–
–
-i
ignore majuscules et minuscules
-h supprime le nom du fichier devant chaque lligne
-n affiche le numéro de ligne dans le fichier
-v affiche toutes les lignes sauf celles contenant la
chaîne
Exemples commande grep
• $ grep ‘^u’ /etc/passwd
• $ grep –v « ; » *.c
• $ grep ksh$ /etc/passwd
La commande head
• Extrait les n premières lignes d’un fichiers
• Syntaxe : head [-<n>] [<fichier>]
– Par défaut n=10 et c’est l’entrée standard qui
est prise
• Exemples :
– $ head –2 prog.c
– $ head lettre
La commande od
• Affiche le contenu d’un fichier sous des format de
données spécifié (en option)
• Les options :
–
–
–
–
-o
-c
-d, -D
-x, -X
affiche le contenu en octal (option par défaut)
caractères ascii
contenu affiché en décimal
contenu affiché en hexadécimal
• Exemples :
– od –c pgme
– od –x prog.c
La commande sort
• Trie et fusionne des fichiers
• Syntaxe : $ sort [<options>] [+pos1] [-pos2] [<fichier>]
• Les options :
–
–
–
–
-d
ordre lexicographique (par défaut)
-n, -b trie suivant la valeur numérique des champs
-r
trie selon l’ordre inverse
-tx
le caractère x devient le caractère séparateur de
champs par défaut c’est l’espace)
– +pos1-pos2
restreint la zone qui est utilisée pour le tri aux
champs qui commencent avec ppos1 et se terminant à pos2
Exemples commande sort
• $ sort /etc/passwd
• $ sort –r toto
• $ sort +0 –1 +3 –4 toto
La commande tail
• Copie une partie d’un fichier depuis un certain
point jusqu’à la fin
• Syntaxe : $ tail [+-n [lbc] [fr]] [<fichier>]
– +n à partir du début
– -n à partir de la fin
– L’unité l pour les lignes (10 par défaut), b pour les
blocs (512 octets), et c pour les caractères
– Si r est indiqué tail affiche alors en commençant par
la fin
– f indique que tail ne s’arrête pas en fin de fichier,
mais boucle en attendant que le fichier grossisse
Exemples commande tail
•
•
•
•
$ tail –10 prog.c
$ tail +10 prog.c
$ cat >> /tmp/essai
$ tail –2lf /tmp/essai
Commandes de surveillance
•
•
•
•
•
•
who, w, ps
nice, renice, kill
vmstat : statistiques sur la mémoire virtuelle
swapon, swapoff gestion espace pour la pagination
du espace sur les répertoires
df espace sur le système de fichiers
Commandes et flux
• Tubes nommés
• Redidections
• Arguments de commandes et entrées de
commandes
• Toute commande Unix, dès son lancement, possède 3 fichiers
ouverts :
– L’entrée standard (stdin) ou 0
– La sortie standard (stdout) ou 1
– La sortie erreur (stderr) ou 2
• Dans le shell sh, tout fichier ouvert par un programme est représenté
par &X, où X est un numéro qui s’incrémente à chaque ouverture de
fichier.
– stdin, stdout et stderr sont respectivement pour toute commande lancée dans
le shell &0, &1 et &2.
Exemples :
• Rediriger la sortie :
$ ls –l 1>listeFich.txt
• Rediriger les deux flux dans un même fichier
(en tapant une commande erronée)
$ ls –l >>erreur 2>&1
• Exemple : compter le nombre d’utilisateurs
connectés
$ who | wc –l
6
$ who | wc –l >temp
$ cat temp
6
• $ ls ; who >temp
bin
users
tmp
• $ cat temp
u1 tty05 Oct 8 08:35
u2 tty05 Oct 8 09:55
Seule la sortie de la dernière commande est redirigée vers
le fichier temp
• $(ls;who)>temp; cat temp
bin
users
tmp
u1 tty05 Oct 8 08:35
u2 tty05 Oct 8 09:55
Exécution des commandes
Différents modes d’exécution des commandes
1)
2)
3)
4)
Interactif (foreground)
Asynchrone (arrière plan, background)
Différé
cyclique
Mode d’exécution interactif (foreground)
• Mode dans lequel le système rend de façon
interactive le résultat de la commande (vue
précédement)
Mode d’exécution asynchrone (arrière plan, background)
• <commande> &
• nohup <commande> &
• les touches ctrl (contrôle) et z (simultanément), puis suivies de
la commande bg permet de lancer une commande en
background
• nohup évite que les processus lancés en backgroud ne soit
arrêtés lors du logout. Envoi résultat par mail à l’utilisateur.
• Lancement de plusieurs commandes sans attendre que chacune d’entre
elles se termine
• cat essai1 & cat essai2
… numéro du processus lancé par le Shell
• $ cc pgme.c &
124569
On récupère le promt shell avant que la compilation ne soit terminée
• $ (echo « Bonjour »;sleep 15; echo « Bye ») &
Mode d’exécution différé
• at <un temps> <commande>
Démon at
Commandes atq et atrm
Fichiers de configuration at.allow et at.deny (voir
plus loin fonctionnement similaire à ceux de
cron)
Fichers : /var/spool/cron/atspool
/var/spool/cron/at.jobs
Exemple : at 8:15 May 24 < fichCmde
Mode d’exécution différé cyclique
Démon cron
Commande crontab
Pour un utilisateur quelconque :
/var/spool/cron/crontabs/<nom utilisateur>
Pour le super utilisateur :
/var/spool/cron/crontabs/root
Format d’une ligne de ce fichier :
Minute heure jours_mois mois jours-semaine commande
Où :
–
–
–
–
–
–
Minute : 1 à 60
heure : 1 à 60
jours_mois : 1 à 31
mois : 1 à 12
jours-semaine : 0 à 6 (0=dimanche)
Commande : commande à exécuter de façon cyclique.
Contrôle du lancement de commandes cyclique
Fichiers de configuration associés :
• /etc/cron.d/cron.allow
• /etc/cron.d /cron.deny
• Accès autorisé à un utilisateur si :
/etc/cron.d/cron.allow existe et le user n’y est pas
Ou bien :
/etc/cron/cron.allow n’existe pas et si le nom user n’apparait pas dans cron.deny
• Acces refuse à un user si :
/etc/cron.d/cron.allow existe et le user n’y est pas
Ou bien
/etc/cron/cron.deny existe et l’utilisateur est dedans et cron.allow n’existe pas
• Si aucun des deux fichiers n’existe, seuls les utilisateurs ayant les autorisation
solaris.jobs.users peuvent soumetre des jobs
• Pour root, les règles s’appliquent si les 2 fichiers /etc/cron/cron.allow et
/etc/cron/cron. deny existent
Comment changer shell de login ?
1.
Si le shell est valide (présent dans /etc/shells) et les
binaires disponibles (/etc/sh, /etc/csh/, /etc/bash,…):
– chsh –s shellDeLogin utilisateur
– passwd –s
Une ligne du fichier /etc/passwd contient à la fin, le nom du shell
par défaut, à activer au moment du login.
2. Si les binaires ne sont pas disponibles :
Acquérir les sources et effectuer la compilation soimême.
• pdksh : version libre de ksh :
– ftp://ftp.cs.mun.ca/pub/pdksh
• bourne shell : compilateur CCsh, commercialié par
Comeau Computing :
– [email protected]
• bash écrit et maintenu par Free Software
Foundation
Quelques spécificités syntaxiques des différents shell
sh
• Caractères spéciaux: * ? [akl] [a-g] [!A-Z]
• # $ & ; < << > >> | ‘ « ` / () {}
• Passage d’arguments :
$0 $1… $9
$# nombre arguments (sauf $0)
$$ pid du shell qui exécute
$* chaine des arguments (sauf $0)
$@ liste des arguments (sauf $0)
$? Code retour de la dernière commande
$! Pid du dernier processus asynchrone
sh (suite)
• Variables nomDeVariable=valeur
Echo $ nomDeVariable
• Variables d’environnement
– Créées au login (HOME, USER…)
– Générales (MAIL, CLASSPATH, PATH,…°
• Le problème d’exportation de variables
echo $TOTO
TOTO='
bonjour je suis sh'
echo $TOTO
bonjour je suis sh
sh
echo $TOTO
(TOTO n'
a pas été exporte)
Ctrl+D
export TOTO
sh
echo $TOTO
(TOTO a été exporté)
bonjour je suis sh
Structure de contrôle
• Condition : c’est toujours le code retour d’une
commande (0 pour vrai, faux sinon)
Test expression où expression vaut :
•
•
•
•
•
•
•
-f nom
-d nom
-r (xw) nom
-s nom (taille)
-z chaine (chaine vide)
chaine1 = chaine2 chaine1 != chaine2 (égalité entre chaines)
Nombre1 –eq nombre2 (-ne –gt –ge –lt –le)
– Connecteurs ! –a -o
expr
• Permet l’arithmétique entière sur les variables.
+-*/%
A = `expr $A + 1`
• Permet la comparaison de chaînes de caractères (le
résultat est le nombre de caractères reconnus au début)
expr « 1234trfhj » : ‘[0-9]*’ donne 4
• Permet l’extraction de chaînes
expr « toto.c » : « \(.*\).c
donne toto
• Conditionnelle
if cond1
then
Cmde…
elif cond2
then
Cmde…
…
else
Cmde…
fi
• Conditionnelle multiple
case nomVariable in
chaine1) cmde…;;
chaine2) cmde…;;
…
esac
• Boucles
for nomVar in liste
do
Cmde…
Done
while cond
do
Cmde…
done
until cond
do
Cmde…
done
Sortie exceptionnelle par break(n) continue exit(n)
• Liste de commande :
{commande…} && {commande} si code retour est 0
{commande…} || {commande} si code retour n’est pas
0
• Fonction :
nomFonction() {commande…}
Peut renvoyer un code retour return(n)
Entrées/sorties
• read listeNomVariables
Lit sur l’entrée standard. Les chaînes sont
séparées par des espaces ou des tab
• echo chaine
\c pas de passage à la ligne
\b backspace
\n newline,…
Compléments sur les variables
• ${nomVariable}chaine
• ${nomVariable:-chaine} la substitution se
fait même si la variable est nulle ou non
initialisée
• ${nomVariable:+chaine} la substitution se
fait si la variable est initialisée, sinon
substitution de la chaine vide
ksh et bash
• Fichiers de configuration ~/.profile /etc/profile
/etc/suid_profile
• Variables d’environnement en plus
• Des fonctions en plus
• Autres spécificités :
Expansion de ~ en HOME
Compléments des noms par Esc
Commande alias et unalias (alias nomAlias=chaine)
Capture de la sortie standard par $(commande)
Historique des commandes
${nomVariable#chaine} enlève chaîne au début
${nomVariable%chaine} enlève chaîne à la fin
ksh et bash (suite)
• ${#nomVariable} retourne le nombre de caractères
• ${#*} ou ${#@} retourne le nombre de paramètres
positionnels
• Génération des noms de fichiers
?(listeDechaine) reconnaît 0 ou une des chaines
*(listeDechaine) reconnaît 0 ou plusieurs chaines
+(listeDechaine) reconnaît une ou plusieurs chaines
@(listeDechaine) reconnaît une des chaines
!(listeDechaine) reconnaît tout sauf une des chaines
Ksh et bash (suite)
• Tableau de variables :
typeset nomVariable[taille]
déclaration
set –A nomVariable listeChaine
affectation
nomVariable[rang]=chaine
affectation
${nomVariable[rang]}
désignataion
${nomVariable}[*]}
retourne la taille du tableau
ksh bash (suite)
• Commande let (préférable à la commande expr)
+ - * / % < <= > >= == !== = (affectation)
Exemples :
let i=2
let i=i+1
let « j =i*2 »
quoter si espaces
ou bien ((j =i*2))
pour ne pas quoter
if ((j <=i*2)) ….
ksh bash (suite)
• Expression conditionnelle
[[expression]] où epxression peut être :
fichier1 –nt fichier2 plus récent
fichier1 –ot fichier2 plus ancien
chaine1<chaine2 avant dasn l’ordre lexicographique
chaine1>chaine2 après dans l’ordre lexicographique
-l c’est un lien
-s c’est un socket
connecteurs ! && ||
csh
• Ce qui change :
Fichier de configuration ~/.cshrc
Définition des variables :
set nomVariable = valeur (unset)
setenv nomVariable valeur (unsetenv)
Structures de contrôle
if ( expression) then
commande…
elsif (expression)
commande…
else
commande…
endif
csh
• Switch ( chaine)
case motif:
commande…
[breaksw]
…
default:
commande…
endsw
csh (suite)
• foreach nomVariable (listeValeurs)
Commande…
end
while (expression)
commande
end
repeat nbFois commande
goto etiquette
etiquette:
csh (suite)
• Les paramètres positionnels ($0 $1… $9)
• argv[] accepté
• Les entrées : le read est remplacé par :
set nomVariable = $<
• Expression dans if while … :
+ - * / % ++ --<= >= <> == != =~ !~
• & ^ | (opération bit à bit)
• ! && ||
• if {commande} permet de tester le comde retour
Écriture de commandes shell
1. Fichier de commandes
•
•
•
Édition d’un fichier
Le nom du fichier sera le nom de la commande
Modification de la variable PATH
2. Mode interactif
Le langage awk
•Permet d’appliquer un programme, écrit dans une syntaxe
spécifique, à un ensemble de fichiers donnés en entrée
•Basé sur la notion de pattern qui permet d’effectuer un
filtrage sur les données des fichiers traités
•Plus élaboré que sed (stream editor)
•Deux commandes
/etc/bin/awk
et /usr/xpg4/bin/awk
La commande awk possède deux formes
1) awk ‘<programme>’ <fichier1> <fichier2> …
2) awk –f <fichierPgme> -F <carSep> <fichier1>
<fichier2> …
Forme générale d’un programme awk
BEGIN{<instructions initiales>
}
<sélecteur1 (pattern)> {<action1>}
<sélecteur2 (pattern)> {<action2>}
…
END{<instructions finales>
}
Lecture d’une ligne par awk
Awk lit chaque ligne d’entrée et la divise en
des champs séparés par un séparateur.
Dans une expression awk :
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
$0 représente la ligne d’entrée dans sa totalité
$1 représente le premier champ de la ligne
$2 représente le deuxième champ de la ligne
…
$i représente le i ième champ de la ligne
NF représente le nombre de champs de la ligne traitée
NR représente le nombre de lignes lues
FNR représente le nombre de lignes du fichier
FS représente le séparateur de champs (défaut espace ou tabulation)
RS représente le séparateur de ligne (défaut retour chariot)
ARGC représente le nombre d’arguments de la commande
ARGV représente un tableau des arguments (sans les option et le
programme et commence à zéro : ARGV[0] contient le nom de la
commande, ARGV [1] le premier fichier, ARGV [2] le deuxième
fichier,… de la commande
FILENAME représente nom du fichier actuel
OFMT représente le format d’impression des nombres
OFS représente le séparateur de champs à l’impression
ORS représente le séparateur de lignes à l’impression
Exemples
• awk ‘/srb/’ $HOME/toto
imprime toutes les lignes contenant la chaine srb dans le
fichier $HOME/toto
• awk ‘END{print NR}’ $HOME/toto
imprime le nombre de lignes du fichier $HOME/toto
• awk ‘{print $3}’ $HOME/toto
imprime le troisième champ de chaque ligne du fichier
• awk ‘NR==10’ imprime la dixième ligne de l’entrée
• awk ‘{champ=$NF}
END{print champ}’
imprime le dernier champ de la dernière ligne
Et encore d’autres exemples awk utiles
• awk ‘NF>4’ /$HOME/toto
imprime toute ligne à plus de 4 champs
• awk ‘$NF>4’ /$HOME/toto
imprime toute ligne dont le dernier champ est supérieur à 4
• awk ‘{nf=nf+NF}
END{print nf}’ /$HOME/toto
imprime le nombre de champs de toutes les lignes d’entrées
• awk ‘/jean/ {nlignes+=1; print nlignes} ‘
imprime le nombre de lignes contenant le mot ‘jean’
• awk ‘$1>max {max=$1;maxligne=$0}
END{print max,maxligne}’
imprime le plus grand champ et la ligne qui le contient
• awk ‘length($0)>80’ /$HOME/toto
imprime toute ligne plus longue que 80
Exemples (suite)
• awk ‘{temp=$1;$1=$2;$2=temp;print}’ /$HOME/toto
imprime chaque ligne en permutant le premier et le
deuxième champ
• awk ‘{print NR,$0} ‘/$HOME/toto
imprime chaque ligne précédée par le numéro de ligne
• awk ‘{for (i=NF;i>0;i=i-1)
printf (« %s »,$i)
printf(« \n »)
}’
imprime les champs de chaque ligne en ordre inverse
Expression awk
• Une expression awk peut prendre une valeur
numérique ou une chaine
• Opérateurs disponibles:
+,-,*,/,%,^ et la concaténation (caractère espace)
++,--,+=,-=,*=,/=,^= et %=
• Relations d’ordre (appliqués aux chaînes et aux nombres)
<,<=,==,!=,>=,>
• Opérateurs de filtrage explicites :
~ et !~
Exemples :
$1~ /srb/ est vraie que pour les enregistrements dont le
premier champ est égal à srb
(cf. Description ci dessous)
Les expressions régulières
• Pour être utilisées en tant que pattern (sélecteur) une
expression régulière doit être placée entre slash (/ et /)
de la façon suivante :
si r est une expression régulière, on écrit /r/
<expression> ~ /r/ vérifiée si la ligne contient r
<expression> !~ /r/ vérifiée si la ligne ne contient pas r
• Les métacaractères employés :
^,$,.,[], |(),*,+,?,\ (cf. Tableau)
\ sert à masquer un des autres caractères, placé devant certains
caractères il filtre une séquence de tabulation (tab chap2 p40
Expressions régulières utilisées
c
le non méta caractère
\c
le caractère littéral c
^
début de chaine
$
fin de chaîne
.
tout caractère
[c1c2…]
tout caractère c1, c2,…
[^c1c2…]
tout caractère sauf c1, c2,…
r1|r2
toute chaîne filtrée (matchée) par r1 ou bien r2
(r1)(r2)
toute chaîne xy où r1 filtre x et r2 filtre y
(r)*
zéro ou plusieurs chaînes consécutives filtrées par r
(r)+
une ou plus d’une chaînes consécutives filtrées par r
(r) ?
La chaîne nulle ou bien la chaîne filtré par r
(r)
toute chaîne filtrée par r
Signification des caractères précédé de \
• \b backspace : supprime le dernier caractère
d’une chaîne
• \f formfeed : nouvelle page
• \n newline : nouvelle ligne
• \r carriage return : retour à la ligne
• \t tabulation : crée une tabulation de 10 espaces
• \ddd
valeur octale ddd où ddd est trois
nombres compris entre 0 et 7
Exemples expressions régulières
•
•
•
•
•
•
•
•
/([a-zA-Z])(ee)/
/(forever|closer) (remain|and)/
/F*/
/FR+E/
/FRR*E/
/FR?E/
/[A-Z]+/
/^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$/
Utilisation des variables en awk
• Pas de déclaration ni d’initialisation explicite de variables ni de type
• Une variable peut correspondre à un type nombre ou chaîne ou même aux
deux. Awk convertit la valeur de la chaîne en nombre ou en chaîne lors de
l’exécution du programme.
• Initialisation à la chaîne vide
Exemple :
$1==« Fredo » {
Fredo=10;$2=$2+Fredo
print $2
}
Affiche la valeur du deuxième champ augmentée de 10 pour toute ligne dont
le premier champ est Fredo
• Exemples :
– NF>5
– $1> «s »
Les actions awk
Une action awk se compose d’une ou plusieurs instructions
séparées par un point-virgule ou un retour chariot. Une
instruction peut être :
Une affectation,une instruction conditionnelle, une boucle ou
l’appel d’une fonction standard telle que print. Voici la
liste des instructions :
If (condition) <instruction1> [else <instruction2>]
While (<condition>) <instruction>
for (<expr1>;<cond>;<expr>) <instr>
for (<var> in <tableau>) <inst>
do <instr> while (expr)
break
continue
{[<instructions]…}
Variable=expr
print [liste expr] [>epxr]
Les tableaux awk
• Pas de déclaration.
• Indexation possible avec des chaines de caractères
• D’où une utilisation possible comme mémoire
associative
• Exemple : le premier champ du fichier /etc/passwd
contient les noms de login des utilisateurs.
• awk ‘
BEGIN{FS=« : »
}
{if (user[$1] {print $1, « dupliqué »
}
user[$1]=NR
}’ </etc/passwd
Les fonctions prédéfinies awk
•
•
•
•
•
•
•
•
•
•
•
•
•
exp (x) retourne l’exponentiel de x
log(x)
sqrt (x)
int (x) retourne l’entier >0 le plus proche de x
rand() retourne un nombre au hasard entre 0 et 1 (>=0 et <1)
index (s,t) position de la première occurrence (apparition) de t dans s. rend zéro
si t n’apparaît pas dans s.
int (s) tronque s pour avoir un entier
length (s) longueur de s
match (s,x) position de l’expression régulière x dans la chaîne s
split (s,a,fs) disperse la chaine s dans un tableau a et retourne le nombre
d’éléments de a
sprint (fmt, listExpr) retourne listExpr formatée selon le format fmt
substr (s,m,n) retourne les n caractères, sous chaîne de s, en commençant à la
position m.
getline lit une ligne dans $0 (cf. ci-dessous)
Définition d’une fonction
• function <nom>(<liste de paramètres>)
{
[return [<expression>]]
<instructions>
}
<liste de paramètres> =séquence de variables
séparées par des virgules
Les sorties
•
•
•
•
•
•
•
•
•
•
•
print
print <expression1>, <expression2>,…
print <expression1>, <expression2>,…> <fichier>
print <expression1>, <expression2>,…>> <fichier>
print <expression1>, <expression2>,…| <commande>
printf (<format>,<expression1>, <expression2>,…)> <nomfichier>
printf (<format>,< expression1>, <expression2>,…)>> <fichier>
printf (<format>,< expression1>, <expression2>,…) | <commande>
close(<fichier>), cloture de la connexion entre printf et <fichier
close(<commande>) fermeture des pipes
system (<commande>) exécute une commande et retourne la
valeur retournée par la commande <commande>
Caractères d’écriture de formats
c caractère ASCII
d partie entière d’un nombre
e [-]d.ddddddE[+-] dd
f [-]ddd.dddddd
g e ou f selon ce qui est le plus court; supprime les
zéros en trop
o nombre octal non signé
s chaîne
x nombre hexadécimal non signé
% écrit un % aucun argument n’étant utilisé
Exemples de formats
Format : fmt
%c
%d
%5d
%e
%f
|%s|
|%.3s|
expression
97
97.5
97.5
97.5
97.5
largeur
largeur
résultat
a
97
97
9.750000E+01
97.500000
|largeur|
|lar|
Les entrées
• awk ‘<programme>’ <liste fichiers en entrée>
• awk ‘<programme>’ <entree standard>
• L’entrée peut être un pipe :
Exemple: grep ‘toto’ /etc/temp | awk ‘{
$1<=10 {print $0}
}’
• Séparateurs d’entrée: FS (équivalent de OFS sur la sortie)
et RS (équivalent de ORS sur la sortie)
• Modification possible en ligne de commande de FS avec
l’option –F
Exemple : awk –F’:’ –f fichpgme /etc/passwd
La fonction getline, pour lire des enregistrement en
entrée
• getline
lit sur l’entrée standard et remplit les variables $0, $1,
$2, $3,…, NR, NF et FNR
• getline <nom de variable> lit sur l’entrée standard et met le
met dans une variable
• getline <nom de fichier> lit l’enregistrement suivant dans le
fichier et le met dans $0 en mettant à jour NR
• getline <nom de variable> < <nom de fichier> lit le
prochain enregistrement du fichier et le met dans une variable
• <commande> | getline lit la sortie de commande et le place
dans $0 en mettant à jour NF
• <commande> | getline <nom de variable> lit la sortie de
commande et le place dans une variable
Applications
• Validation, transformation et traitements de
données
• Gestion de bases de données
• Génération de texte, mise à des formats
spéciaux
• Compilation, interprétation, transformation
de langage
• Expérimentation sur des algorithmes
Etudes d’exemples
• Base de données
• Mini langage
Base de données (spécifications)
• Interrogation d’une base de données d’une
discothèque. Elle regroupe, par style de musique, les
groupes, les titres des albums, le nombre de disques
selon le type de support (cassette, CD, ou disque
vinyl).
• On effectue plusieurs interrogations de la base :
– par style de musique (liste de tous les groupes avec
renseignements associés),
– Par groupe (liste des albums présents dans la base, le
nombre disponible et leur prix)
– Par titre d’album (prix, disponibilité, groupe et style)
Le menu qui apparaîtrait est :
Style de musique
Groupe
Titre d’album
Quitter
Tant que le choix Quitter n’est pas choisi, le
programme bouclera et chaque résultat
d’interrogation sera à la fois affiché sur la sortie
standard et mis dans un fichier out.dat où tous
les résultats seront mémorisés.
Il est également possible de modifier la base de
données.
• Nom du fichier = musique
• Structure du fichier avec les particularités
suivantes :
– Tous les caractères doivent être en majuscules
– Le champ séparateur entre les éléments virtuels est
« : » qui est initialisé au début du programme
– Le champ de détection du style de musique est « * »
– Le champ « ; » est un sous champ de détection à
l’intérieur d’un élément virtuel qui permet de
distinguer le type de support et le prix qui lui
associé
*
STYLE
GROUP
ALBUM
SUPPORT
PRIX
*
STYLE
GROUP
ALBUM
SUPPORT
PRIX
: HARD
: SCORPIONS
: I’M STILL LOVING YOU
: CD=546; VINYL=400; K7=71
:110;63;44
:ROCK
: ALAN PARSON PROJECT
: AYE IN THE SKY: STEREOTOMY
: CD=5346; VINYL=456; K7=96
:115;70;52
STYLE
:ROCK
GROUP
: PINK FLOYD
ALBUM
: THE ALL: ANIMALS:
OBSCUED BY CLOUDS
SUPPORT
: CD=4200; VINYL=213; K7=45
PRIX
:105;75;42
*
Un mini-langage: génération d’un calculateur
• Description des expressions arithmétiques par une grammaire :
expr
terme
expr + terme
expr – terme
terme
fait
terme*fait
terme/fait
fait
nombre
(expr)
Bibliographie
!"#$ $%# "
Éditions Eyrolles
& '&
,"-!!
%
Éditions Eyrolles
.&
!"#$ $## Édition Eyrolles
/ 1 & & '&
1
(&
2
!""$ -$,* 6
Éditions Eyrolles
( )
( )
3
./ 0
*)
+&
/
450
7 8
.&