Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
projets:ecole:scripting:initiation_au_shell [Le 20/02/2022, 09:26]
Mister Lab [Présentation de "||"]
projets:ecole:scripting:initiation_au_shell [Le 11/09/2022, 13:17] (Version actuelle)
moths-art Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892)
Ligne 29: Ligne 29:
 À chaque entrée/​sortie est associée un numéro appelé **descripteur de fichier** comme vous pouvez le voir dans ce tableau récapitulatif : À chaque entrée/​sortie est associée un numéro appelé **descripteur de fichier** comme vous pouvez le voir dans ce tableau récapitulatif :
  
-^ Entrées/​Sorties ​            ^ Nom      ^ Numéro ​  ​^ ​ +^ Entrées/​Sorties ​            ^ Nom      ^ Numéro ​  ^
 | Entrée standard ​            ​| ​ stdin   ​| ​  ​0 ​     | | Entrée standard ​            ​| ​ stdin   ​| ​  ​0 ​     |
 | Sortie standard ​            ​| ​ stdout ​ |   ​1 ​     | | Sortie standard ​            ​| ​ stdout ​ |   ​1 ​     |
Ligne 51: Ligne 51:
 ==== Sorties ==== ==== Sorties ====
  
-Prenons un exemple, on connaît la commande "​ls"​ qui donne la liste des fichiers d'un répertoire et on veut enregistrer le résultat dans un fichier. Pour cela on    va rediriger le résultat ​de la sortie standard dans le fichier test à l'aide de la commande suivante :+Prenons un exemple, on connaît la commande "​ls"​ qui donne la liste des fichiers d'un répertoire et on veut enregistrer le résultat dans un fichier. Pour cela on    va rediriger le résultat ​dela sortie standard dans le fichier test à l'aide de la commande suivante :
  
 <​code>​ls > test</​code>​ <​code>​ls > test</​code>​
Ligne 67: Ligne 67:
 <​code>​ls >> test</​code>​ <​code>​ls >> test</​code>​
  
-Si test n'​existe pas il sera créé, si il existe le résultat sera ajouté à son contenu (à la fin du fichier). De la même manière, vous pouvez rediriger stderr : +Si test n'​existe pas il sera créé, si il existe le résultat sera ajouté à son contenu (à la fin du fichier). De la même manière, vous pouvez rediriger stderr :
  
 <​code>​lfdfdfj 2>> test</​code>​ <​code>​lfdfdfj 2>> test</​code>​
  
-Mais il est également possible de rediriger une sortie vers une autre sortie, par exemple "​2>&​1"​ signifie "​rediriger stderr vers ce que représente stdout"​. Ainsi +Mais il est également possible de rediriger une sortie vers une autre sortie, par exemple "​2>&​1"​ signifie "​rediriger stderr vers ce que représente stdout"​. Ainsi
  
 <​code>​ls > test 2>&​1</​code>​ <​code>​ls > test 2>&​1</​code>​
Ligne 79: Ligne 79:
 ==== Entrées ==== ==== Entrées ====
  
-Pour rediriger vers l'​entrée standard stdin, nous allons utiliser "<"​ et "<<"​. ​+Pour rediriger vers l'​entrée standard stdin, nous allons utiliser "<"​ et "<<"​.
  
 "​wc"​ permet de compter le nombre de lignes (option -l) ou de mots (option -w), plus d'​informations dans la page man de wc, en entrée. Pour compter le nombre de lignes d'un fichier on peut donc utiliser : "​wc"​ permet de compter le nombre de lignes (option -l) ou de mots (option -w), plus d'​informations dans la page man de wc, en entrée. Pour compter le nombre de lignes d'un fichier on peut donc utiliser :
Ligne 97: Ligne 97:
 Vous pouvez bien sur spécifier un chaîne différente de EOF comme FIN, END... Vous pouvez bien sur spécifier un chaîne différente de EOF comme FIN, END...
  
-En utilisant ">>"​ et "<<"​ nous pouvons facilement ajouter du texte dans un fichier de notre choix de la même manière qu'un éditeur de texte : +En utilisant ">>"​ et "<<"​ nous pouvons facilement ajouter du texte dans un fichier de notre choix de la même manière qu'un éditeur de texte :
  
 <​code>​cat >> fichier << EOF</​code>​ <​code>​cat >> fichier << EOF</​code>​
Ligne 135: Ligne 135:
 Pour présenter l'​outil **cut** nous allons par exemple considérer que nous voulons obtenir le premier mot (correspondant au nom de l'​utilisateur) du fichier /​etc/​passwd. Pour présenter l'​outil **cut** nous allons par exemple considérer que nous voulons obtenir le premier mot (correspondant au nom de l'​utilisateur) du fichier /​etc/​passwd.
  
-Avec cut, vous pouvez supprimer une partie de chaque ligne d'un fichier, soit en indiquant un séparateur (avec l'​option -d), soit en indiquant la position (via -c). +Avec cut, vous pouvez supprimer une partie de chaque ligne d'un fichier, soit en indiquant un séparateur (avec l'​option -d), soit en indiquant la position (via -c).
  
-Voyons tout de suite un exemple : +Voyons tout de suite un exemple :
  
 <​code>​cut -d: -f1 /​etc/​passwd</​code>​ <​code>​cut -d: -f1 /​etc/​passwd</​code>​
  
-L'​option "​-d:"​ indique que le **séparateur** sera ":",​ et "​-f1"​ indique que l'on veut récupérer seulement la **première partie**. ​+L'​option "​-d:"​ indique que le **séparateur** sera ":",​ et "​-f1"​ indique que l'on veut récupérer seulement la **première partie**.
  
 {{:​icons:​icontip.png ​ }} {{:​icons:​icontip.png ​ }}
Ligne 150: Ligne 150:
 <​code>​cut -d" " -f1,5 un_fichier</​code>​ <​code>​cut -d" " -f1,5 un_fichier</​code>​
  
-Maintenant si l'on travaille en fonction de la position : +Maintenant si l'on travaille en fonction de la position :
  
 <​code>​cut -c 1-10 /​etc/​passwd</​code>​ <​code>​cut -c 1-10 /​etc/​passwd</​code>​
Ligne 168: Ligne 168:
 <​code>​tail -n 5 /​var/​log/​Xorg.0.log</​code>​ <​code>​tail -n 5 /​var/​log/​Xorg.0.log</​code>​
  
-Pour récupérer le résultat d'une commande, nous allons utiliser l'​opérateur | appelé **pipe** (qui signifie tuyau...), son fonctionnement sera expliqué plus bas. Pour récupérer les 5 dernières du résultat ​de dmesg :+Pour récupérer le résultat d'une commande, nous allons utiliser l'​opérateur | appelé **pipe** (qui signifie tuyau...), son fonctionnement sera expliqué plus bas. Pour récupérer les 5 dernières du résultat ​dedmesg ​:
  
 <​code>​dmesg | tail -n 5</​code>​ <​code>​dmesg | tail -n 5</​code>​
  
-L'​option -f permet d'​afficher,​ à chaque fois qu'ils ont lieu, les ajouts au fichier, par exemple : +L'​option -f permet d'​afficher,​ à chaque fois qu'ils ont lieu, les ajouts au fichier, par exemple :
  
 <​code>​tail -f /​var/​log/​syslog</​code>​ <​code>​tail -f /​var/​log/​syslog</​code>​
Ligne 182: Ligne 182:
 ==== Présentation de "​|"​ ==== ==== Présentation de "​|"​ ====
  
-Cet opérateur permet d'​envoyer la **sortie standard** d'un programme **vers** **l'​entrée standard** d'un second programme, cela permet ainsi l'​enchaînement des commandes. Par exemple : +Cet opérateur permet d'​envoyer la **sortie standard** d'un programme **vers** **l'​entrée standard** d'un second programme, cela permet ainsi l'​enchaînement des commandes. Par exemple :
  
 <​code>​ls | wc -l</​code>​ <​code>​ls | wc -l</​code>​
Ligne 188: Ligne 188:
 La sortie standard de "​ls"​ devient l'​entrée standard de "wc -l". La sortie standard de "​ls"​ devient l'​entrée standard de "wc -l".
  
-Autres exemples : +Autres exemples :
  
 <​code>​cat fichier | wc -l</​code>​ <​code>​cat fichier | wc -l</​code>​
Ligne 195: Ligne 195:
  
 {{:​icons:​icontip.png ​ }} {{:​icons:​icontip.png ​ }}
->sort permet de trier les lignes d'un fichier texte, pour plus d'​information "man sort"​. ​+>sort permet de trier les lignes d'un fichier texte, pour plus d'​information "man sort".
  
-Vous pouvez bien sûr étendre cela à plus de deux programmes : +Vous pouvez bien sûr étendre cela à plus de deux programmes :
  
 <​code>​cat fichier | wc -l | wc -L</​code>​ <​code>​cat fichier | wc -l | wc -L</​code>​
  
-Vous pouvez aussi utiliser les redirections vues précédemment : +Vous pouvez aussi utiliser les redirections vues précédemment :
  
 <​code>​ls -la > fichier | wc -l</​code>​ <​code>​ls -la > fichier | wc -l</​code>​
  
-Dans le cas de "ls -la > fichier"​ nous pouvons remarquer qu'il n'y a rien sur stdout ou stderr. Pour pallier à cela le programme tee permet de copier l'​entrée standard sur la sortie standard et dans un fichier : "ls -la | tee fichier"​. ​+Dans le cas de "ls -la > fichier"​ nous pouvons remarquer qu'il n'y a rien sur stdout ou stderr. Pour pallier à cela le programme tee permet de copier l'​entrée standard sur la sortie standard et dans un fichier : "ls -la | tee fichier"​.
  
 Ainsi on utilisera : Ainsi on utilisera :
Ligne 223: Ligne 223:
 ==== Présentation de "&&"​ ==== ==== Présentation de "&&"​ ====
  
-Pour pouvoir bien comprendre ce que fait cet opérateur il faut d'​abord parler rapidement des **codes de retour** : quand vous lancez une commande, si elle se termine correctement alors le code de retour est "​0",​ ce qui correspond à un succès, dans le cas contraire le code de retour est différent de 0 (bien entendu les codes de retour différents de 0 ont une signification qui ne sera pas expliquée ici). +Pour pouvoir bien comprendre ce que fait cet opérateur il faut d'​abord parler rapidement des **codes de retour** : quand vous lancez une commande, si elle se termine correctement alors le code de retour est "​0",​ ce qui correspond à un succès, dans le cas contraire le code de retour est différent de 0 (bien entendu les codes de retour différents de 0 ont une signification qui ne sera pas expliquée ici).
  
-Si par exemple vous rentrez une commande erronée, le code de retour sera différent de 0 : "​fgsfdg"​. ​+Si par exemple vous rentrez une commande erronée, le code de retour sera différent de 0 : "​fgsfdg"​.
  
-Pour voir le code de retour de la dernière commande lancée : +Pour voir le code de retour de la dernière commande lancée :
  
 <​code>​echo $?</​code>​ <​code>​echo $?</​code>​
  
-L'​opérateur "&&"​ permet de lancer une commande si et seulement si la première (celle à gauche de l'​opérateur) s'est correctement terminée : +L'​opérateur "&&"​ permet de lancer une commande si et seulement si la première (celle à gauche de l'​opérateur) s'est correctement terminée :
  
 <​code>​ls && ls /</​code>​ <​code>​ls && ls /</​code>​
  
-Si la commande "​ls"​ se termine correctement alors "ls /" sera exécutée. Un second exemple : +Si la commande "​ls"​ se termine correctement alors "ls /" sera exécutée. Un second exemple :
  
 <​code>​fdgfdsg && ls</​code>​ <​code>​fdgfdsg && ls</​code>​
Ligne 276: Ligne 276:
 L'​opérateur **^** indique le **début d'une ligne**. L'​opérateur **^** indique le **début d'une ligne**.
  
-On cherche maintenant les mots de 4 caractères commençant et finissant par un t, pour cela on utilise l'​opérateur "​**.**"​ qui remplace n'​importe quel caractère, il est parfois appelé **wildcard** : +On cherche maintenant les mots de 4 caractères commençant et finissant par un t, pour cela on utilise l'​opérateur "​**.**"​ qui remplace n'​importe quel caractère, il est parfois appelé **wildcard** :
  
 <​code>​grep '​^t..t$'​ /​tmp/​french.utf8</​code>​ <​code>​grep '​^t..t$'​ /​tmp/​french.utf8</​code>​
  
-Pour avoir exactement la ligne contenant "​coucou",​ qui doit donc commencer et finir par coucou : +Pour avoir exactement la ligne contenant "​coucou",​ qui doit donc commencer et finir par coucou :
  
 <​code>​grep '​^coucou$'​ /​tmp/​french.utf8</​code>​ <​code>​grep '​^coucou$'​ /​tmp/​french.utf8</​code>​
Ligne 287: Ligne 287:
  
   * * représente **0 ou plus** caractères. Exemple : d* = 0 ou plus fois "​d"​.   * * représente **0 ou plus** caractères. Exemple : d* = 0 ou plus fois "​d"​.
-  * + représente **1 ou plus** caractères. ​ +  * + représente **1 ou plus** caractères.
   * ? représente **0 ou 1** caractère.   * ? représente **0 ou 1** caractère.
  
-Par exemple si l'on cherche les mots commençant par "​t"​ et finissant par "​tant"​ : +Par exemple si l'on cherche les mots commençant par "​t"​ et finissant par "​tant"​ :
  
 <​code>​grep '​^t.*tant$'​ /​tmp/​french.utf8</​code>​ <​code>​grep '​^t.*tant$'​ /​tmp/​french.utf8</​code>​
Ligne 296: Ligne 296:
 "​^t"​ nous donne les mots commençant par "​t",​ "​tant$"​ prends ceux finissant par "​tant"​ et au milieu on veut 0 ou plus fois n'​importe quel caractère, donc le "​."​. "​^t"​ nous donne les mots commençant par "​t",​ "​tant$"​ prends ceux finissant par "​tant"​ et au milieu on veut 0 ou plus fois n'​importe quel caractère, donc le "​."​.
  
-On veut maintenant chercher les mots contenant "​m"​ ou "​mm",​ pour cela on va utiliser une expression régulière étendue, il faudra donc utiliser l'​option "​-E"​ de grep : +On veut maintenant chercher les mots contenant "​m"​ ou "​mm",​ pour cela on va utiliser une expression régulière étendue, il faudra donc utiliser l'​option "​-E"​ de grep :
  
 <​code>​grep -E '​m{1,​2}'​ /​tmp/​french.utf8</​code>​ <​code>​grep -E '​m{1,​2}'​ /​tmp/​french.utf8</​code>​
Ligne 325: Ligne 325:
 Les parenthèses permettent d'​isoler un regroupement,​ et le | correspond à "​où"​. Ceci renvoie donc les fichiers/​dossiers à la racine commençant par media ou mroot. Les parenthèses permettent d'​isoler un regroupement,​ et le | correspond à "​où"​. Ceci renvoie donc les fichiers/​dossiers à la racine commençant par media ou mroot.
  
-Alors que : +Alors que :
  
 <​code>​ls / | grep -E '​^media|root'</​code>​ <​code>​ls / | grep -E '​^media|root'</​code>​
Ligne 344: Ligne 344:
 <​code>​jean pOiNt durand at gmail.com</​code>​ <​code>​jean pOiNt durand at gmail.com</​code>​
  
-On remplace le "​."​ par " pOiNt " et le "​@"​ par " at ", on voit ici que l'on a mis "​\"​ devant le "​.",​ le "​\"​ est le caractère d'​échappement : le "​."​ est alors considéré comme le caractère "​."​. ​+On remplace le "​."​ par " pOiNt " et le "​@"​ par " at ", on voit ici que l'on a mis "​\"​ devant le "​.",​ le "​\"​ est le caractère d'​échappement : le "​."​ est alors considéré comme le caractère "​."​.
  
 De même si on veut remplacer "/"​ par "​slash",​ on utiliserait De même si on veut remplacer "/"​ par "​slash",​ on utiliserait
Ligne 371: Ligne 371:
 <​code>​echo "​moimoimoi"​ | sed '​s/​moi/​toi/​3'</​code>​ <​code>​echo "​moimoimoi"​ | sed '​s/​moi/​toi/​3'</​code>​
  
-Donne : +Donne :
  
 <​code>​moimoitoi</​code>​ <​code>​moimoitoi</​code>​
Ligne 379: Ligne 379:
 si /g modifie bien toutes les occurrences du fichier si /g modifie bien toutes les occurrences du fichier
 /n ne modifie que la première ligne du fichier /n ne modifie que la première ligne du fichier
-c'est pas clair : un exemple ​ +c'est pas clair : un exemple
  
 le fichier1 contient 3 lignes identiques kikoo le fichier1 contient 3 lignes identiques kikoo
Ligne 390: Ligne 390:
 le fichier1 n'est pas modifié ! le fichier1 n'est pas modifié !
    
-le fichier 2 devient kikoo#​kikookikoo les 2 autres lignes ne sont pas modifiées ​            ​+le fichier 2 devient kikoo#​kikookikoo les 2 autres lignes ne sont pas modifiées
  
 ---------------------------------------------------------- ----------------------------------------------------------
-résultat de  +résultat de 
-sed -i '​s/​kikoo/#​kikoo/​g ​ : les deux fichiers sont modifiés ​ +sed -i '​s/​kikoo/#​kikoo/​g ​ : les deux fichiers sont modifiés
  
-tous les kikoo deviennent #​kikoo ​+tous les kikoo deviennent #kikoo
  
 ---------------------------------------------------------- ----------------------------------------------------------
 </​note>​ </​note>​
  
-Nous allons maintenant voir l'​utilisation de variables avec sed ce qui permet d'​échanger,​ de déplacer des parties d'une chaîne de caractères. Exemple : +Nous allons maintenant voir l'​utilisation de variables avec sed ce qui permet d'​échanger,​ de déplacer des parties d'une chaîne de caractères. Exemple :
  
 <​code>​echo "​jean.durand" ​ | sed -r '​s/​(.*)\.(.*)/​\2.\1/'</​code>​ <​code>​echo "​jean.durand" ​ | sed -r '​s/​(.*)\.(.*)/​\2.\1/'</​code>​
Ligne 409: Ligne 409:
 <​code>​durand.jean</​code>​ <​code>​durand.jean</​code>​
  
-Pour terminer nous allons voir un exemple pratique : nous avons de nombreux dossiers contenant de nombreux mp3 nommés selon le schéma Knoklezout_au_taquet-Jamendo-David_TMX.mp3 et on désire avoir le nom d'​artiste avant le titre de la chanson tout en enlevant la publicité pour Jamendo. ​+Pour terminer nous allons voir un exemple pratique : nous avons de nombreux dossiers contenant de nombreux mp3 nommés selon le schéma Knoklezout_au_taquet-Jamendo-David_TMX.mp3 et on désire avoir le nom d'​artiste avant le titre de la chanson tout en enlevant la publicité pour Jamendo.
  
 Pour cela nous allons utiliser **rename** (qui vient avec perl) et nos chères expressions régulières : Pour cela nous allons utiliser **rename** (qui vient avec perl) et nos chères expressions régulières :
Ligne 434: Ligne 434:
  
 {{icons:​iconnote.png ​ }} {{icons:​iconnote.png ​ }}
->Les expressions régulières sont utilisés en Python, Perl , Ruby, PHP, Java, C, C++, par des programmes comme sed, awk, grep, vim, rename, ou encore des filtres dans apache et lighttpd ( mod_rewrite,​ vhosts ...), adblock dans firefox... Cette liste est bien sûr non exhaustive. ​   +>Les expressions régulières sont utilisés en Python, Perl , Ruby, PHP, Java, C, C++, par des programmes comme sed, awk, grep, vim, rename, ou encore des filtres dans apache et lighttpd ( mod_rewrite,​ vhosts ...), adblock dans firefox... Cette liste est bien sûr non exhaustive.
  
 ----------------- -----------------
  
 Rédigé par : [[:​utilisateurs:​qazer|jeromeg]],​ ptitdav69 et Wazzaaabid Rédigé par : [[:​utilisateurs:​qazer|jeromeg]],​ ptitdav69 et Wazzaaabid
  • projets/ecole/scripting/initiation_au_shell.txt
  • Dernière modification: Le 11/09/2022, 13:17
  • par moths-art