Ligne de commande Linux avancée et scriptage bash (Linux 201) laurent.duchesne@calculquebec.ca maxime.boissonneault@calculquebec.ca Université Laval - Septembre 2014 1
2 Se connecter à Colosse ssh colosse.calculquebec.ca SSH est un protocole pour ouvrir un terminal sécurisé sur un système distant Sur Linux et Mac OS Intégré au système sous la forme de la commande ssh dans le terminal: $ ssh userxx@colosse.calculquebec.ca Sur Windows Télécharger Putty: http://goo.gl/f1wuee Connexion au poste : Nom d usager : formation Mot de passe : Calculquebec!
Hôte : colosse.calculquebec.ca Nom d usager : userxx Préparation des exercices : $ prepare_formation linux $ cd ~/linux201 laurent.duchesne@calculquebec.ca maxime.boissonneault@calculquebec.ca Université Laval - Septembre 2014 3
4 Prérequis 1. Ligne de commande de base Opération sur les fichiers Navigation dans le système de fichiers Exécution de commandes Variables d environnement 2. Principes de programmation Variables Boucles Structures conditionnelles
5 Plan de la présentation 1. Ligne de commande avancée «Flux» Redirections Outils Linux 2. Language bash Variables Boucles Structures conditionnelles Arithmétique Potluck
Introduction à Linux V1.0 Ligne de commande avancée 6
7 «Flux» 1. stdin Entrée standard 2. stdout Sortie standard 3. stderr Note L utilisation de ces «canaux» de communication est une convention généralement respectée, mais pas obligatoire. Sortie d erreur
8 «Pipes» et redirection 1. cmd1 cmd2 Prend la sortie standard de «cmd1» et l envoie à l entrée de «cmd2» 2. cmd > out.txt Prend la sortie standard de «cmd» et l écrit dans le fichier «out.txt» 3. cmd 2> err.txt Redirige la sortie d erreur de «cmd» et l écrit dans le fichier err.txt
9 «Pipes» et redirection 1. cmd 2>&1 > outerr.txt Redirige la sortie d erreur de «cmd» dans la sortie standard, puis envoie cette dernière dans le fichier «outerr.txt» 2. cmd >> out.txt Redirige la sortie standard de «cmd» et l ajoute à la fin du fichier «out.txt» 3. cmd < in.txt Prend le contenu du fichier «in.txt» et l envoie à «cmd»
10 Outils Linux grep : Filtrer un contenu awk : Opérer sur un contenu tr : Remplacer des caractères sort : Trier un contenu sed : Rechercher et remplacer sur des contenus paste, diff, head, tail, seq, etc.
11 grep [-Bx] [-Ax][-v] "expression" Sert à filtre un contenu Exemples : cat fichier.txt grep 10 cat fichier.txt grep "Resultat" cat fichier.txt grep -A1 "Resultat" cat fichier.txt grep -A1 "Resultat" grep -v "Resultat"
12 awk Fait des opérations sur un contenu Exemples : cat fichier.txt awk '{print $1}' cat fichier.txt awk '{print $1*3,$4}' cat fichier.txt awk '{a+=$1} END {print a}'
13 tr Remplacer des caractères Exemples : cat fichier.txt tr '.' ',' cat fichier.txt tr ' ' '\t' cat fichier.txt tr '\n' ' '
14 sort Trier un contenu Exemples : cat fichier.txt sort > fichier_tri.txt cat fichier.txt sort -k4 > fichier_tri4.txt cat fichier.txt sort -k4 -n > fichier_tri4.txt
15 sed Exemples : sed -i -e "s/10/12/g" fichier.txt cat fichier.txt sed -n "2p" cat fichier.txt sed -n "n;p"
Introduction à Linux V1.0 Language bash 16
Introduction à Linux V1.0 Variables 17
18 Anatomie d un script bash #!/bin/bash #commentaire Chemin d accès vers l interpréteur... commande 1 commande 2... Code de retour du script exit 0 chmod +x monscript.sh
19 Manuellement Exécution d un script bash $ bash monscript.sh Comme un exécutable «binaire» $ chmod +x monscript.sh $./monscript.sh C est ici que la ligne suivante est utile : #!/bin/bash
20 Variables MAVAR=3 Note : pas d espace après ou avant le «=» Exporter dans l environnement export MAVAR=3 Accéder à la valeur : ${MAVAR} Tableaux : MONTABLEAU[1]=32 Accès via : ${MONTABLEAU[1]}
21 Variables spéciales «$?» : Code de sortie de la dernière commande «$1, $2, $3,... ${10}, ${11}» : Paramètres du script ou de la fonction «$#» : Nombre d arguments du script «$$» : Numéro de processus (process ID) du script «$RANDOM»: Retourne un nombre aléatoire
22 Résultat d une commande Utiliser $(commande). Par exemple HOST=$(hostname) JOBS=$(cat jobs grep Running awk '{print $1} ) Syntaxe alternative : HOST=`hostname`
Introduction à Linux V1.0 Boucles 23
24 Boucle «for» (répertoire boucle_for) Boucle avec syntaxe C (c_style.sh) for (( i=1; i<=10; i++)); do echo $i done Boucle avec seq (seq.sh) for i in $(seq 1 10); do echo $i done Boucle avec accolades (curly.sh) for i in {1..10}; do echo $i done Boucle sur les fichiers (file.sh) for file in *.sh; do echo $file done
25 Exemples concrets À partir du résultat d une commande (parcourir_liste.sh) for jobid in $(cat jobs grep Idle awk '{print $1}'); do echo $jobid done
26 Exemples concrets Afficher le contenu de tous les fichiers *.sh (cat_sh.sh) for file in *.sh; do echo File $file echo ========================== cat $file echo ========================== done
27 Exercice #1 Dans exercice1/, écrire un script bash qui, à l aide de boucles : affiche les 2 premières lignes de tous les fichiers du répertoire «files» puis, affiche les chiffres de 1 à 10
28 Exercice #1 - Solution Écrire un script bash qui, à l aide de boucles : affiche les 2 premières lignes de tous les fichiers du répertoire «files» puis, affiche les chiffres de 1 à 10 for file in files/*; do head -n2 ${file} done for i in $(seq 1 10); do echo ${i} done
29 Boucle «while» (boucle_while/) while [[ condition ]]; do quelquechose done
30 Exemples Obtenir un nombre random supérieur à 15000 i=$random while [[ $i -lt 15000 ]]; do echo $i est inférieur à 15000. i=$random done echo $i est supérieur à 15000. (random.sh)
31 Exercice #2 Dans exercice2/, écrire un script qui : exécute «random_exitcode.sh» en boucle tant que le code de retour ($?) est 1 et qui affiche «Program failed.» à chaque fois. Indice La condition pour vérifier le code de retour est la suivante : $? == 1
32 Exercice #2 - Solution Dans exercice2/, écrire un script qui : exécute «random_exitcode.sh» en boucle tant que le code de retour ($?) est 1 et qui affiche «Program failed.» à chaque fois../random_exitcode.sh while [[ $? == 1 ]]; do echo Program failed../random_exitcode.sh done
Introduction à Linux V1.0 Structures conditionnelles 33
34 if/else (répertoire if/) if [[ condition ]]; then... elif [[ condition ]]; then... else fi...
35 Conditions arithmétiques entières -eq est égal à if [[ $a -eq $b ]] -ne n est pas égal à if [[ $a -ne $b ]] -gt est plus grand que if [[ $a -gt $b ]] -ge est plus grand ou égal à if [[ $a -ge $b ]] -lt est plus petit que if [[ $a -lt $b ]] -le est plus petit ou égal à if [[ $a -le $b ]]
Calcul Québec - Université Conditions Laval sur des chaînes de caractères 36 == est égal à if [[ "$a" == "$b" ]] == (pattern) if [[ $a == z* ]]!= n est pas égal à if [[ "$a"!= "$b" ]] < est plus petit que (ordre if [[ "$a" < "z" ]] alphabétique) -z est nulle if [[ -z "$a" ]] -n n est pas nulle/vide if [[ -n "$a" ]]
37 Conditions sur des fichiers -e le fichier existe if [[ -e $file ]] -f le fichier est un fichier (pas un répertoire) if [[ -f $file ]] -s le fichier n est pas vide if [[ -s $file ]] -d le «fichier» est un répertoire if [[ -d $file ]]
38 Autres conditions $ man bash [ ] Cherchez «CONDITIONAL EXPRESSIONS»
39 Combiner des conditions Et : if [[ condition1 && condition2 ]]; then...; fi Ou : if [[ condition1 condition2 ]]; then...; fi Les conditions en bash sont court-circuitées (seule la première condition est exécutée si elle est suffisante pour déterminer le résultat).
40 Exemples (tmpdir.sh) Choisir un répertoire de fichier temporaires if [[ -n $RAMDISK && -d $RAMDISK ]]; then TMPDIR=$RAMDISK elif [[ -d /tmp ]]; then TMPDIR=/tmp else TMPDIR=$(pwd) fi echo $TMPDIR
41 Exercice #3 Dans exercice3/, écrire un script qui : vérifie si le fichier «output.txt» existe si oui : le déplace vers output.txt.bak.yyyymmddhhmmss si non : le crée en y ajoutant la date Indice 1 La commande pour obtenir ou afficher la date est «date» Indice 2 La commande pour obtenir une date dans un format spécifique est : «date +FORMAT»
42 Exercice #3 - Solution Dans exercice3/, écrire un script qui : vérifie si le fichier «output.txt» existe si oui : le déplace vers output.txt.bak.yyyymmdd.hhmmss si non : le crée en y ajoutant la date D=$(date +%Y%m%d.%H%M%S) if [[ -f output.txt ]]; then mv output.txt output.txt.bak.${d} else date > output.txt fi
Introduction à Linux V1.0 Arithmétique 43
44 Opérations de base Limités aux opérations sur des entiers : echo $((3+4)) y=4 let y++ let y*=3 Pour nombres réels, voir «bc» ou «dc». Toute variable non-initialisée vaut 0.
45 Exercice #4 Dans exercice4/, écrire un script qui calcule le carré des nombres pairs entre 1 et 20, et le cube des nombres impaires. Indice Pour vérifier si un nombre est pair : if [[ $((i % 2)) == 0 ]]
46 Exercice #4 Dans exercice4/, écrire un script qui calcule le carré des nombres pairs entre 1 et 20, et le cube des nombres impaires. for i in {1..20}; do if [[ $((i % 2)) == 0 ]]; then echo "$i*$i = " $((i*i)) else echo "$i*$i*$i = " $((i*i*i)) fi done
Introduction à Linux V1.0 En vrac 47
48 wait et «&» «&» exécute une commande en arrière plan. «wait» attend que toutes les commandes en arrière plan précédentes soient terminées Exemple :./mon_programme 1 &./mon_programme 2 & wait
49 Briser ou coller des lignes Briser une ligne en deux : cat fichier.txt grep ^a cut -d':' -f2- awk '{print $1}' xargs ls -1 fgrep 01 xargs file cat fichier.txt grep ^a cut -d':' -f2- \ awk '{print $1}' xargs ls -1 \ fgrep 01 xargs file Mettre des instructions sur une seule ligne for file in *.txt; do cat ${file}; done
50 function mafonction() { echo $1 return $2 }... mafonction par1 par2 Fonctions
Introduction à Linux V1.0 Pour quoi ne pas faire de bash 51
Introduction à Linux V1.0 Pour la performance 52
53 Exemple réel file=$1 count=0 while read line; do n=$((count%4)) if [ "$n" -eq "0" ]; then echo -e ">"$line fi if [ "$n" -eq "1" ]; then echo -e $line fi (( count++ )) done < "$file"
54 Version «one-liner» awk 'NR%4!= 0' "$file" \ awk 'NR%3!=0' \ awk 'NR%2 == 1 { print ">"$0}; NR%2 == 0 { print $0 }'
Comparaison de performance 55 (exemples/perf/) «time» permet de calculer le temps d exécution $ time./bash_version.sh data.txt > data_out_bash.txt real 0m17.603s user 0m14.244s sys 0m3.168s $ time./awk_version.sh data.txt > data_out_awk.txt real 0m0.197s user 0m0.264s sys 0m0.067s
56 Ressources du CLUMEQ Site web Documentation Portail utilisateur Support http://www.calculquebec.ca https://wiki.calculquebec.ca/ https://portail.calculquebec.ca support@calculquebec.ca colosse@calculquebec.ca
57 Liens utiles Ligne de commande avancée : https://en.wikipedia.org/wiki/gnu_core_utilities https://en.wikipedia.org/wiki/list_of_unix_programs Scripts bash avancé http://www.tldp.org/ldp/abs/html/ http://wiki.bash-hackers.org/ http://mywiki.wooledge.org/bashguide Manuel de référence de bash http://www.gnu.org/software/bash/manual/bashref.html
58 Questions?