Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
elearning:workbooks:centos:8:lcf800:l701 [2023/07/14 10:37] – created admin | elearning:workbooks:centos:8:lcf800:l701 [2023/07/14 10:43] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 45: | Ligne 45: | ||
* noglob | * noglob | ||
* nounset | * nounset | ||
+ | * LAB #2 - Options et Arguments | ||
+ | * LAB #3 - Expressions Régulières | ||
+ | * ERb | ||
+ | * ERe | ||
+ | * Outils de Manipulation de Fichiers Texte | ||
+ | * Présentation des Commandes grep, egrep et fgrep | ||
+ | * La commande grep | ||
+ | * La Commande egrep | ||
+ | * La Commande fgrep | ||
+ | * LAB #4 - Utiliser grep, egrep et fgrep | ||
+ | * Présentation de la Commande sed | ||
+ | * LAB #5 - Utiliser la Commande sed | ||
+ | * Présentation de La Commande awk | ||
+ | * Découpage en champs | ||
+ | * Critères | ||
+ | * Une expression régulière valide pour la ligne | ||
+ | * Une expression régulière valide pour un champ | ||
+ | * Une comparaison | ||
+ | * Un opérateur logique | ||
+ | * Une variable interne | ||
+ | * Scripts awk | ||
+ | * La Fonction printf | ||
+ | * Structures de Contrôle | ||
+ | * if | ||
+ | * for | ||
+ | * while | ||
+ | * do-while | ||
+ | * LAB #6 - Utiliser la Commande awk | ||
+ | * LAB #7 -Autres Commandes Utiles | ||
+ | * 7.1 - La Commande expand | ||
+ | * 7.2 - La Commande unexpand | ||
+ | * 7.3 - La Commande cut | ||
+ | * 7.4 - La Commande uniq | ||
+ | * 7.5 - La Commande tr | ||
+ | * 7.6 - La Commande paste | ||
+ | * 7.7 - La Commande split | ||
+ | * 7.8 - La Commande diff | ||
+ | * 7.9 - La Commande cmp | ||
+ | * 7.10 - La commande patch | ||
+ | * 7.11 - La commande strings | ||
+ | * 7.12 - La commande comm | ||
+ | * 7.13 - La commande head | ||
+ | * 7.14 - La commande tail | ||
+ | * LAB #8 - Utiliser les commandes ifconfig, grep, tr et cut pour isoler l' | ||
+ | * LAB #9 - Utiliser les commandes ip, grep, awk et sed pour isoler l' | ||
=====Le Shell===== | =====Le Shell===== | ||
Ligne 1191: | Ligne 1235: | ||
</ | </ | ||
- | ===== LAB #2 - Les Scripts Shell ===== | + | =====LAB #2 - Options et Arguments===== |
- | Le but de la suite de cette unité est de vous amener | + | Les options sous Linux peuvent être exprimées |
- | Écrire des scripts compliqués est en dehors de la portée de cette unité car il nécessite une approche programmation qui ne peut être adressée | + | Premièrement les options courtes sont précédées par un simple tiré **-**, tandis |
- | ==== 2.1 - Exécution ==== | + | Un exemple est l' |
- | Un script shell est un fichier dont le contenu est lu en entrée standard par le shell. Le contenu du fichier est lu et exécuté d'une manière séquentielle. Afin qu'un script soit exécuté, il suffit qu'il puisse être lu au quel cas le script est exécuté par un shell fils soit en l' | + | * -h |
+ | * --help | ||
- | **/bin/bash myscript** | + | Deuxièmement les options courtes peuvent être combinées tandis que les options longues ne peuvent pas l' |
- | soit en redirigeant son entrée standard | + | < |
+ | [root@centos8 ~]# ls -lai /tmp | ||
+ | total 0 | ||
+ | 16800396 drwxrwxrwt. | ||
+ | 128 dr-xr-xr-x. 17 root root 224 Apr 19 11:50 .. | ||
+ | 25447488 drwxrwxrwt. | ||
+ | | ||
+ | 143 drwx------. | ||
+ | 621976 drwxrwxrwt. | ||
+ | 621954 drwxrwxrwt. | ||
+ | 17319048 drwxrwxrwt. | ||
+ | [root@centos8 ~]# ls -ali /tmp | ||
+ | total 0 | ||
+ | 16800396 drwxrwxrwt. | ||
+ | 128 dr-xr-xr-x. 17 root root 224 Apr 19 11:50 .. | ||
+ | 25447488 drwxrwxrwt. | ||
+ | | ||
+ | 143 drwx------. | ||
+ | 621976 drwxrwxrwt. | ||
+ | 621954 drwxrwxrwt. | ||
+ | 17319048 drwxrwxrwt. | ||
+ | [root@centos8 ~]# ls -ial /tmp | ||
+ | total 0 | ||
+ | 16800396 drwxrwxrwt. | ||
+ | 128 dr-xr-xr-x. 17 root root 224 Apr 19 11:50 .. | ||
+ | 25447488 drwxrwxrwt. | ||
+ | | ||
+ | 143 drwx------. | ||
+ | 621976 drwxrwxrwt. | ||
+ | 621954 drwxrwxrwt. | ||
+ | 17319048 drwxrwxrwt. | ||
+ | </ | ||
- | **/bin/bash < myscript** | + | La commande |
- | Dans le cas où le droit d' | + | < |
+ | [root@centos8 ~]# ls -l --all --inode /tmp | ||
+ | total 0 | ||
+ | 16800396 drwxrwxrwt. | ||
+ | 128 dr-xr-xr-x. 17 root root 224 Apr 19 11:50 .. | ||
+ | 25447488 drwxrwxrwt. | ||
+ | | ||
+ | 143 drwx------. | ||
+ | 621976 drwxrwxrwt. | ||
+ | 621954 drwxrwxrwt. | ||
+ | 17319048 drwxrwxrwt. | ||
+ | [root@centos8 ~]# ls -l --allinode /tmp | ||
+ | ls: unrecognized option ' | ||
+ | Try 'ls --help' | ||
+ | </ | ||
- | **myscript** | + | <WRAP center round important 60%> |
+ | **Important** : Les options prenant un argument ne sont pas combinées avec les autres options. | ||
+ | </ | ||
- | Pour lancer le script sans qu'il soit dans un répertoire du PATH, il convient de se placer dans le répertoire contenant le script et de le lancer ainsi : | + | =====LAB #3 - Expressions Régulières===== |
- | **./myscript** | + | La manipulation de fichiers textes utilise des **expressions régulières**. Sous Linux il existe deux types d' |
- | Dans le cas où le script doit être exécuté par le shell courant, dans les mêmes conditions que l' | + | * expressions régulières basiques - IEEE POSIX Basic Regular Expressions, appelées **ERb**, |
+ | * utilisées par les commandes **vi**, **grep**, **expr** | ||
+ | * expressions régulières étendues - IEEE POSIX Extended Regular Expressions, | ||
+ | * utilisées par les commandes **egrep** ( grep -E ) et **awk**. | ||
- | **. myscript** | + | Les expressions régulières utilisent des caractères spéciaux. Certains caractères sont communs aux Erb et aux Ere : |
- | Dans un script il est fortement conseillé d'inclure | + | ^Caractère spécial ^ Description ^ |
+ | | %%^%% | Trouver la chaîne au début de la ligne | | ||
+ | | $ | Trouver la chaîne à la fin de la ligne | | ||
+ | | \ | Annuler l'effet spécial du caractère suivant | | ||
+ | | [ ] | Trouver n' | ||
+ | | [%%^%%] | Exclure les caractères entre crochets | | ||
+ | | . | Trouver n'importe quel caractère sauf à la fin de la ligne | | ||
+ | | * | Trouver 0 ou plus du caractère qui précède | | ||
+ | | \< | Trouver la chaîne au début d'un mot | | ||
+ | | \> | Trouver la chaîne à la fin d'un mot | | ||
- | Il existe aussi un **pseudo commentaire** qui est placé au début du script. Ce pseudo commentaire permet de stipuler quel shell doit être utilisé pour l' | + | ====ERb==== |
- | #!/bin/sh | + | Certains caractères spéciaux sont spécifiques aux ERb : |
- | Puisque un script contient des lignes | + | ^Caractère spécial ^ Description ^ |
+ | | \{x,y\} | Trouver | ||
+ | | \{x\} | Trouver exactement le nombre **x** d' | ||
+ | | \{x,\} | Trouver le nombre **x** ou plus d'occurrences de ce qui précède | | ||
+ | | \(ERb) | Mémoriser | ||
+ | | \1 | Rappeler la première ERb mémorisée | | ||
+ | | \2, \3 ... | Rappeler | ||
+ | |||
+ | ====ERe==== | ||
+ | |||
+ | Certains caractères spéciaux sont spécifiques aux ERe : | ||
+ | |||
+ | ^Caractère spécial ^ Description ^ | ||
+ | | ? | Trouver 0 ou 1 occurrence de ce qui précède | | ||
+ | | + | Trouver 1 ou **n** d'occurrences de ce qui précède | | ||
+ | | {x,y} | Trouver de **x** à **y** occurrences de ce qui précède | | ||
+ | | {x} | Trouver exactement le nombre **x** d' | ||
+ | | {x,} | Trouver le nombre **x** ou plus d' | ||
+ | | () | Faire un **ET** des expressions régulières entre les paranthèses | | ||
+ | | %%|%% | Faire un **OU** des expressions régulières se trouvant de chaque côté du pipe | | ||
+ | |||
+ | =====Outils de Manipulation de Fichiers Texte===== | ||
+ | |||
+ | ====Présentation des Commandes grep, egrep et fgrep==== | ||
+ | |||
+ | ===La commande grep=== | ||
+ | |||
+ | La commande grep peut être utilisée pour rechercher des lignes contenant | ||
+ | |||
+ | Par défaut, la commande | ||
+ | |||
+ | La commande grep peut être aussi utilisée pour faire l'inverse, autrement dit de montrer | ||
+ | |||
+ | La commande grep peut être utilisée avec des **Expressions Régulières basiques**. Ceci est utile pour rechercher | ||
+ | |||
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
+ | |||
+ | ===La Commande egrep=== | ||
+ | |||
+ | La commande **egrep** est identique à la commande **grep -E**. Dans les deux cas, l'utilisation des expressions régulières est étendue aux ERe. | ||
+ | |||
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez | ||
+ | </ | ||
+ | |||
+ | ===La Commande fgrep=== | ||
+ | |||
+ | La commande **fgrep** est identique à la commande **grep -F**. Dans les deux cas et par défaut la recherche concerne une chaîne de caractères interprétés dans un sens littéral sans utilisation de caractères spéciaux ni d' | ||
+ | |||
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
+ | |||
+ | ===LAB #4 - Utiliser grep, egrep et fgrep=== | ||
+ | |||
+ | Creéz le fichier **/ | ||
< | < | ||
- | [trainee@centos8 ~]$ script | + | [root@centos8 ~]# cd /tmp |
- | Script started, file is typescript | + | [root@centos8 |
- | [trainee@centos8 | + | [root@centos8 |
- | / | + | fenestrOS |
- | [trainee@centos8 | + | fenestros |
- | aac abc bca codes errorlog | + | 555-5555 |
- | [trainee@centos8 ~]$ exit | + | f |
- | exit | + | .fenestros |
- | Script done, file is typescript | + | .fe |
+ | £ | ||
+ | </ | ||
- | [trainee@centos8 ~]$ cat typescript | + | Recherchez maintenant toute ligne du fichier **/tmp/greptest** contenant au moins une lettre : |
- | Script started on 2021-04-20 10: | + | |
- | [trainee@centos8 ~]$ pwd | + | |
- | /home/trainee | + | |
- | [trainee@centos8 ~]$ ls | + | |
- | aac abc bca codes errorlog | + | |
- | [trainee@centos8 ~]$ exit | + | |
- | exit | + | |
- | Script done on 2021-04-20 11: | + | < |
+ | [root@centos8 ~]# grep '[a-zA-Z]' / | ||
+ | fenestrOS | ||
+ | fenestros | ||
+ | f | ||
+ | .fenestros | ||
+ | .fe | ||
</ | </ | ||
- | Cette procédure peut être utilisée pour enregistrer | + | Recherchez maintenant toute ligne contenant au moins une lettre ou un chiffre : |
- | Pour illustrer l'écriture et l'exécution d'un script, créez le fichier | + | < |
+ | [root@centos8 ~]# grep '[a-zA-Z0-9]' | ||
+ | fenestrOS | ||
+ | fenestros | ||
+ | 555-5555 | ||
+ | f | ||
+ | .fenestros | ||
+ | .fe | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez la présence de la ligne 555-5555. | ||
+ | </ | ||
+ | |||
+ | Recherchez maintenant toute ligne contenant un numéro de téléphone au format NNN-NNNN | ||
< | < | ||
- | [trainee@centos8 ~]$ vi myscript | + | [root@centos8 ~]# grep '[0-9]\{3\}-[0-9]\{4\}' |
- | [trainee@centos8 ~]$ cat myscript | + | 555-5555 |
- | pwd | + | |
- | ls | + | |
</ | </ | ||
- | Sauvegardez votre fichier. Lancez ensuite votre script en passant le nom du fichier en argument à / | + | Recherchez maintenant toute ligne contenant exactement un caractère |
< | < | ||
- | [trainee@centos8 ~]$ /bin/bash myscript | + | [root@centos8 ~]# grep '^.$' |
- | / | + | f |
- | aac bca errorlog | + | £ |
- | abc codes file file2 training | + | |
</ | </ | ||
- | Lancez ensuite | + | <WRAP center round important 60%> |
+ | **Important** : Notez l' | ||
+ | </ | ||
+ | |||
+ | Recherchez maintenant toute ligne commençant par un point : | ||
< | < | ||
- | [trainee@centos8 ~]$ /bin/bash < myscript | + | [root@centos8 ~]# grep ' |
- | / | + | .fenestros |
- | aac bca errorlog | + | .fe |
- | abc codes file file2 training | + | |
</ | </ | ||
- | Pour lancer le script en l'appelant simplement par son nom, son chemin doit être inclus | + | <WRAP center round important 60%> |
+ | **Important** : Notez l'utilisation du caractère d' | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : La commande grep peut aussi être utilisée pour rechercher une chaîne | ||
+ | </ | ||
+ | |||
+ | Modifiez le fichier **/ | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | / | + | [root@centos8 tmp]# cat greptest |
+ | # Starting comment | ||
+ | fenestrOS | ||
+ | fenestros | ||
+ | # Another comment | ||
+ | 555-5555 | ||
+ | f | ||
+ | |||
+ | .fenestros | ||
+ | |||
+ | .fe | ||
+ | |||
+ | £ | ||
+ | # End comment | ||
</ | </ | ||
- | Dans le cas de RHEL/ | + | Utilisez maintenant la commande **grep** avec l'option **-E** pour supprimer les lignes de commentaires ainsi que les lignes vides : |
< | < | ||
- | [trainee@centos8 ~]$ ls | + | [root@centos8 ~]# grep -E -v '^(#|$)' / |
- | aac bca errorlog | + | fenestrOS |
- | abc codes file file2 training | + | fenestros |
+ | 555-5555 | ||
+ | f | ||
+ | .fenestros | ||
+ | .fe | ||
+ | £ | ||
</ | </ | ||
- | Créez | + | <WRAP center round important 60%> |
+ | **Important** : Notez l' | ||
+ | </ | ||
+ | |||
+ | Utilisez maintenant la commande **egrep** pour envoyer le contenu du fichier **/ | ||
< | < | ||
- | [trainee@centos8 ~]$ mkdir bin | + | [root@centos8 ~]# egrep -v '^(#|$)' |
+ | [root@centos8 ~]# cat / | ||
+ | fenestrOS | ||
+ | fenestros | ||
+ | 555-5555 | ||
+ | f | ||
+ | .fenestros | ||
+ | .fe | ||
+ | £ | ||
</ | </ | ||
- | Ensuite déplacez votre script dans ce répertoire et rendez-le exécutable pour votre utilisateur | + | <WRAP center round important 60%> |
+ | **Important** : Cette commande est particulièrement utile face à un fichier de configuration de plusieurs centaines de lignes dont certaines contiennent des directives activées d' | ||
+ | </ | ||
+ | |||
+ | Modifiez | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | [root@centos8 |
+ | # Starting comment | ||
+ | ^ This line will be used to demonstrate the use of fgrep | ||
+ | fenestrOS | ||
+ | fenestros | ||
+ | # Another comment | ||
+ | 555-5555 | ||
+ | f | ||
+ | |||
+ | .fenestros | ||
+ | |||
+ | .fe | ||
+ | |||
+ | £ | ||
+ | # End comment | ||
</ | </ | ||
- | Exécutez | + | Utilisez |
< | < | ||
- | [trainee@centos8 ~]$ cd /tmp | + | [root@centos8 ~]# fgrep ' |
- | [trainee@centos8 tmp]$ myscript | + | ^ This line will be used to demonstrate the use of fgrep |
- | /tmp | + | |
- | expand | + | |
- | expand1 | + | |
- | filepartaa | + | |
- | filepartab | + | |
- | filepartac | + | |
- | filepartad | + | |
- | filepartae | + | |
- | greptest | + | |
- | greptest1 | + | |
- | greptest.patch | + | |
- | newfile | + | |
- | sales.awk | + | |
- | sales.txt | + | |
- | scriptawk | + | |
- | sedtest | + | |
- | sedtest1 | + | |
- | systemd-private-d9ff2376a8a44f0392f860d80c839be4-chronyd.service-6im4Ii | + | |
</ | </ | ||
- | Placez-vous dans le répertoire contenant le script et saisissez les commandes suivantes | + | Comparez le résultat ci-dessus avec celui de la commande grep : |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 ~]# grep ' |
- | [trainee@centos8 bin]$ ./myscript | + | # Starting comment |
- | /home/ | + | ^ This line will be used to demonstrate the use of fgrep |
- | myscript | + | fenestrOS |
- | [trainee@centos8 bin]$ . myscript | + | fenestros |
- | / | + | # Another comment |
- | myscript | + | 555-5555 |
+ | f | ||
+ | |||
+ | .fenestros | ||
+ | |||
+ | .fe | ||
+ | |||
+ | £ | ||
+ | # End comment | ||
</ | </ | ||
+ | |||
+ | La ligne de commande en utilisant la commande grep devrait être : | ||
+ | |||
+ | < | ||
+ | [root@centos8 ~]# grep ' | ||
+ | ^ This line will be used to demonstrate the use of fgrep | ||
+ | </ | ||
+ | |||
+ | ====Présentation de la Commande sed==== | ||
+ | |||
+ | La commande **sed** ou //Stream EDitor// est un éditeur de texte non-intéractif. Les actions spécifiées par la commande sed sont exécutées par défaut sur chaque ligne du fichier. La commande sed ne modifie pas le fichier d' | ||
+ | |||
+ | Si plusieurs actions sont spécifiées dans la ligne de commande, chacune doit être précédée par l' | ||
+ | |||
+ | La syntaxe de la commande sed est la suivante : | ||
+ | |||
+ | < | ||
+ | sed [adresse] commande [arguments] | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | La syntaxe d'une adresse peut être : | ||
+ | |||
+ | ^adresse ^ Lignes concernées ^ | ||
+ | | a | La ligne numéro **a** | | ||
+ | | $ | La dernière ligne | | ||
+ | | /ERb/ | Les lignes qui correspondent à l'ERb | | ||
+ | | a,b | De la ligne numéro **a** jusqu' | ||
+ | | /ERb1/, /ERb2/ | Toutes les lignes entre la première occurrence correspondant à l'ERb1 jusqu' | ||
+ | |||
+ | Le commandes de sed sont : | ||
+ | |||
+ | ^commande ^ Description ^ | ||
+ | | d | Ne pas afficher la ou les ligne(s) | | ||
+ | | p | Afficher la ou les ligne(s) | | ||
+ | | s | Effectuer une substitution | | ||
+ | | w | Ecrire le ou les ligne(s) dans un fichier | | ||
+ | | = | Afficher le numéro de la ligne spécifiée | | ||
+ | | ! | Exécuter la commande ci-dessus sur toutes les lignes sauf celle spécifiées dans l' | ||
+ | |||
+ | ===Options de la commande=== | ||
<WRAP center round todo 60%> | <WRAP center round todo 60%> | ||
- | **A faire** : Notez bien la différence entre les sorties | + | **A faire** : Utilisez l' |
</ | </ | ||
- | ====2.2 - La commande read==== | + | ===LAB #5 - Utiliser la Commande sed=== |
- | La commande **read** lit son entrée standard et affecte les mots saisis dans la ou les variable(s) passée(s) en argument. La séparation entre le contenu des variables est l'espace. Par conséquent il est intéressant de noter les exemples suivants | + | La commande **d** de sed permet de ne pas afficher certaines lignes à l'écran. Dans l' |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | fenestros edu is great! | + | # are included, only the more common ones. |
- | [trainee@centos8 bin]$ echo $var1 | + | # |
- | fenestros | + | # The latest IANA port assignments can be gotten from |
- | [trainee@centos8 bin]$ echo $var2 | + | # |
- | edu | + | # The Well Known Ports are those from 0 through 1023. |
- | [trainee@centos8 bin]$ echo $var3 | + | # The Registered Ports are those from 1024 through 49151 |
- | is | + | # The Dynamic and/or Private Ports are those from 49152 through 65535 |
- | [trainee@centos8 | + | # |
- | great! | + | # Each line describes one service, and is of the form: |
+ | # | ||
+ | # service-name | ||
+ | |||
+ | tcpmux | ||
+ | tcpmux | ||
+ | rje | ||
+ | rje | ||
+ | echo 7/tcp | ||
+ | echo 7/udp | ||
+ | discard | ||
+ | discard | ||
+ | systat | ||
+ | systat | ||
+ | daytime | ||
+ | --Plus-- | ||
+ | </ | ||
+ | |||
+ | Dans l' | ||
+ | |||
+ | < | ||
+ | [root@centos8 | ||
+ | |||
+ | tcpmux | ||
+ | tcpmux | ||
+ | rje | ||
+ | rje | ||
+ | echo | ||
+ | echo 7/udp | ||
+ | discard | ||
+ | discard | ||
+ | systat | ||
+ | systat | ||
+ | daytime | ||
+ | daytime | ||
+ | qotd 17/ | ||
+ | qotd 17/ | ||
+ | msp | ||
+ | msp | ||
+ | chargen | ||
+ | chargen | ||
+ | ftp-data | ||
+ | ftp-data | ||
+ | ftp | ||
+ | ftp | ||
+ | --Plus-- | ||
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important**: | + | **Important** : Notez que l'ERb est entourée |
</ | </ | ||
+ | |||
+ | La commande sed vous permet d' | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | fenestros edu is great! | + | root: |
- | [trainee@centos8 | + | root: |
- | fenestros | + | bin: |
- | [trainee@centos8 | + | bin: |
- | edu is great! | + | daemon: |
+ | adm: | ||
+ | lp: | ||
+ | ... | ||
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : Notez que dans le deuxième cas, le reste de la ligne après le mot // | + | **Important** : Notez que sed affiche également tout le contenu du fichier. Ceci implique que les lignes 1 et 2 s' |
</ | </ | ||
- | ===Code de retour=== | + | Pour n' |
- | + | ||
- | La commande **read** renvoie un code de retour de **0** dans le cas où elle ne reçoit pas l'information | + | |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
+ | root: | ||
+ | bin: | ||
</ | </ | ||
- | < | + | |
+ | La commande **w** permet d' | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | 0 | + | [root@centos8 |
- | [trainee@centos8 | + | |
- | [trainee@centos8 bin]$ | + | tcpmux |
+ | tcpmux | ||
+ | rje | ||
+ | rje | ||
+ | echo 7/tcp | ||
+ | echo 7/udp | ||
+ | discard | ||
+ | discard | ||
+ | systat | ||
+ | systat | ||
+ | daytime | ||
+ | daytime | ||
+ | qotd 17/ | ||
+ | qotd 17/ | ||
+ | msp | ||
+ | msp | ||
+ | chargen | ||
+ | chargen | ||
+ | ftp-data | ||
+ | ftp-data | ||
+ | ftp | ||
+ | ftp | ||
+ | --Plus--(0%) | ||
</ | </ | ||
- | Le contenu de la variable | + | La commande |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
+ | [root@centos8 ~]# cat / | ||
+ | user1 user2 user3 | ||
</ | </ | ||
- | <key>C-d</key> | + | |
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que dans cet exemple, la commande s est suivi par un argument qui prend la forme /ce qui est à remplacer (caractère, | ||
+ | </ | ||
+ | |||
+ | ====Présentation de La Commande awk==== | ||
+ | |||
+ | Le processeur de texte **awk** est un **filtre**. Une **action** awk est fournie sur la ligne de commande entourée de ' ou de " : | ||
+ | |||
+ | < | ||
+ | awk [-F séparateur] ' | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Le couple critère {action} s' | ||
+ | </ | ||
+ | |||
+ | Dans le cas de l' | ||
+ | |||
+ | < | ||
+ | awk [-F séparateur] -f script [fichier1 ... fichiern] | ||
+ | </file> | ||
+ | |||
+ | ===Découpage en champs=== | ||
+ | |||
+ | awk sait identifier les champs de la ligne soit parce que ceux-ci sont séparés par un espace ou par une tabulation soit parce que la ligne de commande lui a identifié le séparateur grâce à l' | ||
+ | |||
+ | awk stocke les informations de la ligne dans des variables : | ||
+ | |||
+ | ^ Variable ^ Description ^ | ||
+ | | $0 | Contient toute la ligne | | ||
+ | | $1, $2 ... | Contient le premier champ de la ligne, contient le deuxième champ de la ligne ... | | ||
+ | |||
+ | Par exemple : | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | 1 | + | |
- | [trainee@centos8 bin]$ echo $var | + | |
- | [trainee@centos8 bin]$ | + | 05: |
+ | 05: | ||
+ | 05: | ||
+ | 05: | ||
+ | 12: | ||
</ | </ | ||
- | ===La variable IFS=== | + | Comme vous pouvez constater, awk a extrait du résultat de la commande **ls -l** les champs **nom de l' |
- | La variable IFS contient par défaut les caractères | + | Afin de le rendre un peu plus lisible, saisissez la commande suivante : |
+ | |||
+ | <code> | ||
+ | [root@centos8 tmp]# ls -l | awk ' | ||
+ | |||
+ | 05:23 root root | ||
+ | 05:21 root root | ||
+ | 05:28 root root | ||
+ | 05:29 root root | ||
+ | 12:05 root root | ||
+ | </code> | ||
+ | |||
+ | ===Critères=== | ||
+ | |||
+ | Les **critères** conditionnent l' | ||
+ | |||
+ | Plusieurs types de critères sont possibles. Les plus utilisées sont les suivantes : | ||
+ | |||
+ | == Une expression régulière valide pour la ligne== | ||
+ | |||
+ | * Format: | ||
+ | | ||
+ | * Exemple: | ||
+ | * /ERe/ {print $0} | ||
+ | |||
+ | ==Une expression régulière valide pour un champ== | ||
+ | |||
+ | * Format: | ||
+ | * $n ~/ | ||
+ | * $n!~/ | ||
+ | * Exemple: | ||
+ | * $1 ~/ERe/ {print $0} | ||
+ | * $1!~/ERe/ {print $0} | ||
+ | |||
+ | awk sélectionne des lignes en utilisant un opérateur de correspondance ou de non-correspondance : | ||
+ | |||
+ | ^ Opérateur ^ Condition ^ | ||
+ | | ~ | Correspondance | | ||
+ | | !~ | Non-correspondance | | ||
+ | |||
+ | ==Une comparaison== | ||
+ | |||
+ | * Format: | ||
+ | * $n opérateur critère de comparaison {action} | ||
+ | * Exemple: | ||
+ | * $1 > 20 {print $0} | ||
+ | |||
+ | Les opérateurs sont : | ||
+ | |||
+ | ^ Opérateur ^ Condition ^ | ||
+ | | < | Inférieur | | ||
+ | | %%<=%% | Inférieur ou égal | | ||
+ | | == | Egal | | ||
+ | | != | Différent | | ||
+ | | > | Supérieur | | ||
+ | | >= | Supérieur ou égal | | ||
+ | |||
+ | |||
+ | == Un opérateur logique== | ||
+ | |||
+ | * Format: | ||
+ | * test1 opérateur logique test2 {action} | ||
+ | * Exemple: | ||
+ | * $1 ~/ERe/ && $2 > 20 {print $0} | ||
+ | |||
+ | Les opérateurs sont : | ||
+ | |||
+ | ^ Opérateur logique ^ Condition ^ | ||
+ | | %%||%% | OU | | ||
+ | | && | ET | | ||
+ | | ! | NON | | ||
+ | |||
+ | ==Une variable interne== | ||
+ | |||
+ | * Format: | ||
+ | * expression1, | ||
+ | * Exemple: | ||
+ | * NR==7, NR==10 {print $0} | ||
+ | |||
+ | Les variables sont : | ||
+ | |||
+ | ^ Variable ^ Description ^ | ||
+ | | NR | Nombre total de lignes | | ||
+ | | NF | Nombre total de champs | | ||
+ | | FILENAME | Le nom du fichier en entrée | | ||
+ | | FS | Le séparateur de champs en entrée. Par défaut un **espace** ou une **tabulation** | | ||
+ | | RS | Le séparateur de lignes en entrée. Par défaut une **nouvelle ligne** | | ||
+ | | OFS | Le séparateur de champs en sortie. Par défaut un **espace** | | ||
+ | | ORS | Le séparateur de lignes en sortie. Par défaut une **nouvelle ligne** | | ||
+ | | OFMT | Le format numérique. Par défaut " | ||
+ | |||
+ | ===Scripts awk=== | ||
+ | |||
+ | Quand un programme awk comporte plusieurs **clauses** composées de **critères** et d' | ||
+ | |||
+ | * La section **BEGIN** | ||
+ | * Cette section est exécutée avant la lecture du script | ||
+ | * La section **principale** | ||
+ | * Cette section contient les clauses | ||
+ | * La section **END** | ||
+ | * Cette sectione est exécutée une fois à la fin du script | ||
+ | |||
+ | Par exemple | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | 0000000 | + | BEGIN { |
- | 0000004 | + | print "Liste des systèmes de fichiers montés"} |
+ | {print $0} | ||
+ | END { | ||
+ | | ||
+ | [^D] | ||
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : La commande **od** (//Octal Dump//) renvoie le contenu d'un fichier ou de l'entrée standard au format octal. Ceci est utile afin de visualiser | + | **Important** : Dans l'exemple ci-dessus, la ligne [^D] indique que vous devez appuyer simultanément sur les touches < |
</ | </ | ||
- | La valeur de cette variable définit donc le séparateur de mots lors de la saisie des contenus des variables avec la commande | + | Ensuite saisissez |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 bin]$ IFS=":" | + | Liste des systèmes de fichiers montés |
- | [trainee@centos8 bin]$ echo " | + | sysfs /sys sysfs rw, |
- | 0000000 | + | proc /proc proc rw, |
- | 0000002 | + | devtmpfs /dev devtmpfs rw, |
+ | securityfs / | ||
+ | tmpfs /dev/shm tmpfs rw, | ||
+ | devpts /dev/pts devpts rw, | ||
+ | tmpfs /run tmpfs rw, | ||
+ | tmpfs / | ||
+ | cgroup / | ||
+ | pstore / | ||
+ | bpf /sys/fs/bpf bpf rw, | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | cgroup / | ||
+ | none / | ||
+ | configfs / | ||
+ | /dev/sda3 / xfs rw, | ||
+ | selinuxfs / | ||
+ | systemd-1 / | ||
+ | debugfs / | ||
+ | hugetlbfs / | ||
+ | mqueue /dev/mqueue mqueue rw, | ||
+ | /dev/sda1 /boot ext4 rw, | ||
+ | sunrpc / | ||
+ | tmpfs / | ||
+ | binfmt_misc / | ||
+ | tracefs / | ||
+ | ===================================== | ||
</ | </ | ||
- | De cette façon | + | <WRAP center round important 60%> |
+ | **Important** : Notez l'utilisation de l' | ||
+ | </ | ||
+ | |||
+ | ===La Fonction printf=== | ||
+ | |||
+ | La fonction intégrée **printf** permet de formater des affichages. Elle a la syntaxe suivante : | ||
+ | |||
+ | < | ||
+ | printf (" | ||
+ | </ | ||
+ | |||
+ | **chaine** contient autant de formats qu'il y a d' | ||
+ | |||
+ | Les formats de printf sont, par exemple : | ||
+ | |||
+ | ^ Format ^ Description ^ | ||
+ | | %30s | Affichage d'une chaîne (s=string) sur 30 positions avec cadrage à droite | | ||
+ | | %-30s | Affichage d'une chaîne (s=string) sur 30 positions avec cadrage à gauche | | ||
+ | | %4d | Affichage d'un entier sur 4 positions avec cadrage à droite | | ||
+ | | %-4d | Affichage d'un entier sur 4 positions avec cadrage à gauche | | ||
+ | |||
+ | ===Structures de Contrôle=== | ||
+ | |||
+ | awk peut utiliser des structures de contrôle. | ||
+ | |||
+ | ==if== | ||
+ | |||
+ | La syntaxe de la commande if est la suivante : | ||
+ | |||
+ | < | ||
+ | if condition { | ||
+ | |||
+ | commande | ||
+ | commande | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | else { | ||
+ | |||
+ | commande | ||
+ | commande | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ou dans le cas d'une seule commande : | ||
+ | |||
+ | < | ||
+ | if condition | ||
+ | |||
+ | commande | ||
+ | |||
+ | else | ||
+ | |||
+ | commande | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==for== | ||
+ | |||
+ | La syntaxe de la structure de contrôle **for** est la suivante : | ||
+ | |||
+ | < | ||
+ | for variable in liste_variables { | ||
+ | |||
+ | commande | ||
+ | commande | ||
+ | ... | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ou dans le cas d'une seule commande : | ||
+ | |||
+ | < | ||
+ | for variable in liste_variables | ||
+ | |||
+ | commande | ||
+ | |||
+ | </ | ||
+ | |||
+ | ou dans le cas d'un tableau : | ||
+ | |||
+ | < | ||
+ | for clef dans tableau { | ||
+ | |||
+ | print clef , tableau[clef] | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==while== | ||
+ | |||
+ | La syntaxe de la structure de contrôle **while** est la suivante : | ||
+ | |||
+ | < | ||
+ | while condition { | ||
+ | |||
+ | | ||
+ | | ||
+ | ... | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==do-while== | ||
+ | |||
+ | La syntaxe de la structure de contrôle **do-while** est la suivante : | ||
+ | |||
+ | < | ||
+ | do { | ||
+ | |||
+ | | ||
+ | | ||
+ | ... | ||
+ | |||
+ | } while condition | ||
+ | </ | ||
+ | |||
+ | ===Options de la commande=== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
+ | |||
+ | ===LAB #6 - Utiliser la Commande awk=== | ||
+ | |||
+ | Pour illustrer l' | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | fenestros: | + | [root@centos8 |
- | [trainee@centos8 | + | # Annual sales by French department |
- | fenestros | + | # 83 |
- | [trainee@centos8 bin]$ echo $var2 | + | Desktops§100 |
- | edu is | + | Portables§50 |
- | [trainee@centos8 bin]$ echo $var3 | + | Servers§21 |
- | great! | + | Ipads§4 |
+ | |||
+ | # 06 | ||
+ | Desktops§99 | ||
+ | Portables§60 | ||
+ | Servers§8 | ||
+ | Ipads§16 | ||
+ | |||
+ | # 13 | ||
+ | Desktops§130 | ||
+ | Portables§65 | ||
+ | Servers§12 | ||
+ | Ipads§56 | ||
</ | </ | ||
- | Restaurez l' | + | Ce fichier contient des statistiques |
+ | |||
+ | Créez maintenant le script awk **sales.awk** : | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | [root@centos8 |
- | 0000000 | + | # BEGIN |
- | 0000004 | + | BEGIN { |
+ | FS="§" | ||
+ | } | ||
+ | # TABLE | ||
+ | $1 !~ /^#/ && $1 !~ /^$/ { | ||
+ | sales[$1]+=$2 | ||
+ | } | ||
+ | # END | ||
+ | END { | ||
+ | for (pc in sales) | ||
+ | printf(" | ||
+ | } | ||
</ | </ | ||
- | ====2.3 - La commande test==== | + | Ce script comporte 13 lignes et a pour but de calculer le nombre total de PC vendus dans les trois départements cités dans le fichier **sales.txt** : |
- | La commande **test** peut être utilisée avec deux syntaxes | + | < |
+ | 1 # BEGIN | ||
+ | | ||
+ | | ||
+ | 4 } | ||
+ | 5 # TABLE | ||
+ | 6 $1 !~ /^#/ && $1 !~ /^$/ { | ||
+ | | ||
+ | 8 } | ||
+ | 9 # END | ||
+ | 10 END { | ||
+ | 11 for (pc in sales) | ||
+ | 12 printf(" | ||
+ | 13 } | ||
+ | </ | ||
- | **test** // | + | Dans ce script vous noterez : |
- | ou | + | * La ligne **3**, |
+ | * Cette ligne se trouve dans la section **BEGIN**. Elle spécifie le séparateur de champs. | ||
+ | * La ligne **6**, | ||
+ | * Cette ligne évite le traitement de toute ligne commençant par le caractère **#** ainsi que toute ligne vide. | ||
+ | * La ligne **7**, | ||
+ | * Ce tableau a pour clef la valeur de **$1**, c' | ||
+ | * La ligne **11**, | ||
+ | * Cette ligne démarre une boucle **for**.7 | ||
+ | * La ligne **12**, | ||
+ | * Cette ligne utilise **printf** afin d' | ||
- | **[**< | + | Appliquez maintenant votre script awk au fichier |
- | ===Tests de Fichiers=== | + | < |
+ | [root@centos8 tmp]# awk -f / | ||
+ | PC Type : Portables Sales (06+13+83) : 175 | ||
+ | PC Type : Ipads Sales (06+13+83) : 76 | ||
+ | PC Type : Desktops Sales (06+13+83) : 329 | ||
+ | PC Type : Servers Sales (06+13+83) : 41 | ||
+ | </ | ||
- | ^ Test ^ Description ^ | + | ====LAB #7 -Autres Commandes Utiles==== |
- | | -f fichier | Retourne vrai si fichier est d'un type standard | | + | |
- | | -d fichier | Retourne vrai si fichier est d'un type répertoire | | + | |
- | | -r fichier | Retourne vrai si l' | + | |
- | | -w fichier | Retourne vrai si l' | + | |
- | | -x fichier | Retourne vrai si l' | + | |
- | | -e fichier | Retourne vrai si fichier existe | | + | |
- | | -s fichier | Retourne vrai si fichier n'est pas vide | | + | |
- | | fichier1 -nt fichier2 | Retourne vrai si fichier1 est plus récent que fichier2 | | + | |
- | | fichier1 -ot fichier2 | Retourne vrai si fichier1 est plus ancien que fichier2 | | + | |
- | | fichier1 -ef fichier2 | Retourne vrai si fichier1 est identique à fichier2 | | + | |
+ | ===7.1 - La Commande expand=== | ||
- | Testez si le fichier **a100** est un fichier | + | La commande **expand** convertit des tabulations dans un fichier en espaces et envoie |
+ | |||
+ | Créez le fichier | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | un deux trois quatre cinq |
- | 0 | + | un deux trois quatre cinq |
- | [trainee@centos8 training]$ [ -f a100 ] | + | un deux trois quatre cinq |
- | [trainee@centos8 training]$ echo $? | + | un deux trois quatre cinq |
- | 0 | + | un deux trois quatre cinq |
+ | un deux trois quatre cinq | ||
+ | un deux trois quatre cinq | ||
+ | un deux trois quatre cinq | ||
+ | un deux trois quatre cinq | ||
+ | un deux trois quatre cinq | ||
+ | </ | ||
+ | |||
+ | Utilisez les option **-vet** de la commande cat pour visualiser les caractères invisibles : | ||
+ | |||
+ | < | ||
+ | [root@centos8 | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
</ | </ | ||
- | Testez si le fichier | + | <WRAP center round important 60%> |
+ | **Important** : Comme vous pouvez constater, les tabulations sont représentées par ^I et les fins de lignes par $. | ||
+ | </ | ||
+ | |||
+ | Utilisez maintenant la commande **expand** pour convertir les tabulations en espaces en envoyant le résultat dans le fichier | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ echo $? | + | |
- | 1 | + | |
</ | </ | ||
- | Testez si / | + | Visualisez le fichier avec la commande cat et les options **-vet** |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ echo $? | + | un deux trois |
- | 0 | + | un deux trois |
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
</ | </ | ||
- | ===Tests de chaînes | + | <WRAP center round important 60%> |
+ | **Important** : Comme vous pouvez constater, les tabulations ont été converties en espaces. | ||
+ | </ | ||
+ | |||
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
+ | |||
+ | ===7.2 - La Commande unexpand=== | ||
- | ^ Test ^ Description ^ | + | La commande **unexpand** convertit des espaces dans un fichier en tabulations et envoie le résultat à la sortie standard. Sans fichier en argument ou avec le caractère **-**, la commande prend son entrée |
- | | -n chaîne | Retourne vrai si chaîne n'est pas de longueur 0 | | + | |
- | | -z chaîne | Retourne vrai si chaîne est de longueur 0 | | + | |
- | | string1 = string2 | Retourne vrai si string1 est égale à string2 | | + | |
- | | string1 != string2 | Retourne vrai si string1 est différente | + | |
- | | string1 | Retourne vrai si string1 n'est pas vide | | + | |
- | Testez si les deux chaînes sont égales | + | Utilisez la commande **unexpand** sur le fichier **expand1** et envoyez le résultat dans le fichier **expand2** |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | un deux trois |
- | [trainee@centos8 | + | un deux trois |
- | [trainee@centos8 training]$ echo $? | + | un deux trois |
- | 1 | + | un deux trois |
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | un deux trois | ||
+ | |||
+ | [root@centos8 | ||
+ | |||
+ | [root@centos8 | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
+ | un^Ideux^Itrois^Iquatre^Icinq$ | ||
</ | </ | ||
- | Testez si la string1 n'a pas de longueur 0 : | + | <WRAP center round important 60%> |
+ | **Important** : Notez que les espaces ont été remplacés par des tabulations. | ||
+ | </ | ||
+ | |||
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l'option **--help** | ||
+ | </ | ||
+ | |||
+ | ===7.3 - La Commande cut=== | ||
+ | |||
+ | Chaque ligne est divisée en colonnes. Dans une ligne le premier caractère est dans la colonne numéro **un**, le deuxième dans la colonne deux et ainsi de suite. Dans une ligne il peut y avoir des champs séparés par des tabulations. | ||
+ | |||
+ | La commande **cut** permet de sélectionner des colonnes et des champs dans un fichier. La commande permet aussi d' | ||
+ | |||
+ | Par exemple, pour sélectionner les 7 premières colonnes du fichier **/ | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ echo $? | + | root:x: |
- | 0 | + | bin:x:1 |
+ | daemon: | ||
+ | adm:x:3 | ||
+ | lp:x:4: | ||
+ | sync:x: | ||
+ | shutdow | ||
+ | halt:x: | ||
+ | mail:x: | ||
+ | operato | ||
+ | games:x | ||
+ | ftp:x:1 | ||
+ | nobody: | ||
+ | dbus:x: | ||
+ | systemd | ||
+ | systemd | ||
+ | tss:x:5 | ||
+ | polkitd | ||
+ | unbound | ||
+ | libstor | ||
+ | cockpit | ||
+ | sssd:x: | ||
+ | setroub | ||
+ | sshd:x: | ||
+ | chrony: | ||
+ | tcpdump | ||
+ | trainee | ||
+ | cockpit | ||
+ | rngd:x: | ||
+ | gluster | ||
+ | qemu:x: | ||
+ | rpc:x:3 | ||
+ | rpcuser | ||
+ | saslaut | ||
+ | radvd:x | ||
+ | dnsmasq | ||
</ | </ | ||
- | Testez si la string1 a une longueur de 0 : | + | Pour sélectionner les colonnes 1 à 5, les colonnes 10 à 15 et les colonnes 30 et après, il convient d’utiliser |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ echo $? | + | root: |
- | 1 | + | bin: |
+ | daemo2: | ||
+ | adm: | ||
+ | lp: | ||
+ | sync: | ||
+ | shutdx: | ||
+ | halt: | ||
+ | mail: | ||
+ | operax: | ||
+ | games2: | ||
+ | ftp: | ||
+ | nobod65534: | ||
+ | dbus:: | ||
+ | systeoredumstemd Core Dumper:/:/ | ||
+ | systeesolvetemd Resolver:/:/ | ||
+ | tss: | ||
+ | polki: | ||
+ | unbou:997:9 resolver:/ | ||
+ | libstemgmt: | ||
+ | cockps:x:99 cockpit-ws:/ | ||
+ | sssd: | ||
+ | setroshoot: | ||
+ | sshd:: | ||
+ | chron992: | ||
+ | tcpdu: | ||
+ | train: | ||
+ | cockpsinstaUser for cockpit-ws instances:/ | ||
+ | rngd: | ||
+ | glust: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcus: | ||
+ | saslax: | ||
+ | radvd5: | ||
+ | dnsma: | ||
</ | </ | ||
- | ===Tests sur des nombres=== | + | Pour sélectionner les champs 2, 4 et 6 du fichier, il convient d' |
- | ^ Test ^ Description ^ | + | < |
- | | value1 | + | [root@centos8 tmp]# cut -d: -f2,4,6 /etc/passwd |
- | | value1 | + | x:0:/root |
- | | value1 -lt value2 | Retourne vrai si value1 est inférieure à value2 | | + | x:1:/bin |
- | | value1 -le value2 | Retourne vrai si value1 est inférieur ou égale à value2 | | + | x:2:/sbin |
- | | value1 | + | x: |
- | | value1 | + | x: |
+ | x:0:/sbin | ||
+ | x:0:/sbin | ||
+ | x:0:/sbin | ||
+ | x: | ||
+ | x:0:/root | ||
+ | x: | ||
+ | x: | ||
+ | x:65534:/ | ||
+ | x:81:/ | ||
+ | x:997:/ | ||
+ | x:193:/ | ||
+ | x: | ||
+ | x:996:/ | ||
+ | x: | ||
+ | x: | ||
+ | x: | ||
+ | x:990:/ | ||
+ | x: | ||
+ | x: | ||
+ | x: | ||
+ | x:72:/ | ||
+ | x: | ||
+ | x: | ||
+ | x: | ||
+ | x: | ||
+ | x:107:/ | ||
+ | x: | ||
+ | x: | ||
+ | x: | ||
+ | x:75:/ | ||
+ | x: | ||
+ | </ | ||
+ | |||
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
+ | |||
+ | ===7.4 | ||
- | Comparez | + | La commande suivante permet d' |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | 35 | + | |
- | [trainee@centos8 training]$ read value2 | + | |
- | 23 | + | |
- | [trainee@centos8 training]$ [ $value1 | + | |
- | [trainee@centos8 training]$ echo $? | + | |
- | 1 | + | |
- | [trainee@centos8 training]$ [ $value2 | + | |
- | [trainee@centos8 training]$ echo $? | + | |
0 | 0 | ||
- | [trainee@centos8 training]$ [ $value2 -eq $value1 ] | ||
- | [trainee@centos8 training]$ echo $? | ||
1 | 1 | ||
+ | 2 | ||
+ | 4 | ||
+ | 7 | ||
+ | 12 | ||
+ | 29 | ||
+ | 32 | ||
+ | 50 | ||
+ | 59 | ||
+ | 72 | ||
+ | 74 | ||
+ | 75 | ||
+ | 76 | ||
+ | 81 | ||
+ | 100 | ||
+ | 107 | ||
+ | 193 | ||
+ | 983 | ||
+ | 985 | ||
+ | 986 | ||
+ | 987 | ||
+ | 988 | ||
+ | 989 | ||
+ | 990 | ||
+ | 991 | ||
+ | 993 | ||
+ | 994 | ||
+ | 996 | ||
+ | 997 | ||
+ | 1000 | ||
+ | 65534 | ||
</ | </ | ||
- | ===Les opérateurs=== | + | <WRAP center round important 60%> |
+ | **Important** : Notez l' | ||
+ | </ | ||
- | ^ Test ^ Description ^ | + | ==Options |
- | | !expression | Retourne vrai si expression est fausse | | + | |
- | | expression1 -a expression2 | Représente un et logique entre expression1 et expression2 | | + | |
- | | expression1 -o expression2 | Représente un ou logique entre expression1 et expression2 | | + | |
- | | \(expression\) | Les parenthèses permettent | + | |
- | Testez si $file n'est pas un répertoire : | + | <WRAP center round todo 60%> |
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
+ | |||
+ | ===7.5 - La Commande tr=== | ||
+ | |||
+ | La commande **tr** permet de substituer des caractères pour d' | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ [ ! -d $file ] | + | ROOT: |
- | [trainee@centos8 training]$ echo $? | + | BIN: |
+ | DAEMON: | ||
+ | ADM: | ||
+ | LP: | ||
+ | SYNC:X:5:0: | ||
+ | SHUTDOWN: | ||
+ | HALT: | ||
+ | MAIL: | ||
+ | OPERATOR: | ||
+ | GAMES: | ||
+ | FTP: | ||
+ | NOBODY: | ||
+ | DBUS: | ||
+ | SYSTEMD-COREDUMP: | ||
+ | SYSTEMD-RESOLVE: | ||
+ | TSS: | ||
+ | POLKITD: | ||
+ | UNBOUND: | ||
+ | LIBSTORAGEMGMT: | ||
+ | COCKPIT-WS: | ||
+ | SSSD: | ||
+ | SETROUBLESHOOT: | ||
+ | SSHD: | ||
+ | CHRONY: | ||
+ | TCPDUMP: | ||
+ | TRAINEE: | ||
+ | COCKPIT-WSINSTANCE: | ||
+ | RNGD: | ||
+ | GLUSTER: | ||
+ | QEMU: | ||
+ | RPC: | ||
+ | RPCUSER: | ||
+ | SASLAUTH: | ||
+ | RADVD: | ||
+ | DNSMASQ: | ||
</ | </ | ||
- | Testez si $directory est un répertoire | + | ==Options de la commande== |
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez | ||
+ | </ | ||
+ | |||
+ | ===7.6 - La Commande paste=== | ||
+ | |||
+ | La commande **paste** concatène les lignes | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ [ -d $directory | + | root: |
- | [trainee@centos8 training]$ echo $? | + | bin: |
+ | daemon: | ||
+ | adm: | ||
+ | lp: | ||
+ | sync: | ||
+ | shutdown: | ||
+ | halt: | ||
+ | mail: | ||
+ | operator: | ||
+ | games: | ||
+ | ftp: | ||
+ | nobody: | ||
+ | dbus: | ||
+ | systemd-coredump: | ||
+ | systemd-resolve:x: | ||
+ | tss: | ||
+ | polkitd: | ||
+ | unbound: | ||
+ | libstoragemgmt: | ||
+ | cockpit-ws: | ||
+ | sssd: | ||
+ | setroubleshoot: | ||
+ | sshd: | ||
+ | chrony: | ||
+ | tcpdump: | ||
+ | trainee: | ||
+ | cockpit-wsinstance: | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
</ | </ | ||
- | Testez si l'utilisateur peut écrire dans le fichier a100 **et** /usr est un répertoire | + | |
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez | ||
+ | </WRAP> | ||
+ | |||
+ | ===7.7 - La Commande split=== | ||
+ | |||
+ | La commande **split** | ||
+ | |||
+ | Créez d' | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | 250+0 records in |
- | 0 | + | 250+0 records out |
+ | 262144000 bytes (262 MB, 250 MiB) copied, 0.143522 s, 1.8 GB/s | ||
+ | </code> | ||
+ | |||
+ | Utilisez maintenant la commande **split** pour diviser ce fichier en morceaux de 50 Mo : | ||
+ | |||
+ | < | ||
+ | [root@centos8 | ||
+ | [root@centos8 | ||
+ | -rw-r--r--. 1 root root 52428800 Apr 20 07:14 filepartaa | ||
+ | -rw-r--r--. 1 root root 52428800 Apr 20 07:14 filepartab | ||
+ | -rw-r--r--. 1 root root 52428800 Apr 20 07:14 filepartac | ||
+ | -rw-r--r--. 1 root root 52428800 Apr 20 07:14 filepartad | ||
+ | -rw-r--r--. 1 root root 52428800 Apr 20 07:14 filepartae | ||
</ | </ | ||
- | ===Tests d'environnement utilisateur=== | + | <WRAP center round important 60%> |
+ | **Important** : Notez que cinq morceaux ont été créés dans le répertoire courant. Si aucune taille n'est spécifiée, | ||
+ | </ | ||
- | ^ Test ^ Description ^ | + | Reconstruisez simplement le fichier avec la commande cat : |
- | | -o option | Retourne vrai si l' | + | |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | [root@centos8 tmp]# ls -l | grep newf |
- | 1 | + | -rw-r--r--. 1 root root 262144000 Apr 20 07:15 newfile |
+ | [root@centos8 | ||
+ | -rw-r--r--. | ||
</ | </ | ||
- | ====2.4 - La commande | + | ==Options de la commande== |
- | La commande **%%[[%%< | + | <WRAP center round todo 60%> |
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
- | ^ Test ^ Description ^ | + | ===7.8 - La Commande diff=== |
- | | !expression | Retourne vrai si expression est fausse | | + | |
- | | expression1 %%&& | + | |
- | | expression1 %%||%% expression2 | Représente un **ou** logique entre expression1 et expression2 | | + | |
- | | %%(expression)%% | Les parenthèses permettent de regrouper des expressions | + | |
- | D' | + | La commande **diff** indique les modifications à apporter à deux fichiers pour que ceux-ci soient identique. |
- | ^ Test ^ Description ^ | + | Pour commencer, copiez |
- | | string = modele | Retourne vrai si chaîne correspond au modèle | | + | |
- | | string != modele | Retourne vrai si chaîne ne correspond pas au modèle | | + | |
- | | string1 < string2 | Retourne vrai si string1 est lexicographiquement avant string2 | | + | |
- | | string1 > string2 | Retourne vrai si string1 est lexicographiquement après string2 | + | |
- | + | ||
- | Testez si l' | + | |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ echo $? | + | |
- | 0 | + | |
</ | </ | ||
- | ====2.5 - Opérateurs | + | Modifiez ensuite le fichier la ligne **trainee** |
- | ^ Opérateur ^ Description ^ | + | < |
- | | Commande1 %%&& | + | ... |
- | | Commande1 %%||%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code faux | | + | trainee10: |
+ | ... | ||
+ | </ | ||
+ | |||
+ | Supprimez | ||
+ | |||
+ | < | ||
+ | ... | ||
+ | Linux est super! | ||
+ | </ | ||
+ | |||
+ | Comparez maintenant les deux fichiers : | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | The root directory exists | + | 26,27c26 |
- | [trainee@centos8 training]$ [[ -d /root ]] || echo "The root directory exists" | + | < tcpdump: |
- | [trainee@centos8 training]$ | + | < trainee: |
+ | --- | ||
+ | > trainee10: | ||
+ | 36a36 | ||
+ | > Linux est super! | ||
</ | </ | ||
- | ====2.6 - L' | + | Dans cette sortie on constate le caractère **<** et le caractère **>**. Le premier indique le premier fichier qui a suivi la commande **diff** tandis que le deuxième indique le deuxième fichier. |
- | ===La commande expr=== | + | Le message **26, |
- | La commande | + | Le message |
- | expr < | + | ==Options de la commande== |
- | ou | + | <WRAP center round todo 60%> |
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
- | expr < | + | ===7.9 - La Commande cmp=== |
- | ou | + | La commande **cmp** compare les fichiers caractère par caractère. Par défaut la commande s' |
- | expr <key>espace</key> chaîne < | + | <code> |
+ | [root@centos8 tmp]# cmp /root/passwd | ||
+ | /root/passwd | ||
+ | </code> | ||
- | ou | + | L' |
- | expr <key>tab</key> chaîne < | + | <code> |
+ | [root@centos8 tmp]# cmp -l /root/passwd | ||
+ | cmp: EOF on /root/passwd after byte 1931 | ||
+ | 1300 162 143 | ||
+ | 1301 141 160 | ||
+ | 1302 151 144 | ||
+ | 1303 156 165 | ||
+ | 1304 145 155 | ||
+ | 1305 145 160 | ||
+ | 1306 61 72 | ||
+ | 1307 60 170 | ||
+ | 1309 170 67 | ||
+ | 1310 72 62 | ||
+ | 1311 61 72 | ||
+ | 1312 60 67 | ||
+ | 1313 60 62 | ||
+ | 1314 60 72 | ||
+ | 1316 61 57 | ||
+ | 1317 60 72 | ||
+ | 1318 60 57 | ||
+ | 1319 60 163 | ||
+ | 1320 72 142 | ||
+ | 1321 164 151 | ||
+ | 1322 162 156 | ||
+ | 1323 141 57 | ||
+ | 1324 151 156 | ||
+ | --More-- | ||
+ | </code> | ||
- | ==Opérateurs Arithmétiques== | + | La première colonne représente le numéro de caractère, la deuxième la valeur octale ASCII du caractère dans le fichier / |
- | ^ Opérateur ^ Description ^ | + | ==Options de la commande== |
- | | + | Addition | | + | |
- | | - | Soustraction | | + | |
- | | \* | Multiplication | | + | |
- | | / | Division | | + | |
- | | % | Modulo | | + | |
- | | \( \) | Parenthèses | | + | |
- | ==Opérateurs | + | <WRAP center round todo 60%> |
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
- | ^ Opérateur ^ Description ^ | + | ===7.10 - La commande patch=== |
- | | \< | Inférieur | | + | |
- | | %%\<=%% | Inférieur ou égal | | + | |
- | | \> | Supérieur | | + | |
- | | \>= | Supérieur ou égal | | + | |
- | | = | égal | | + | |
- | | != | inégal | | + | |
- | ==Opérateurs Logiques== | + | La commande **patch** est utilisée pour appliquer des modifications à un fichier à partir d'un fichier patch qui contient les différences entre le contenu de l' |
- | ^ Opérateur ^ Description ^ | + | La commande patch n'est pas installée par défaut sous RHEL/CentOS 8 : |
- | | %%\|%% | ou logique | | + | |
- | | \& | et logique | | + | |
- | Ajoutez 2 à la valeur de $x : | + | < |
+ | [root@centos8 ~]# dnf install patch -y | ||
+ | </ | ||
+ | |||
+ | Rappelez-vous maintenant des modifications apportées aux fichiers / | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 | + | # Starting comment |
- | 4 | + | ^ This line will be used to demonstrate the use of fgrep |
+ | fenestrOS | ||
+ | fenestros | ||
+ | # Another comment | ||
+ | 555-5555 | ||
+ | f | ||
+ | |||
+ | .fenestros | ||
+ | |||
+ | .fe | ||
+ | |||
+ | £ | ||
+ | # End comment | ||
+ | [root@centos8 | ||
+ | fenestrOS | ||
+ | fenestros | ||
+ | 555-5555 | ||
+ | f | ||
+ | .fenestros | ||
+ | .fe | ||
+ | £ | ||
</ | </ | ||
- | Si les espaces sont retirés, le résultat est tout autre : | + | Afin de créer un fichier de patch, il convient d' |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | 2+2 | + | |
</ | </ | ||
- | Les opérateurs doivent être protégés | + | L' |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | expr: syntax error | + | --- greptest 2021-04-20 05:23: |
- | [trainee@centos8 training]$ expr $x \* 2 | + | +++ greptest1 2021-04-20 05: |
- | 4 | + | @@ -1,14 +1,7 @@ |
+ | -# Starting comment | ||
+ | -^ This line will be used to demonstrate the use of fgrep | ||
+ | | ||
+ | | ||
+ | -# Another comment | ||
+ | | ||
+ | f | ||
+ | - | ||
+ | | ||
+ | - | ||
+ | .fe | ||
+ | - | ||
+ | £ | ||
+ | -# End comment | ||
</ | </ | ||
- | Mettez le résultat d'un calcul dans une variable | + | Procédez maintenant à l'application du fichier patch : |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ echo $resultat | + | patching file greptest |
- | 12 | + | |
</ | </ | ||
- | ===La commande let === | + | Contrôlez maintenant le contenu du fichier **greptest** : |
- | La commande let est l' | + | < |
+ | [root@centos8 tmp]# cat greptest | ||
+ | fenestrOS | ||
+ | fenestros | ||
+ | 555-5555 | ||
+ | f | ||
+ | .fenestros | ||
+ | .fe | ||
+ | £ | ||
+ | </ | ||
- | * plus grand nombre d' | + | ==Options |
- | * pas besoin d' | + | |
- | * pas besoin de préfixer les variables d'un $ | + | |
- | * les caractères spéciaux du shell n'ont pas besoin d' | + | |
- | * les affectations se font dans la commande | + | |
- | * exécution plus rapide | + | |
- | ==Opérateurs Arithmétiques== | + | <WRAP center round todo 60%> |
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
- | ^ Opérateur ^ Description ^ | + | ===7.11 |
- | | + | Addition | | + | |
- | | - | Soustraction | | + | |
- | | * | Multiplication | | + | |
- | | / | Division | | + | |
- | | % | Modulo | | + | |
- | | %%^%% | Puissance | | + | |
- | ==Opérateurs | + | La commande **strings** est utilisée pour trouver toutes les chaînes |
- | ^ Opérateur ^ Description ^ | + | Sous Linux et Unix, le format d'un fichier objet est le format **ELF**, (// |
- | | < | Inférieur | | + | |
- | | %%<=%% | Inférieur ou égal | | + | |
- | | > | Supérieur | | + | |
- | | >= | Supérieur ou égal | | + | |
- | | == | égal | | + | |
- | | != | inégal | | + | |
- | ==Opérateurs Logiques== | + | * les exécutables, |
+ | * les bibliothèques partagés, | ||
+ | * les core dumps. | ||
- | ^ Opérateur ^ Description ^ | + | Sans option, la commande **strings** trouve toutes les chaînes d'une longueur de 4 caractères |
- | | && | et logique | | + | |
- | | %%||%% | ou logique | | + | |
- | | ! | négation logique | | + | |
- | ==Opérateurs travaillant sur les bits== | + | < |
+ | [root@centos8 tmp]# strings / | ||
+ | / | ||
+ | libuser.so.1 | ||
+ | g_value_get_int64 | ||
+ | is_selinux_enabled | ||
+ | _ITM_deregisterTMCloneTable | ||
+ | g_free | ||
+ | g_value_array_get_nth | ||
+ | audit_open | ||
+ | __gmon_start__ | ||
+ | g_value_get_string | ||
+ | g_type_check_value_holds | ||
+ | g_value_get_long | ||
+ | freecon | ||
+ | audit_log_acct_message | ||
+ | _ITM_registerTMCloneTable | ||
+ | lu_ent_set_string | ||
+ | lu_ent_get_first_value_strdup | ||
+ | lu_error_free | ||
+ | lu_user_lock | ||
+ | lu_strerror | ||
+ | lu_ent_free | ||
+ | lu_ent_new | ||
+ | lu_user_modify | ||
+ | --More-- | ||
+ | </ | ||
- | ^ Opérateur ^ Description ^ | + | L' |
- | | ~ | négation binaire | | + | |
- | | %%>> | + | |
- | | %%<< | + | |
- | | & | et binaire | | + | |
- | | %%|%% | ou binaire | | + | |
- | | %%^%% | ou exclusif binaire | | + | |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ ((x=$x+10)) | + | 624 / |
- | [trainee@centos8 training]$ echo $x | + | 2809 libuser.so.1 |
- | 12 | + | 2822 g_value_get_int64 |
- | [trainee@centos8 training]$ ((x=$x+20)) | + | 2840 is_selinux_enabled |
- | [trainee@centos8 training]$ echo $x | + | 2859 _ITM_deregisterTMCloneTable |
- | 32 | + | 2887 g_free |
+ | 2894 g_value_array_get_nth | ||
+ | 2916 audit_open | ||
+ | 2927 __gmon_start__ | ||
+ | 2942 g_value_get_string | ||
+ | 2961 g_type_check_value_holds | ||
+ | 2986 g_value_get_long | ||
+ | 3003 freecon | ||
+ | 3011 audit_log_acct_message | ||
+ | 3034 _ITM_registerTMCloneTable | ||
+ | 3060 lu_ent_set_string | ||
+ | 3078 lu_ent_get_first_value_strdup | ||
+ | 3108 lu_error_free | ||
+ | 3122 lu_user_lock | ||
+ | 3135 lu_strerror | ||
+ | 3147 lu_ent_free | ||
+ | 3159 lu_ent_new | ||
+ | 3170 lu_user_modify | ||
+ | --More-- | ||
</ | </ | ||
- | ====2.7 | + | L' |
- | ===If=== | + | ^ Argument ^ Système de Numérotation ^ |
+ | | d | Décimal | | ||
+ | | o | Octal | | ||
+ | | x | Héxadécimal | | ||
- | La syntaxe | + | L' |
- | <file> | + | <code> |
- | if condition | + | [root@centos8 tmp]# strings -t d -n 15 / |
- | then | + | |
- | | + | 2822 g_value_get_int64 |
- | else | + | 2840 is_selinux_enabled |
- | | + | 2859 _ITM_deregisterTMCloneTable |
- | fi | + | 2894 g_value_array_get_nth |
- | </file> | + | 2942 g_value_get_string |
+ | 2961 g_type_check_value_holds | ||
+ | 2986 g_value_get_long | ||
+ | 3011 audit_log_acct_message | ||
+ | 3034 _ITM_registerTMCloneTable | ||
+ | 3060 lu_ent_set_string | ||
+ | 3078 lu_ent_get_first_value_strdup | ||
+ | 3185 lu_prompt_console | ||
+ | 3212 lu_user_lookup_name | ||
+ | 3239 lu_ent_set_long | ||
+ | 3281 lu_user_removepass | ||
+ | 3300 libgobject-2.0.so.0 | ||
+ | 3320 libglib-2.0.so.0 | ||
+ | 3379 poptHelpOptions | ||
+ | 3435 poptSetOtherOptionHelp | ||
+ | 3543 libpam_misc.so.0 | ||
+ | 3584 audit_log_user_avc_message | ||
+ | 3611 libselinux.so.1 | ||
+ | --More-- | ||
+ | </code> | ||
- | ou : | + | Dans le cas de l' |
- | <file> | + | <code> |
- | if condition | + | [root@centos8 tmp]# strings -f /bin/* | grep " |
- | then | + | / |
- | | + | / |
- | | + | / |
- | fi | + | / |
- | </file> | + | / |
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | /bin/gprof: @(#) Copyright (c) 1983 Regents of the University of California. | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | /bin/tree: $Version: $ tree v1.7.0 (c) 1996 - 2014 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro $ | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | /bin/vdo: # Copyright (c) 2020 Red Hat, Inc. | ||
+ | / | ||
+ | / | ||
+ | /bin/zip: Copyright (c) 1990-2008 Info-ZIP. | ||
+ | /bin/zip: Copyright (c) 1990-2008 Info-ZIP - Type '%s " | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | </code> | ||
- | ou encore | + | <WRAP center round important 60%> |
+ | **Important** | ||
+ | </ | ||
- | < | + | ==Options de la commande== |
- | if condition | + | |
- | then | + | |
- | commande(s) | + | |
- | elif condition | + | |
- | then | + | |
- | | + | |
- | elif condition | + | |
- | then | + | |
- | | + | |
- | else | + | |
- | commande(s) | + | |
- | fi | + | <WRAP center round todo 60%> |
- | </file> | + | **A faire** : Utilisez l' |
+ | </WRAP> | ||
- | Créez | + | ===7.12 - La commande comm=== |
+ | |||
+ | La commande **comm** est utilisée pour comparer deux fichiers texte. La sortie de la commande sépare les lignes en trois catégories : | ||
+ | |||
+ | * Les lignes présentes seulement dans le premier fichier, | ||
+ | * Les lignes présentes seulement dans le deuxième fichier, | ||
+ | * Les lignes présentes dans la deux fichiers. | ||
+ | |||
+ | Utilisez la commande **comm** pour comparer les fichiers **/ | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ cat user_check | + | root: |
- | #!/bin/bash | + | bin:x:1: |
- | if [ $# -ne 1 ] ; then | + | daemon: |
- | echo " | + | adm: |
- | echo " | + | lp: |
- | exit 1 | + | sync:x:5:0: |
- | fi | + | shutdown: |
- | if grep "^$1:" | + | halt: |
- | then | + | mail: |
- | echo " | + | operator: |
- | else | + | games: |
- | echo " | + | ftp: |
- | fi | + | nobody: |
- | exit 0 | + | dbus: |
+ | systemd-coredump: | ||
+ | systemd-resolve: | ||
+ | tss: | ||
+ | polkitd: | ||
+ | unbound: | ||
+ | libstoragemgmt: | ||
+ | cockpit-ws: | ||
+ | sssd: | ||
+ | setroubleshoot: | ||
+ | sshd: | ||
+ | chrony: | ||
+ | tcpdump: | ||
+ | trainee10: | ||
+ | comm: file 2 is not in sorted order | ||
+ | cockpit-wsinstance: | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
+ | Linux | ||
+ | trainee: | ||
+ | comm: file 1 is not in sorted order | ||
+ | cockpit-wsinstance: | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
</ | </ | ||
- | Testez-le : | + | Pour afficher uniquement les lignes présentes dans les deux fichiers, il convient d' |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | [trainee@centos8 training]$ ./user_check | + | root: |
- | Mauvais nombre d' | + | bin: |
- | Usage : ./user_check nom_utilisateur | + | daemon: |
- | [trainee@centos8 training]$ ./user_check root | + | adm: |
- | Utilisateur | + | lp: |
- | [trainee@centos8 training]$ ./user_check mickey mouse | + | sync: |
- | Mauvais nombre d' | + | shutdown: |
- | Usage : ./user_check nom_utilisateur | + | halt: |
- | [trainee@centos8 training]$ ./user_check " | + | mail: |
- | Utilisateur mickey mouse n'est pas défini sur ce système | + | operator: |
+ | games: | ||
+ | ftp: | ||
+ | nobody: | ||
+ | dbus: | ||
+ | systemd-coredump: | ||
+ | systemd-resolve: | ||
+ | tss: | ||
+ | polkitd: | ||
+ | unbound: | ||
+ | libstoragemgmt: | ||
+ | cockpit-ws: | ||
+ | sssd: | ||
+ | setroubleshoot: | ||
+ | sshd: | ||
+ | chrony: | ||
+ | comm: file 2 is not in sorted order | ||
+ | comm: file 1 is not in sorted order | ||
</ | </ | ||
- | ===case=== | + | ==Options de la commande== |
- | La syntaxe | + | <WRAP center round todo 60%> |
+ | **A faire** : Utilisez l' | ||
+ | </ | ||
- | < | + | ===7.13 - La commande |
- | case $variable in | + | |
- | modele1) commande | + | |
- | ... | + | |
- | ;; | + | |
- | modele2) | + | |
- | ... | + | |
- | ;; | + | |
- | modele3 | modele4 | modele5 ) commande | + | |
- | ... | + | |
- | ;; | + | |
- | esac | + | |
- | </ | + | |
- | ==Exemple== | + | La commande **head** permet d' |
< | < | ||
- | case " | + | [root@centos8 tmp]# head /etc/passwd |
- | | + | root: |
- | start | + | bin: |
- | ;; | + | daemon: |
- | stop) | + | adm: |
- | stop | + | lp: |
- | ;; | + | sync: |
- | | + | shutdown: |
- | stop | + | halt:x:7:0: |
- | start | + | mail: |
- | ;; | + | operator: |
- | status) | + | |
- | status | + | |
- | ;; | + | |
- | *) | + | |
- | echo $" | + | |
- | exit 1 | + | |
- | esac | + | |
</ | </ | ||
- | <WRAP center round important 60%> | + | Avec l' |
- | **Important** : L'exemple indique que dans le cas où le premier argument qui suit le nom du script contenant la clause | + | |
+ | <code> | ||
+ | [root@centos8 tmp]# head -n 15 / | ||
+ | root: | ||
+ | bin: | ||
+ | daemon: | ||
+ | adm: | ||
+ | lp: | ||
+ | sync: | ||
+ | shutdown: | ||
+ | halt: | ||
+ | mail: | ||
+ | operator: | ||
+ | games: | ||
+ | ftp: | ||
+ | nobody: | ||
+ | dbus: | ||
+ | systemd-coredump: | ||
+ | </ | ||
+ | |||
+ | La commande | ||
+ | |||
+ | < | ||
+ | [root@centos8 tmp]# head -c 150 / | ||
+ | root: | ||
+ | bin: | ||
+ | daemon: | ||
+ | adm: | ||
+ | lp: | ||
+ | </ | ||
+ | |||
+ | Dans le cas où le **y** est négatif, la commande | ||
+ | |||
+ | < | ||
+ | [root@centos8 tmp]# head -c -150 /etc/passwd | ||
+ | root: | ||
+ | bin: | ||
+ | daemon: | ||
+ | adm: | ||
+ | lp: | ||
+ | sync: | ||
+ | shutdown: | ||
+ | halt: | ||
+ | mail: | ||
+ | operator: | ||
+ | games: | ||
+ | ftp: | ||
+ | nobody: | ||
+ | dbus: | ||
+ | systemd-coredump: | ||
+ | systemd-resolve: | ||
+ | tss: | ||
+ | polkitd: | ||
+ | unbound: | ||
+ | libstoragemgmt: | ||
+ | cockpit-ws: | ||
+ | sssd: | ||
+ | setroubleshoot: | ||
+ | sshd: | ||
+ | chrony: | ||
+ | tcpdump: | ||
+ | trainee: | ||
+ | cockpit-wsinstance: | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | </ | ||
+ | |||
+ | Les valeurs | ||
+ | |||
+ | < | ||
+ | [root@centos8 tmp]# head -c 1b / | ||
+ | root: | ||
+ | bin: | ||
+ | daemon: | ||
+ | adm: | ||
+ | lp: | ||
+ | sync: | ||
+ | shutdown: | ||
+ | halt: | ||
+ | mail: | ||
+ | operator: | ||
+ | games: | ||
+ | ftp: | ||
+ | nobody: | ||
+ | |||
+ | [root@centos8 tmp]# head -c 512 / | ||
+ | root: | ||
+ | bin: | ||
+ | daemon: | ||
+ | adm: | ||
+ | lp: | ||
+ | sync: | ||
+ | shutdown: | ||
+ | halt: | ||
+ | mail: | ||
+ | operator: | ||
+ | games: | ||
+ | ftp: | ||
+ | nobody: | ||
+ | </ | ||
+ | |||
+ | Les multiplicateurs les plus utilisés sont : | ||
+ | |||
+ | ^ Multiplicateur ^ Valeur en octets ^ | ||
+ | | b | 512 | | ||
+ | | KB | 1000 | | ||
+ | | K | 1024 | | ||
+ | | MB | 1000*1000 | | ||
+ | | M | 1024*1024 | | ||
+ | | GB | 1000*1000*1000 | | ||
+ | | G | 1024*1024*1024 | | ||
+ | |||
+ | ==Options de la commande== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l' | ||
</ | </ | ||
- | ====2.8 - Boucles==== | + | ===7.14 - La commande tail=== |
- | ===for=== | + | La commande **tail** permet d' |
- | La syntaxe de la commande | + | < |
+ | [root@centos8 tmp]# tail / | ||
+ | trainee: | ||
+ | cockpit-wsinstance: | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
+ | </ | ||
- | < | + | Avec l' |
- | for variable in liste_variables | + | |
- | do | + | |
- | commande(s) | + | |
- | done | + | |
- | </ | + | |
+ | < | ||
+ | root@centos8 tmp]# tail -n 15 /etc/passwd | ||
+ | sssd: | ||
+ | setroubleshoot: | ||
+ | sshd: | ||
+ | chrony: | ||
+ | tcpdump: | ||
+ | trainee: | ||
+ | cockpit-wsinstance: | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
+ | </ | ||
- | ===while=== | + | La commande **tail** peut également être utilisée pour afficher les derniers **y** octets en utilisant l' |
- | La syntaxe de la commande while est la suivante | + | < |
+ | [root@centos8 tmp]# tail -c 150 / | ||
+ | er:/ | ||
+ | radvd: | ||
+ | dnsmasq: | ||
+ | </ | ||
- | < | + | Dans le cas où le **y** est positif, la commande |
- | while condition | + | |
- | do | + | |
- | | + | |
- | done | + | |
- | </ | + | |
- | ==Exemple== | + | < |
+ | [root@centos8 tmp]# tail -c +150 / | ||
+ | 7: | ||
+ | sync: | ||
+ | shutdown: | ||
+ | halt: | ||
+ | mail: | ||
+ | operator: | ||
+ | games: | ||
+ | ftp: | ||
+ | nobody: | ||
+ | dbus: | ||
+ | systemd-coredump: | ||
+ | systemd-resolve: | ||
+ | tss: | ||
+ | polkitd: | ||
+ | unbound: | ||
+ | libstoragemgmt: | ||
+ | cockpit-ws: | ||
+ | sssd: | ||
+ | setroubleshoot: | ||
+ | sshd: | ||
+ | chrony: | ||
+ | tcpdump: | ||
+ | trainee: | ||
+ | cockpit-wsinstance: | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
+ | </ | ||
- | < | + | Les valeurs **x** et **y** acceptent des multiplicateurs : |
- | U=1 | + | |
- | while [ $U -lt $MAX_ACCOUNTS ] | + | |
- | do | + | |
- | useradd fenestros" | + | |
- | useradd fenestros" | + | |
- | echo " | + | |
- | let U=U+1 | + | |
- | done | + | |
- | </ | + | |
- | ====2.8 | + | < |
+ | [root@centos8 tmp]# tail -c 1b / | ||
+ | nstances:/ | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
- | Quand Bash est appelé en tant que shell de connexion, il exécute des scripts de démarrage dans l' | + | [root@centos8 tmp]# tail -c 512 / |
+ | nstances:/ | ||
+ | rngd: | ||
+ | gluster: | ||
+ | qemu: | ||
+ | rpc: | ||
+ | rpcuser: | ||
+ | saslauth: | ||
+ | radvd: | ||
+ | dnsmasq: | ||
+ | </ | ||
- | * **/ | + | Les multiplicateurs les plus utilisés sont : |
- | * **~/ | + | |
- | Dans le cas de RHEL/ | + | ^ Multiplicateur ^ Valeur en octets ^ |
+ | | b | 512 | | ||
+ | | KB | 1000 | | ||
+ | | K | 1024 | | ||
+ | | MB | 1000*1000 | | ||
+ | | M | 1024*1024 | | ||
+ | | GB | 1000*1000*1000 | | ||
+ | | G | 1024*1024*1024 | | ||
- | Quand un shell de login se termine, Bash exécute le fichier | + | Une option intéressante pour la surveillance des fichiers |
- | Quand bash est appelé en tant que shell interactif qui n'est pas un shell de connexion, il exécute le script **~/.bashrc**. | + | < |
+ | [root@centos8 tmp]# tail -f /var/ | ||
+ | Apr 20 06:27:53 centos8 systemd[1]: Started dnf makecache. | ||
+ | Apr 20 07:28:29 centos8 systemd[1]: Starting dnf makecache... | ||
+ | Apr 20 07:28:29 centos8 dnf[12423]: Metadata cache refreshed recently. | ||
+ | Apr 20 07:28:29 centos8 systemd[1]: dnf-makecache.service: | ||
+ | Apr 20 07:28:29 centos8 systemd[1]: Started dnf makecache. | ||
+ | Apr 20 07:50:35 centos8 systemd[1]: Started / | ||
+ | Apr 20 07:50:35 centos8 systemd[1]: Starting man-db-cache-update.service... | ||
+ | Apr 20 07:50:36 centos8 systemd[1]: man-db-cache-update.service: | ||
+ | Apr 20 07:50:36 centos8 systemd[1]: Started man-db-cache-update.service. | ||
+ | Apr 20 07:50:36 centos8 systemd[1]: run-r85917a32bc86476980c271609ba457fb.service: | ||
+ | ^C | ||
+ | </ | ||
- | <WRAP center round important | + | ==Options de la commande== |
- | **A faire** : En utilisant vos connaissances acquises dans ce module, expliquez | + | |
+ | <WRAP center round todo 60%> | ||
+ | **A faire** : Utilisez l' | ||
</ | </ | ||
- | ===~/ | + | ====LAB #8 - Utiliser les commandes ifconfig, grep, tr et cut pour isoler l' |
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | # .bash_profile | + | ens18: flags=4163< |
+ | inet 10.0.2.45 | ||
+ | inet6 fe80:: | ||
+ | ether 4e: | ||
+ | RX packets 11473 bytes 24023891 (22.9 MiB) | ||
+ | RX errors 0 dropped 0 overruns 0 frame 0 | ||
+ | TX packets 9521 bytes 1744650 (1.6 MiB) | ||
+ | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 | ||
- | # Get the aliases and functions | + | [root@centos8 tmp]# ifconfig ens18 | grep " |
- | if [ -f ~/ | + | inet 10.0.2.45 |
- | . ~/.bashrc | + | inet6 fe80:: |
- | fi | + | |
- | # User specific environment and startup programs | + | [root@centos8 tmp]# ifconfig ens18 | grep " |
+ | inet 10.0.2.45 | ||
+ | |||
+ | [root@centos8 tmp]# ifconfig ens18 | grep " | ||
+ | : | ||
+ | |||
+ | [root@centos8 tmp]# ifconfig ens18 | grep " | ||
+ | 10.0.2.45 | ||
</ | </ | ||
- | ===~/.bashrc=== | + | <WRAP center round important 60%> |
+ | **Important** : Notez l' | ||
+ | </ | ||
+ | |||
+ | ====LAB #9 - Utiliser les commandes ip, grep, awk et sed pour isoler l' | ||
< | < | ||
- | [trainee@centos8 | + | [root@centos8 |
- | # .bashrc | + | 2: ens18: < |
+ | link/ether 4e: | ||
+ | inet 10.0.2.45/24 brd 10.0.2.255 scope global noprefixroute ens18 | ||
+ | | ||
+ | inet6 fe80:: | ||
+ | | ||
- | # Source global definitions | + | [root@centos8 tmp]# ip addr show ens18 | grep " |
- | if [ -f / | + | inet 10.0.2.45/24 brd 10.0.2.255 scope global noprefixroute ens18 |
- | . /etc/bashrc | + | inet6 fe80:: |
- | fi | + | |
- | # User specific environment | + | [root@centos8 tmp]# ip addr show ens18 | grep "inet" | grep -v "inet6" |
- | PATH="$HOME/ | + | inet 10.0.2.45/ |
- | export PATH | + | |
- | # Uncomment the following line if you don't like systemctl's auto-paging feature: | + | [root@centos8 tmp]# ip addr show ens18 | grep " |
- | # export SYSTEMD_PAGER= | + | 10.0.2.45/ |
- | # User specific aliases and functions | + | [root@centos8 tmp]# ip addr show ens18 | grep " |
+ | 10.0.2.45 | ||
</ | </ | ||
----- | ----- | ||
Copyright © 2023 Hugh Norris. | Copyright © 2023 Hugh Norris. |