Partage
  • Partager sur Facebook
  • Partager sur Twitter

script shell bash, awk

Sujet résolu
    14 janvier 2018 à 15:28:30

    Je reprend ma question plus bas

    -
    Edité par Arrgon 16 janvier 2018 à 14:16:39

    • Partager sur Facebook
    • Partager sur Twitter
    Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait
      14 janvier 2018 à 15:47:17

      salut,

      1- il est préférable de faire un copier/coller, plutôt que de poster des captures d'écran.

      2- comment, sans l'énoncé, savoir si ce que tu fais est correct ?

      3- comment peux-tu espérer qu'un script soit syntaxiquement correct si tu n'as même pas testé quelques unes des commandes qu'il comporte ?
      tu aurais vu que de nombreuses commandes sont erronées !

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        14 janvier 2018 à 16:57:04

        Merci de ta réponse

        En faisant un copier/coler j'aurai perdu toutes les preuves syntaxiques des commentaires qui sont l'énoncé complet de mon travail, donc tu n'as même pas lu ce que j'ai envoyer ? Oui je sais l'énoncé est loin d'être claire, il n'y en a même pas enfaîte, c'est juste les "#vérifier que" avant chacune de mes tentatives

        Je ne suis pas sous unix et je n'ai pas de quoi faire une VM c'est pour cela que je n'ai pas pu le test.

        PS : Je ne cherche pas forcement à ce que le tout marche, je veut savoir si je suis sur la bonne voie.

        Merci

        -
        Edité par Arrgon 14 janvier 2018 à 17:00:21

        • Partager sur Facebook
        • Partager sur Twitter
        Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait
          14 janvier 2018 à 17:22:19

          et cygwin !?

          je ne lis pas les captures d'écran.

          pour savoir si tu es sur la bonne voie, il faut qu'on sache d'où tu pars, où tu veux aller.
          on ne doit pas suivre les petits cailloux que tu as semé dans ton "script".

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

          Anonyme
            15 janvier 2018 à 14:22:59

            Salut,

            @dantonq: +1

            @Arrgon: Tu peux copier dans des balises pre pour insérer du code ( il sufiit de cliquer sur l'icône entre l'icône pour insérer une image et l'icône pour insérer un smiley).

            De plus, j'ai pas vraiment regardé ce que tu as posté mais franchement, c'est compliqué de savoir si ce que tu as fait est bon, par exemple la 1ère commande ne va pas séparer la sortie en 7 champs comme tu l’espères. Sachant que tu te compliques la vie vu que dans le fichier /etc/passwd le séparateur est : ( deux points).

            Après, tu laisses du langage naturel dans ton code donc fait attention, les gros OU, ça va pas faire plaisir à Monsieur Bash.

            Je rajoute que la syntaxe pour une condition if est:

            if [ condition ]

            Note bien les espaces !!

            Tu as aussi au moins une commande qui ne fait rien à part bloquer ton script comme celle là:

            awk "$3 $4 ~/^[0-9]*$/ && $3 > 1000 && &4 > 1000"

            Vu qu'on ne sait pas ce que tu essayes de faire concrètement, et que ton script regorges de petites erreurs, il est difficile de dire quoi que ce soit de constructif. Et si en plus toi-même tu ne peux pas le tester, tu ne peux pas t'attendre à des miracles surtout si tu n'as pas l'habitude.

            PS: Pour W10: il existe aussi Bash on Ubuntu on Windows, tu peux télécharger Ubuntu ainsi que openSUSE depuis le store. Tu auras une accès à une console de la dite distribution, beaucoup moins de fonctionnalités que la "vraie" distrib, mais elle est intégrée à Windows ce qui est très utile pour exécuter ce genre de petits scripts et voir si au moins la syntaxe est bonne.

            -
            Edité par Anonyme 15 janvier 2018 à 15:09:23

            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2018 à 14:54:40

              Vous avez raison, je vais procéder étape par étape sinon je ne vais pas m'en sortir.

              Au début je ne voulais pas insérer du code car je pensais que pour le shell il n'y avait pas les codes couleurs, c'est pour ça que j'avais mit des images. 

              Je suis donc sur ma VM : 

              Donc mon script et mon fichier (que je vais vérifier à l'aide du script) se trouve sur /root/Bureau/

              Je dois faire des vérifications par rapport a ses champs qui se situe dans list : ci dessous :

              Chaque ligne est constituée de 4 champs

              NOM PRENOM UID GID 

              Et j'ai ci-dessous mon script :

              #!/bin/bash
              
              
              #Vérifier que le fichier passé en paramètre existe
              if [ -f /root/Bureau/list ]  
              then	
              	echo "le fichier existe" #La condition est vérifié lorsque le fichier existe
              fi
              #-----------------------------------------------------------
              
              #Vérifier que c’est l’utilisateur root qui lance le script
              #root correspond à l'UID numéro 0, ainsi :
              if [ $UID -eq "0" ]  # -eq correspond à égal, fonctionne aussi avec if (($UID == "0"))
              then	
              	echo "l'utilisateur root a lancé le script" #La condition est vérifié si la variable $UID est égal à la chaine de caractères "0" 
              else
              	echo "ce n'est pas l'utilisateur root qui a lancé le script"  #sinon
              fi
              
              #-----------------------------------------------------------
              
              #Vérifier que les 4 champs sont présents sinon rejet
              
              awk 'NF == 4 {print " : " $0 }' /root/Bureau/list  #Afficher les lignes dont le nombre de champs est égal à 4 en partant du premier champs
              #Lorsque une ligne ne contient pas 4 champs, elle ne s'affiche pas.
               
              
              #BEGIN et END peuvent être utilisés, suivis d'instruction comme des commentaires, on peut se servir de BEGIN pour définir le séparateur et de END pour indiquer la fin de la commande
              
              #---------------------------------------------------------
              
              # Vérifier que les champs UID et GID sont des nombres entiers sinon rejet 
              
               awk '$3 !~ /^[0-9]*$/ {print "UID  erreur ligne "NR" :\n"$0 }' /root/Bureau/list
               awk '$4 !~ /^[0-9]*$/ {print "GID  erreur ligne "NR" :\n"$0 }' /root/Bureau/list
              	  
              # ^ et $ indique respectivement le début et la fin de la chaine.
              # On indique ici que nous cherchons des caractères numériques[0-9] au champs numéro $3 et $4.
              
              #Si par exemple le GID de la ligne 2 est ifc :
              #      erreur ligne 2 :
              #    Martin jean 1001 ifc
              
              
              #---------------------------------------------------------
              
              # Vérifier que l’UID et le GID sont supérieurs à 1000 sinon rejet
              #On souhaite vérifier si les champs numéro $3 et $4 sont supérieur à 1000
              
              awk '$3 > 1000 && $4 > 1000 {print "UID et GID supérieur à 1000 à la ligne "NR" :"$0 }' /root/Bureau/list
              
              #OU
              
              #On affiche toutes les lignes dont l'UID et le GID sont égal ou inférieur à 1000
              awk '$3 <= 1000 && $4 <= 1000 {print "erreur ligne "NR" :"$0", UID et GID ne sont pas supérieur à 1000"}' /root/Bureau/list
              
              
              #---------------------------------------------------------
              
              # Vérifier que le GID soit présent sinon le créer avec le même nom que le login sinon rejet
              sed 's/\(.*\)\(.\{4\}\)/\2/' /root/Bureau/list #Afficher les 4 derniers caractères de toutes les lignes du fichier list, ne sera pas utile pour réaliser l'objectif mais pour observer les changements
              
              if [ -z $4 ]  # l'option -z permet de tester si une chaine est vide, ici test pour la variable $4
              then #si le GID n'est pas présent, le créer avec le même nom que le login
              	awk -F';' '{ gsub(/$4 = $1) }'
              	echo "le GID est maitenant égal au login"
              else 
              	echo "le GID est déjà présent" #le GID à déjà une valeur
              fi
              
              #---------------------------------------------------------
              
              # Vérifier que le champ nom et prénom ne comportent que des caractères autorisés sinon rejet
              awk '$1 !~ /^[a-zA-Z]*$/ {print "Le premier champ NOM comportent des caractères non autorisés à la ligne "NR" :\n"$0 }' /root/Bureau/list
              
              awk '$2 !~ /^[a-zA-Z]*$/ {print "Le deuxième champ PRENOM comportent des caractères non autorisés à la ligne "NR" :\n"$0 }' /root/Bureau/list
              
              #On vérifie que pour le champ  nom et prénom ($1 et $2) il n'y a pas de caractère différent de a-z et A-Z, lorsqu'il y a un accent, des caractères spéciaux ou même des caractères numériques, on l'indique à la sortie.
              
              #  Le champ NOM comportent des caractères non autorisés à la ligne 4 :
              #  sébastien bernard 1003 1003
              
              
              #----------------------------------------------------------
              
              # S’il y a des majuscules dans le champ nom et prénom alors il faut les transformer en minuscule.
              echo $1 | awk '{print tolower($0)}'
              
              #OU 
              
              echo $1 $2 | tr '[A-Z]' '[a-z]'
              
              #---------------------------------------------------------
              
              # S’il y a des caractères accentués tel que é è ê ë ï î, ils devront être remplacés par un e ou un i. 
               echo $1 | sed 'y/áàâäçéèêëîïìôöóùúüñÂÀÄÇÉÈÊËÎÏÔÖÙÜÑ/aaaaceeeeiiiooouuunAAACEEEEIIOOUUN/'
               echo $2 | sed 'y/áàâäçéèêëîïìôöóùúüñÂÀÄÇÉÈÊËÎÏÔÖÙÜÑ/aaaaceeeeiiiooouuunAAACEEEEIIOOUUN/'
               
              #OU 
               
               echo $1 $2 | iconv -f utf8 -t ascii//TRANSLIT  #iconv est utilisé pour convertir la chaine du format UTF-8 (-f = from), vers le format ASCII (-t = to).
               #Avec l’option « TRANSLIT », si un caractère ne peut être transcrit dans le format de destination, il est converti en une chaine de caractère équivalente.
              
              #OU 
               
               cat /root/Bureau/list
               iconv -f utf8 -t ascii//TRANSLIT < root/Bureau/list > list_users_sansaccent.txt
               cat list_users_sansaccent.txt
               
              #OU avec
               
              tr '[àâäéèêëîïôöùûü]' '[aaaeeeeiioouuu]'
              
              
               #---------------------------------------------------------
              
              # Vérifier que le login et l’UID ne sont pas déjà utilisés sinon rejet
              



              Mes cinq premières commandes sont fonctionnelles dans la console et affiche bien les erreurs que je souhaite quand c'est le cas, dites moi si vous le voulez bien si rien ne vous choque mais ne vous attardez pas dessus :p (enfin comme vous voulez, Merci), pareil également pour la septième commande

              Résultat console :

              Voilà mon problème viens pour les objectifs suivants :

              • Vérifier que le GID soit présent sinon le créer avec le même nom que le login sinon rejet
              • S’il y a des majuscules dans le champ nom et prénom alors il faut les transformer en minuscule.
              • S’il y a des caractères accentués tel que é è ê ë ï î, ils devront être remplacés par un e ou un i.
              • Vérifier que le login et l’UID ne sont pas déjà utilisés sinon rejet
              Dans l'ensemble j'ai peut être résolu à moitier le problème mais j'ai mal gérer la syntaxe, pour la dernière que je n'ai pas commencer car je ne sais pas m'y prendre il est dit que je peut utiliser GREP.

              Pour le premier problème, je ne sais pas commencer remplacer un champ par un autre, awk -F';' '{ gsub(/$4 = $1) }', du coup sa ne fonctionne pas, je souhaite remplacer le champ $1 par le champ $4, tout sa dans un if, j'ai limpression que lorsque l'on utilise awk dans un if c'est différent, ou alors ce n'est pas du tout comme sa qui faut s'y prendre.

              Ensuite pour le changement de Majuscule à minuscule avec echo ce n'est pas bon car je m'en fiche de changer les majuscules d'un affichage de ma console, c'est dans mon fichier directement que je veut le changer, et sa je ne vois pas non plus comment faire.

              Pareil pour les caractères accentués

              Voilà, je suis bien conscient que j'ai mieux résumé que la dernière fois x) ! Merci énormement pour votre aide 

              -
              Edité par Arrgon 16 janvier 2018 à 14:59:53

              • Partager sur Facebook
              • Partager sur Twitter
              Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait
                16 janvier 2018 à 17:08:59

                on va te soulager de nombreux faux problèmes :
                #!/bin/bash
                
                ((UID)) && { echo "pas Root"; exit 1;}
                test -f "/la/ou/est/leFichier" || { exho "pas de fichier"; exit 1;}
                
                while IFS='' read -a data
                do
                   ((${#data[*]}==4)) || { echo "pas 4 champs"; exit 1;}
                   # etc... avec les différents champs du tableau data[@]
                done < /la/ou/est/leFichier

                chaque ligne du fichier est placée dans le tableau data[@], ainsi on ne lit le fichier qu'une seule fois.
                les tableaux bash sont indexés à partir de zéro : ${tableau[0]} est le premier champ d'un tableau

                -
                Edité par dantonq 16 janvier 2018 à 17:12:40

                • Partager sur Facebook
                • Partager sur Twitter

                Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                  16 janvier 2018 à 19:23:59

                  Merci pour ta réponse mais c'est un tp que je doit rendre, c'est à dire que l'objectif est que je réalise ce qui est en commentaire,

                  je ne peut pas modifier mon travail à rendre en simplifiant le travail à faire et en contournant avec ce que tu me présente ici, qui est, je le conçoit, beaucoup plus propre.

                  Merci quand même pour ce que tu me présente ici qui me permet de comprendre un peu plus cette univers

                  -
                  Edité par Arrgon 16 janvier 2018 à 19:24:28

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait
                    16 janvier 2018 à 20:13:28

                    ça n'empêche pas de faire ce qui est demandé, mais au lieu de lire le fichier à chaque étape, il est lu une seule fois, les opérations demandées prennent place dans la boucle.

                    il n'est d'ailleurs pas dit explicitement que le fichier doit être lu, alors tu ne devrais pas le faire !?

                    nb: pour un script root, je vérifie toujours avant toute autre chose si c'est lui qui exécute le script, sinon c'est pas la peine d'aller plus loin.

                    le cahier des charges, c'est une chose, la réalisation "technique" en est une autre.
                    si deux opérations peuvent être réalisées par une seule machine, même si deux machines existent pour les réaliser, il est préférable de n'utiliser qu'une seule machine.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                    Anonyme
                      17 janvier 2018 à 16:00:08

                      Arrgon a écrit:

                      Merci pour ta réponse mais c'est un tp que je doit rendre, c'est à dire que l'objectif est que je réalise ce qui est en commentaire,

                      je ne peut pas modifier mon travail à rendre en simplifiant le travail à faire et en contournant avec ce que tu me présente ici, qui est, je le conçoit, beaucoup plus propre.


                      Tu ne contournes rien. Dans le script de dantonq:

                      • ligne 3: tu vérifies que c'est bien root qui lance le script sinon tu exit avec un message d'erreur.
                      • ligne 4: tu vérifies que ce fichier existe et que c'est bien un fichier sinon tu exit avec un message d'erreur.
                      • ligne 6 à 10: tu vérifies que chaque ligne comporte 4 champs sinon exit avec message d'erreur. Sauf que si tout ce passe bien, le fichier sera dans une variable de type array.

                      Tu fais bien ce qui t'as été demandé, sauf que tu en fais un peu plus parce que tu prévois la suite, y'a rien de mal à ça, au contraire. C'est déjà plus de la prog bash que l'utilisation de GNU Awk et GNU Sed. Si tu as le droit d'utiliser ce genre d'outil plutôt que les commandes builtins et que tu n'as pas le droit de placer ton fichier dans une variable, ça n'a aucun sens ton TP. ^^

                      Après, vu qu'on ne connaît pas ton chargé de TP, difficile de dire ce qui est réellement attendu. Il semble qu'il faille afficher tout ce que tu fais déjà (pour faciliter la correction je suppose) ? Maintenant, il y a des choses dans ton énoncé qui ne sont pas claires. Alors peut-être qu'elles t'ont été expliquées mais c'est ambigu.
                      Que veut dire rejet? (pour moi c'est exit)

                      Arrgon a écrit:

                      Vérifier que le GID soit présent sinon le créer avec le même nom que le login sinon rejet

                      De quel GID parle-t-on? On a vérifié que les 4 champs sont présents et que le dernier est un nombre alphanumérique supérieur à 1000 donc je vois mal comment il ne pourrait pas être présent, on a déjà fait ça, la 1ère partie de l'énoncé demande de le refaire, c'est n'importe quoi, quel est le but? o_O. Est-ce donc de savoir que le GID existe dans le système? peut-être (?!).
                      Si oui, tu peux trouver la liste de tous les groupes ainsi que leur gid dans le fichier /etc/group. Avec grep, tu peux vite savoir si ce GID est associé à un groupe ou non (je reviens sur grep à la fin).

                      De plus, ça ne veut rien dire cette partie de l'énoncé. Un GID est l'ID d'un groupe, donc ici un numéro d'identification, unique. Un nom de login est rarement un numéro donc je vois mal comment créer un GID avec un "même nom que le login". Donc que veut-il dire: créer un groupe pour l'utilisateur avec GID et UID identique? Créer un groupe avec nom de login et nom du groupe identique? Probablement les deux, mais c'est libre d'interprétation.
                      Néanmoins, pour créer un groupe, tu peux utiliser la commande groupeadd ( tu peux aussi utiliser groupmod, useradd et usermod selon les cas), je te laisse regarder le manuel pour savoir de quelles options tu as besoin.

                      Arrgon a écrit:

                      • S’il y a des majuscules dans le champ nom et prénom alors il faut les transformer en minuscule.
                      • S’il y a des caractères accentués tel que é è ê ë ï î, ils devront être remplacés par un e ou un i.

                      Tu as les bons outils, maintenant, soit tu utilises la méthode de dantonq et tu travailles sur ta variable et tu es peinard, soit tu fait des redirection pour réécrire ton fichier. Bon, avec sed il existe le paramètre -i qui te permet d'éditer ton fichier (en réalité sed redirige la sortie vers un nouveau fichier qu'il renomme avec le nom du fichier que tu veux éditer). Exemple:

                      sed -i 's/a/i/g' ton_fichier

                      Remplace tous les a par des i dans le ficher ton_fichier. sed peut aussi changer la casse des caractères.

                      Arrgon a écrit:

                      Vérifier que le login et l’UID ne sont pas déjà utilisés sinon rejet

                      Si on suppose qu'il faut vérifier dans le système, il existe le fichier /etc/passwd contenant la list des utilisateurs ainsi que leur ID entre autre (fait attention, il y a aussi le GID). Le nom de l'utilisateur se situe dans le 1er champ et l'UID dans le 3ème. Les champs sont séparés par deux points: : . Avec cut et grep c'est facile.

                      Comment utiliser grep? grep permet de chercher dans un fichier une chaîne de caractères correspondant à un motif ( qui peut être une expression régulière).Par exemple, je souhaite chercher tous les lignes contenant root dans le fichier /etc/passwd, je fais

                      grep root /etc/passwd

                      Autre exemple, je souhaite chercher toutes les lignes commençant par la lettre s dans ce même fichier, je fais:

                      grep ^s /etc/passwd

                      Par défaut, grep donnera en sortie chaque ligne dans laquelle le motif a été trouvé.

                      Vu qu'on ne connait pas ton chargé de TP, et que l'énoncé n'est pas très développé, parfois imprécis, te fait effectuer deux fois la même tâche. Difficile de savoir ce qu'on attend de toi. Je trouve ça étonnant qu'on te donne ce genre de TP, l'énoncé parait bâclé et vite fait.

                      -
                      Edité par Anonyme 17 janvier 2018 à 16:09:22

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 janvier 2018 à 18:32:48

                        ShaWaTK a écrit :

                        Que veut dire rejet? (pour moi c'est exit)

                        j'y suis allé un peu fort, moi aussi; ;)
                        une simple indication du motif du non traitement de la ligne, et passage à la ligne suivante, seraient plus cohérent.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                          20 janvier 2018 à 0:26:57

                          Merci beaucoup ShaWaTK tu m'as bien aider à comprendre et j'ai pu quand même avancer, je ne vais pas répondre à tes questions car je n'est pas les réponses pour la plupart et ce n'est pas la peine je m'en suis sorti, merci à toi aussi dantonq !
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait

                          script shell bash, awk

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown