# UNIX E3 > [name= (c) 2019 Alexandre PRIMAULT, Sixtine TRAVERSE - Utilisation autorisée] [TOC] <p style="page-break-after: always;">&nbsp;</p> <p style="page-break-before: always;">&nbsp;</p> # Commandes linux ### `more` et `cat` - Visualiser le contenu d'un fichier :::info `more [OPTIONS...] FILENAME` ::: *Permet de visualiser le contenu un fichier avec pause. Utilisation de la touche **espace** pour continuer la lecture du fichier et **q** pour quitter.* :::info `cat [OPTIONS...] FILENAME` ::: *Affiche le contenu du fichier FILENAME dans la sortie standard* ### `ls` - Visualiser le contenu d'un dossier :::info `ls [OPTIONS...] FOLDERNAME` ::: | Option | Signification | | -------- | -------- | | -a | Affiche aussi les fichiers et dossiers cachés | | -A | Affiche aussi les fichiers et dossiers cachés à l'exception de `.` et `..` | | -h | Affiche les tailles de fichiers dans un format plus lisible | | -l | Affiche le contenu du dossier en ligne avec, dans l'ordre, les droits, le propriétaire, le groupe, la taille, la date de modification et le nom de chaque fichier | | -R | Liste récursive du contenu des dossiers (arborescence complète - arbre de fichiers) | | -r | Inverser le tri du contenu des répertoires | | -t | Affichage des fichiers par ordre de modification en commençant par le plus récent | | -v | Trier le contenu des répertoires en fonction de la version des fichiers (ex : ls -1v) | | -X | Trier l'affichage du contenu par ordre alphabétique des extensions (les fichiers sans extension sont affichés en premier) | ### `mkdir` - Créer un dossier :::info `mkdir [OPTIONS...] FOLDERNAMES...` ::: *Il est possible de créer plusieurs dossier, séparés par un espace* | Option | Signification | | -------- | -------- | | -m XXX | Permet de spécifier les droits sur le nouveau dossier (au format décimal, voir [Utilisateurs et droits](#Utilisateurs-et-droits) ) | | -p | Création récursive des dossiers | | -v | Affiche un message quand le dossier a été créé (verbose) | | -z | SELinux default security context | ### `rm` - Supprimer un fichier/dossier :::info `rm [OPTIONS...] NAME` ::: *Par défaut, ne demande pas de confirmation de suppression* | Option | Signification | | -------- | -------- | | -f | Forcer l'effacement du fichier ou du dossier et désactive le fonctionnement de l'option `-i` | | -i | Demander à l'utilisateur de confirmer l'effacement de chaque fichier | | -r | Supprimer récursivement le contenu des répertoires ainsi que le répertoire. Option obligatoire pour supprimer un répertoire non vide | :::warning Variante : `rmdir [OPTIONS...] FOLDERNAME` **Supprimer un dossier. Ne fonctionne que si le dossier est vide** ::: ### `cp` - Copier un fichier ou un dossier :::info `cp [OPTIONS...] NAME` ::: | Option | Signification | | -------- | -------- | | -f | Force la copie d'un élément. L'absence de cette option n'empêche pas l'écrasement d'un fichier par celui copié et désactive le fonctionnement de l'option `-i` | | -i | Demander confirmation avant d'écraser un fichier dans la destination | | -R | Copier récursivement les répertoires | | -v | Affiche les éléments copiés (verbose) | :::danger - Si un fichier est copié dans un dossier contenant un fichier de même nom, l'ancien fichier sera écrasé. - Si un dossier est copié dans un dossier contenant un dossier de même nom, les 2 dossiers seront fusionnés récursivement. La règle précédente pour les fichiers s'applique pour les fichiers contenu dans le dossier et l'intégralité de ses sous-dossiers. ::: ### `mv` - Déplacer un fichier ou un dossier :::info `mv [OPTIONS...] NAME` ::: | Option | Signification | | -------- | -------- | | -f | Force le déplacement d'un élément. L'absence de cette option n'empêche pas l'écrasement d'un fichier par celui copié et désactive le fonctionnement de l'option `-i` | | -i | Demander confirmation avant d'écraser un fichier dans la destination | | -v | Affiche les éléments déplacés (verbose) | :::danger - Si un fichier/dossier est déplacé dans le même dossier, il est renommé. - Si un fichier est déplacé dans un dossier contenant un fichier de même nom, l'ancien fichier sera écrasé. - Si un dossier est déplacé dans un dossier contenant un dossier de même nom, les 2 dossiers seront fusionnés récursivement. La règle précédente pour les fichiers s'applique pour les fichiers contenu dans le dossier et l'intégralité de ses sous-dossiers. ::: ### `cut` - Découper une chaine de caractère :::info `cut -fSTART[-][-END] -d'DELIMITER'` Utilise le résultat de la sortie de la commande précédente. Voir les exemples d'utilisation. ::: | Option | Utilisation | | -------- | -------- | | -d | Délimiteur. Composé d'**un seul** caractère qui sera utilisé pour découper la chaine | | -f | Numéro de l'occurence à afficher. Peut être un intervale. (Voir les exemples d'utilisation) | :::success **Exemple d'utilisation :** - `echo "a.b.c" | cut -d'.' -f2` Sortie : `b` - `echo "a.b.c.d.e" | cut -d'.' -f2-4` Sortie : `b.c.d` - `echo "a.b.c.d.e" | cut -d'.' -f2-` Sortie : `b.c.d.e` ::: ### `pwd` - Chemin du répertoire courant :::info `pwd` ::: Affiche le chemin absolu du répertoire courant. ### `cd` - Changer le répertoire courant :::info `cd DIRECTORYPATH` ::: ### `find` - Trouver un fichier :::info `find PATH -name PATTERN` ::: - `PATH` = Dossier dans lequel rechercher - `PATTERN` = Expression utilisée pour la recherche (expression régulière ou nom de fichier) ### `touch` - Créer un fichier :::info `touch FILENAME` ::: *Si le fichier existe, met à jour sa date de modification* ### `wc` - Compter le nombre de caractères, mots ou lignes d'un fichier :::info `wc [OPTIONS...] FILENAME` `... | wc [OPTIONS...]` ::: | Option | Signification | | -------- | -------- | | -c | Compte les caractères du fichier (nombre d'octets) | | -l | Compte les lignes du fichier | | -w | Compte les mots du fichier | ### `chown` - Changer le propriétaire d'un fichier :::info `chown USERNAME FILENAME` ::: :::danger On ne peut pas reprendre un fichier donné à un autre utilisateur. ::: ### `chgrp` - Changer le groupe d'un fichier :::info `chgrp GROUPNAME FILENAME` ::: ### `chmod` - Changer les droits d'un fichier :::info `chmod DROITS FILENAME` ::: ![](https://i.imgur.com/u91nglv.png) *Page 36-38 diapo 6 pages en 1* ### `sort` - Trier des lignes et les afficher :::info `... | sort` `sort [OPTIONS...] FILENAMES...` ::: | Option | Signification | | -------- | -------- | | -m | Concatène les fichiers avant de trier les lignes | ### `grep` - Sélection de lignes Voir [Expression régulières avec `grep`](#Expressions-régulières-avec-grep) ### `who` - Voir les utilisateurs connectés :::info `who` ::: ```bash= # Exemple de sortie local console Sep 25 08:14 local ttys000 Sep 29 16:17 ``` ### `whoami` - Affiche le pseudo de l'utilisateur courant :::info `whoami` ::: ```bash= # Exemple de sortie local ``` ### `ps` - Processus :::info `ps` ::: *Affiche l'état des processus en cours* ### `set` - Affichage des variables d'environnement :::info `set` ::: ### `alias` - Création d'un alias de commande :::info `alias ALIASNAME='COMMAND'` ::: Liste des alias avec la commande `alias` seule. ### `head` - Afficher le début d'un fichier :::info `head -N FILENAME` ::: *Affiche les N premières lignes d'un fichier* ### `tail` - Afficher la fin d'un fichier :::info `tail -N FILENAME` ::: *Affiche les N dernières lignes d'un fichier* <p style="page-break-after: always;">&nbsp;</p> <p style="page-break-before: always;">&nbsp;</p> # Expressions régulières avec `grep` ## Utilisation de la commande et options :::info `grep [OPTIONS...] PATTERN FILENAME` ::: :::success `grep -E '[0-9]{2,}' file` ::: ![](https://i.imgur.com/Lm7CH8R.png) ![](https://i.imgur.com/QnkdpQN.png) ## Métacaractères | Métacaractère | Description | | -------- | -------- | | ^ | Placé en début d'expression, signifie que le motif qui suit doit se trouver **exactement** en DEBUT de ligne (attention aux tabulations,...) | | $ | Placé en fin d'expression, signifie que le motif qui suit doit se trouver **exactement** en FIN de ligne (attention aux tabulations, espaces,...) | | \| | Reconnait l'un ou l'autre des caractères (ou expressions) qu'elle sépare. Souvent utilisé avec une paire de parenthèses. | | * | Reconnait la présence de l'élément précédent entre 0 et n fois. | | + | Reconnait la présence de l'élément précédent entre 1 et n fois. | | ? | Reconnait la présence de l'élément précédent entre 0 et 1 fois. | | . | Reconnait **un** caractère quelconque (sauf [`\n` - Saut de ligne](#Caractères-spéciaux)) | | [ ] | Reconnait **un** caractère parmis ceux énumérés dans la paire de crochets | | {m} | Reconnait la répétition de m fois **exactement** de l'élément précédent | | {m,n} | Reconnait la répétition entre m à n fois (inclus) de l'élément précédent | | {m,} | Reconnait la répétition de m fois **au moins** de l'élément précédent | | \\< | Placé en début d'expression, signifie que le motif qui suit doit se trouver **exactement** en DEBUT de mot | | \\> | Placé en fin d'expression, signifie que le motif qui précède doit se trouver **exactement** en FIN de mot | ### Métacaractères dans une paire de crochet | Métacaractère | Description | | -------- | -------- | | ^ | Utilisé dans une paire de crochet (en première position), reconnait les caractères différents de ceux contenus dans la paire de crochet | | - | Désigne l'intervalle entre les 2 caractères présents de part et d'autre du tiret dans une paire de crochet. | :::warning Pour utiliser un métacaractère en tant que caractère simple, on utilise le caractère d'échappement `\` suivi du caractère en question. Un mot est une chaine de caractère constituée uniquement de caractères alphabétiques et numériques ainsi que du caractère `_` (underscore) ::: ## Classes de caractère prédéfinies (norme POSIX) ![](https://i.imgur.com/q8KRDYP.png) ![](https://i.imgur.com/DXrQBfL.png) :::danger Ces séquences ne sont utilisables que dans une expression entre crochets Exemple : `[[:alpha:]01]` pour ne prendre que les lettres ainsi que 0 et 1. ::: ## Caractères spéciaux | Caractère | Description | | -------- | -------- | | \\n | Retour à la ligne | | \\t | Tabulation | ## Exemples - `\< est \>` - Reconnait le mot entier est <p style="page-break-after: always;">&nbsp;</p> <p style="page-break-before: always;">&nbsp;</p> # Scripts ## Entrée utilisateur :::info `read -p "Entrez un nombre : " NOM_VARIABLE` ::: ## Déclaration et affichage du contenu d'une variable :::info `NOM_VARIABLE="toto"` `echo $NOM_VARIABLE` # Retourne toto ::: :::danger Pas d'espace avant ni après le `=` lors de la déclaration d'une variable ! ::: ## Variables spéciales ![](https://i.imgur.com/clQTKRA.png) ## Structures conditionnelles ### `if` ```bash if [ condition ]; then # Code à exécuter elif [ condition ]; then # else if - Facultatif # Code à éxécuter else # Facultatif # Code à exécuter fi ``` :::info Vrai = 0 Faux = 1 (ou supérieur) ::: #### Opérateurs logiques ![](https://i.imgur.com/SoyH9vn.png) #### Opérateurs de comparaison - Nombres ![](https://i.imgur.com/TyUdAGL.png) #### Opérateurs de comparaison - Chaines ![](https://i.imgur.com/Xlku6th.png) #### Opérateurs logiques et de comparaison - Fichiers et dossiers ![](https://i.imgur.com/pp0D04H.png) ### `case` ```bash case $VAR_A_REGARDER in val_1 ) commande1 ;; # Ne pas oublier ;; val_2 ) commande2 ;; val_3 ) commande3 ;; * ) echo "Cas par défaut" ;; esac ``` :::danger **NE PAS OUBLIER LES ;;** ::: ### `select` ```bash select ITEM in "Choix 1" "Choix 2" "Choix 3" ... do case $REPLY in 1 ) "Vous avez choisi le choix $ITEM" ;; # Ne pas oublier ;; 2 ) commande2 ;; 3 ) commande3 ;; * ) echo "Sélection invalide" ;; esac done ``` ## Boucles ### `for` ```bash for (( i = 0; i < 10; i++ )); do #statements done ``` ```bash for elem in $var; do #statements # Exemple : 'echo $elem' done ``` ### `while` ```bash while [[ condition ]]; do #statements done ``` ### `until` :::warning La condition est exécutée après le contenu de la boucle ::: ```bash until [[ condition ]]; do #statements done ``` ## Exemples ### Lire les mots d'un fichier ```bash= for mot in $texte; do # Code exécuté à chaque boucle done ``` ### Lire les lignes d'un fichier ```bash= while read line do echo $line done < data.txt ``` ### Exécuter une commande et vérifier le résultat ```bash= # Tant que l'utilisateur le désire, # Exécuter la commande tapée par l'utilisateur # Afficher un message d'erreur si la commande c'est mal terminée until [[ $COMMANDE == "stop" ]]; do read -p "Entrez une commande (stop pour sortir) " COMMANDE $COMMANDE 2> /dev/null ERR_CODE=$? if [[ $ERR_CODE -gt 0 ]]; then echo "Une erreur est survenue lors de l'exécution de la commande '$COMMANDE' (code d'erreur $ERR_CODE)" fi done ``` ### Affichage d'un menu avec `while` ```bash= while [ 1 -eq 1 ]; do # Boucle infinie read -p "--- MENU --- 1. Afficher le nombre de personne 2.Afficher la liste des processus 3. Afficher la date 9. Quitter Selectionner une option : " REPLY case $REPLY in 1) who | wc -l ;; # Ne pas oublier ;; 2) ps ;; 3) date ;; 9) exit 0 ;; # Quitte le script *) echo "Veuillez saisir une entrée correcte" ;; esac done ``` # Arithmétique :::info Les expression contenues dans `$((...))` seront traitées comme des expressions arithmétiques Il est aussi possible d'utiliser `let` pour déclarer une expression arithmétique ::: :::danger Dans une expression arithmétique, les variables ne sont pas préfixées par `$` ::: :::success `a=$((2+2))` `echo $a` # Retourne 4 `let b=a+a` `echo $b` # Retourne 8 `a=$((b+b))` `echo $a` # Retourne 16 ::: # Redirections et pipe | Symbole | Signification | | -------- | -------- | | < | Redirige l'entrée standard | | > | Redirige la sortie standard | | >> | Concatène la sortie standard (si c'est un fichier, ajoute le contenu à la fin de ce dernier) | | 2> | Redirige la sortie d'erreur | | >& | Redirige la sortie standard et la sortie d'erreur | | \| | Le pipe permet d'utiliser la sortie de la commande précédent le signe `|` comme entrée de la commande suivante # Bibliographie - Notes de TP, Sixtine TRAVERSE, 2019 - Notes de TP et scripts, Alexandre PRIMAULT, 2019 - Théorie des langages formels - Expressions régulières, Céline MARTEAU, 2018 - Expressions régulières avec l'outil GREP, Céline MARTEAU, 2018 - Introduction à Unix, Benjamin PERRET, 2019