user@deug14.2 12/10/14 _ _ _ _ | | | | '_ \| \ \/ / | '_ \| '__/ _ \ / _` | / __| '_ \ / _ \ | | | |_| | | | | |> < | |_) | | | (_) | (_| | \__ \ | | | __/ | | \__,_|_| |_|_/_/\_\ | .__/|_| \___/ \__, | |___/_| |_|\___|_|_| |_| |___/ --- travail personnel : requis utilisation du compte : libre commandes réseaux : interdites permission HOMEDIR : drwx------ Ne pas changer les noms de fichiers Utiliser des lignes de moins de 72 caracteres. Tous les programmes, fichiers etc... devront etre places dans le repertoire d'examen : /etudiants/user/exam-tp-I54-14-user Vous validerez votre travail par la commande : /home/partage/pl/validexam -m I54 --- Repondez aux questions dans ce fichier en précisant les commandes utilisées pour obtenir la réponse. Par exemple, a la question : [a] Lister les répertoires de recherche décrits par PATH. On peut répondre : :: echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin: /bin:/usr/local/sbin:/usr/sbin:/sbin:/home/pl/bin:/home/pl/script ou le caractère ':' est un séparateur de champs. ----------------------------------------------------------- 1) UNIX ----------------------------------------------------------- Répondre avec la commande appropriée. [a] Lister les répertoires de recherche décrits par PATH : en placant un répertoire par ligne. :: tr ':' '\n' <<< $PATH /usr/lib/lightdm/lightdm /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games [b] Lister les 3 processus les plus anciens d'UID nul. :: ps -u0 -opid,ppid,cmd | head -4 PID PPID CMD 1 0 /sbin/init 2 0 [kthreadd] 3 2 [ksoftirqd/0] [c] Quelle est la capacité mémoire de l'hôte ? :: free -m total used free shared buffers cached Mem: 1749 1146 602 0 206 502 -/+ buffers/cache: 436 1312 Swap: 1999 0 1999 entre 1 et 2 Go. [d] Quelle est la passerelle par défaut de l'hôte ? :: route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 0.0.0.0 10.9.184.1 0.0.0.0 UG 100 0 0 eth0 10.9.184.0 0.0.0.0 255.255.248.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0 la passerelle par defaut est 10.9.184.1 [e] Lister 5 filtres décrit comme tel dans le manuel. :: man -k filter | wc -l 80 :: man -k filter | grep -Eo '^[a-z]+' | tr '\n' ' '| fold -w72 filter mpool apgbfm bcomps bzless bzmore ccomps circo col colcrt cupsfil ter dbilogstrip detex dijkstra directomatic dot extractres fdp filterdif f fixdlsrps fixfmps fixmacps fixpsditps fixpspps fixscribeps fixtpps fix wfwps fixwpps fixwwps foomatic funzip gensprep git includeres ip iptable s lpdomatic martfilters more msgfilter mwfilter neato osage pam pbmfilte rs pcap pnmnlfilt ppmrelief psmerge sed sfdp svndumpfilter tc transcode tred twopi ufw wireshark y yuvmedianfilter yuvycsnoise zless zmore on retient de cette liste : col, dot, more, less, sed, on pense aux absents tr, awk, grep, nl... [f] Calculer 123456789 * 987654321 :: echo $(( 123456789 * 987654321 )) 121932631112635269 :: bc <<< '123456789 * 987654321' 121932631112635269 [g] Citer 5 variables initialisees par un shell de login ? La question n'est pas claire. Il s'agit des variables initialisées pour un shell de login. :: man login | grep LOGNAME fichier /etc/passwd. Les valeurs des variables d'environnement $HOME, $SHELL, $PATH, $LOGNAME, et $MAIL [h] Citer 3 pages du manuel de la glibc faisant référence à l'encyclopedie The Art of Computer Programming de Knuth. :: man -K 'Art of Computer Programming' donne : btree, initstate, random... ---------------------------------------------------------- 2) FILTRE ----------------------------------------------------------- Par voyelle, on désigne un des caractères : a, e, i, o, u, y, et donc, un caractère non accentué en minuscule. Préciser les commandes à appliquer à une source texte src.txt pour réaliser les actions : [a] afficher les lignes de src.txt en les numérotant. :: echo -e 'a\n1\nb\n2\nc\n3\nd\n5\ne\n5' > src.txt :: nl src.txt 1 a 2 1 3 b 4 2 5 c 6 3 7 d 8 5 9 e [b] afficher les trois premières lignes contenant un nombre. $ grep -m3 [0-9] src.txt 1 2 3 [c] afficher le contenu de src.txt sans les voyelles. :: tr -d '[aeiou]' < src.txt 1 b 2 c 3 d 5 5 [d] compter les voyelles de src.txt :: tr -cd '[aeiou]' < src.txt | wc -c 2 Répondre de manière concise : [e] Quels sont les différents types de fichiers unix. :: man find ( / type ) -type c b Fichier spécial en mode bloc (avec tampon) c Fichier spécial en mode caractère (sans tampon) d Répertoire p Tube nommé (FIFO) f Fichier régulier l Lien symbolique s Socket [f] Lister les fichiers réguliers de /tmp plus récents que src.txt ? :: find /tmp -type f -cnewer src.txt 2 > /dev/null [g] Que fait la commande : sed -ri '/l{2}/d' src.txt Supprime en place toutes les lignes contenant le motif ll. ----------------------------------------------------------- 3 COMMANDE ----------------------------------------------------------- Une commande externe est un fichier executable present dans un des répertoires decrits par la variable PATH. Une commande interne est une primitive du shell bash. Une commande homonyme est une commande interne dont le nom designe aussi une commande externe. [a] Donner un exemple de commande interne. :: type -f printf printf est une primitive du shell [b] Donner un exemple de commande externe. :: type -f bash bash est /bin/bash :: which bash /bin/bash [c] Donner un exemple de commande homonyme. :: printf /usr/bin/printf [d] Combien de commandes internes dans bash ? :: enable | wc -l 61 [e] Combien de commandes externes ? :: for r in $( tr ':' '\n' <<< $PATH ) ; do find $r -executable ;done | wc -l 3682 [f] Combien de commandes homonymes ? for c in $( enable ) ; do which $c 2>/dev/null ;done /usr/bin/[ /bin/echo /bin/false /bin/kill /usr/bin/printf /bin/pwd /usr/bin/test /bin/true indication : enable, which ----------------------------------------------------------- 4 SCRIPT : vendredi treize ----------------------------------------------------------- [a] Utiliser la commande date pour donner le jour (lundi, mardi,...) correspondant au 25 décembre 2014. :: date -d '12/25/14' +"%A" jeudi [b] Ecrire un script vendredi.sh qui liste les dates des vendredi 13 d'une année passée en argument. demo : :: cat ./vendredi.sh y=$1 for m in {1..12}; do date -d "$m/13/$y" ; done | grep ven :: ./vendredi.sh 2000 vendredi 13 octobre 2000, 00:00:00 (UTC+0200) :: cal -m10 2000 Octobre 2000 di lu ma me je ve sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [c] Ecrire un script periode.sh pour faire un fichier de donnees vt.dat sur 2 colonnes indiquant le nombre de vendredi 13 ( colonne 2 ) par an ( colonne 1 ) sur la période : 2001 à 2028. demo : :: ./periode.sh for y in {2001..2028} ; do echo -n $y ' ' for m in {1..12}; do date -d "$m/13/$y" ; done | grep -c ven done > ven.dat :: head -5 ven.dat 2001 2 2002 2 2003 1 2004 2 2005 1 [d] Faire une représentation grapĥique vt.png avec gnuplot. cat << PLOT | gnuplot set term png set output 'ven.png' plot 'ven.dat' w boxes quit PLOT [e] Utiliser les commandes sort et uniq pour extraire de vt.dat une statistque sur le nombre d'années contenant 0, 1, 2, 3 et... vendredi 13 :: sed -r 's/[0-9]+//' ven.dat | sort | uniq -c 12 1 12 2 4 3 [f] commenter. Il semble qu'il y ait toujours au moins un et au plus trois vendredi 13 par annee, mais ca, c'est plus une question d'arithmetique modulo 7. 3 ++----------+--------*-+----*------*----------+----------+--*-------++ + + * + * * + 'ven.dat' ****** + | * * * * | | * ** * * | | ** * * ** ** | 2.5 ++ * * * * * * * * ++ | * * * * * * * * | | * * * * * * * * | | * * * * * * * * | 2 ++**** * *** * * * * * * ******** *** * * ++ | * * * * * * * * * * * * * * * * | | * ** * * * * * * * * * * * * * * | | * * * * * * * * * * * * * * * * * | | * * * * * * * * * * * * * * * * * | 1.5 ++ * * * * * * * * * * * * * * * * * ++ | * * * * * * * * * * ** * * * * * | | * * * * ** * * ** ** * * ** * | | * ** * * * * * * * * * | + * * * * * * + * + * * * * + 1 ++-----*----*-----*----***------*--+-*--------+-****-----*----***---++ 2000 2005 2010 2015 2020 2025 2030 gnuplot> plot 'ven.dat' w l indication : bash, date, gnuplot. -----------------------------------------------------------