IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

grep ne semble pas vouloir prendre en compte une variable


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    Points : 28
    Points
    28
    Par défaut grep ne semble pas vouloir prendre en compte une variable
    bonjour ts,
    j'ai écrit ce petit programme en bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash
    sudo chmod 777 /home/access/dossiertst/suppr.txt
    sudo chmod 777 /home/access/dossiertst/tstinfo.txt
    sudo chmod 777 /home/access/dossiertst/tstlogin.txt
    exist=`ls -l | grep 'suppr.txt' | wc -l`
    if [ $exist -eq 1 ]
    then
            if [ $exist = 1 ]
            then
             read nom<suppr.txt
    	 exist2=`cat /home/access/dossiertst/tstlogin.txt | grep $nom | wc -l`
                    if [ $exist2 = 1 ]
                    then
    # Recuperation du MP 2eme champs du fichier info
    	  password=`cat tstinfo.txt | grep $nom | cut -f 2 -d':'`		  		
    # effacer les entree en question dans le fichier login 
    		  sudo sed '/$nom/d' /home/access/dossiertst/tstlogin.txt 		 
    		  sudo sed '/$password/d' /home/access/dossiertst/tstlogin.txt
    #cat login_bkp | grep -v $nom> login.txt
    #rm -f login_bkp
                    fi
    #	sudo rm -f suppr.txt
    	sudo chmod 600 /home/access/dossiertst/suppr.txt
    	sudo chmod 600 /home/access/dossiertst/tstinfo.txt
    	sudo chmod 600 /home/access/dossiertst/tstlogin.txt
            fi
    fi
    la commande GREP déconne dans les deux cas, le fait de recevoir une variable $nom ne l'accepte pas je vois pas pour quoi
    merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ayago Voir le message
    bonjour ts,
    j'ai écrit ce petit programme en bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash
    sudo chmod 777 /home/access/dossiertst/suppr.txt
    sudo chmod 777 /home/access/dossiertst/tstinfo.txt
    sudo chmod 777 /home/access/dossiertst/tstlogin.txt
    exist=`ls -l | grep 'suppr.txt' | wc -l`
    if [ $exist -eq 1 ]
    then
            if [ $exist = 1 ]
            then
             read nom<suppr.txt
    	 exist2=`cat /home/access/dossiertst/tstlogin.txt | grep $nom | wc -l`
                    if [ $exist2 = 1 ]
                    then
    # Recuperation du MP 2eme champs du fichier info
    	  password=`cat tstinfo.txt | grep $nom | cut -f 2 -d':'`		  		
    # effacer les entree en question dans le fichier login 
    		  sudo sed '/$nom/d' /home/access/dossiertst/tstlogin.txt 		 
    		  sudo sed '/$password/d' /home/access/dossiertst/tstlogin.txt
    #cat login_bkp | grep -v $nom> login.txt
    #rm -f login_bkp
                    fi
    #	sudo rm -f suppr.txt
    	sudo chmod 600 /home/access/dossiertst/suppr.txt
    	sudo chmod 600 /home/access/dossiertst/tstinfo.txt
    	sudo chmod 600 /home/access/dossiertst/tstlogin.txt
            fi
    fi
    la commande GREP déconne dans les deux cas, le fait de recevoir une variable $nom ne l'accepte pas je vois pas pour quoi
    merci pour votre aide
    Bon déjà 2 remarques
    1) tu testes 2 fois d'affilée si "exist" est égal à 1 (et le second test n'est pas correct car on ne teste pas une égalité numérique avec "=")
    2) "cat fichier |grep truc" peut s'écrire "grep truc fichier"

    Sinon je te conseille de mettre "$nom" entre guillemets. Et puis peut-être un petit echo juste avant te permettra de mieux voir où ça pèche...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Si ton objectif est de tester la présence du fichier suppr.txt, la commande suivante est plus adaptée et moins couteuse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if [[ -f suppr.txt && -s suppr.txt ]] 
    	then
    	read nom < suppr.txt
    que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    exist=`ls -l | grep 'suppr.txt' | wc -l`
    if [ $exist -eq 1 ]
    then
            if [ $exist = 1 ]
            then
             read nom<suppr.txt

    http://man.developpez.com/man1/bash.1.php
    EXPRESSIONS CONDITIONNELLES
    Les expressions conditionnelles sont utilisées par la commande composée [[ et les commandes internes test et [ pour vérifier l'état d'un fichier et assurer des comparaisons arithmétiques ou sur des chaînes. Les expressions se forment à partir des opérateurs unaires ou binaires suivants. Si un argument fichier est de la forme /dev/fd/n, alors il représente le descritpeur de fichier n.

    -a fichier
    Vrai si le fichier existe.
    -b fichier
    Vrai si le fichier existe et est un fichier spécial bloc.
    -c fichier
    Vrai si le fichier existe et est un fichier spécial caractère.
    -d fichier
    Vrai si le fichier existe et est un répertoire
    -e fichier
    Vrai si le fichier existe.
    -f fichier
    Vrai si le fichier existe et est un fichier régulier.
    -g fichier
    Vrai si le fichier existe et a son bit Set-GID positionné.
    -h fichier
    Vrai si le fichier existe et est un lien symbolique.
    -k fichier
    Vrai si le fichier existe et a son bit ``sticky'' positionné.
    -p fichier
    Vrai si le fichier existe et est un tube nommé (FIFO).
    -r fichier
    Vrai si le fichier existe et est accessible en lecture.
    -s fichier
    Vrai si le fichier existe et a une taille non nulle.
    -t fd
    Vrai si fd est ouvert sur un terminal.
    .../...
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  4. #4
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    2) "cat fichier |grep truc" peut s'écrire "grep truc fichier"
    Je trouve nettement plus facile de lire les séquences de filtres de gauche à droite, surtout les plus complexes.
    Citation Envoyé par Sve@r Voir le message
    Sinon je te conseille de mettre "$nom" entre guillemets
    Et moi d'utiliser zsh... mais bon, chacun son truc, et pas de troll!

  5. #5
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par ayago Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    sudo chmod 777 /home/access/dossiertst/suppr.txt
    sudo chmod 777 /home/access/dossiertst/tstinfo.txt
    sudo chmod 777 /home/access/dossiertst/tstlogin.txt
    Pourquoi changer les droits?
    Citation Envoyé par ayago Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exist=`ls -l | grep 'suppr.txt' | wc -l`
    if [ $exist -eq 1 ]
    then
    Très (trop) compliqué!
    Citation Envoyé par ayago Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	 exist2=`cat /home/access/dossiertst/tstlogin.txt | grep $nom | wc -l`
    D'abord, on utilise fgrep (= grep -F) plutôt que grep dès qu'on a pas besoin des motifs de grep.

    Ensuite, le code de retour de grep indique si des lignes ont été sélectionnées :
    Citation Envoyé par man grep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    EXIT STATUS
        The following exit values are returned:
     
        0
            One or more lines were selected. 
        1
            No lines were selected. 
        >1
            An error occurred.
    Citation Envoyé par ayago Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		  sudo sed '/$nom/d' /home/access/dossiertst/tstlogin.txt 		 
    		  sudo sed '/$password/d' /home/access/dossiertst/tstlogin.txt
    Là, tu supprimes les occurrences de $nom (dollar n o m). C'est ce que tu veux?

    Si tu veux supprimer les occurrences de la valeur de $nom (plutôt, du motif $nom), utilises :

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par corrector Voir le message
    Je trouve nettement plus facile de lire les séquences de filtres de gauche à droite, surtout les plus complexes.
    Tu trouves la séquence [grep chaine fichier complexe] ??? Enfin, on n'est pas à un process près...

    Citation Envoyé par corrector Voir le message
    Et moi d'utiliser zsh...
    Plus récent et probablement meilleur mais comme le sujet initial est écrit en bash je donne des conseils bash... Mais bien que je ne connaisse pas zsh, je serais étonné que les guillemets doubles n'aient pas une certaine importance dans la gestion des expressions...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu trouves la séquence [grep chaine fichier complexe] ??? Enfin, on n'est pas à un process près...
    Non, je parlais de séquences de filtres. Typiquement, des trucs du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep ... | sed ... | awk ... | grep ... | tr ... | while read x y z ...
    Ensuite, ce n'est pas pour pinailler, mais grep recherche un motif. Pour une simple chaine, on utilise fgrep. Parfois les motifs peuvent être complexes, sans compter que grep peut aussi avoir des options.

    Je préfère pouvoir lire les séquences de filtres de gauche à droite, avec le fichier source complètement à gauche, et pas perdu à la fin d'une commande non-triviale.

    Citation Envoyé par Sve@r Voir le message
    Plus récent et probablement meilleur mais comme le sujet initial est écrit en bash je donne des conseils bash... Mais bien que je ne connaisse pas zsh, je serais étonné que les guillemets doubles n'aient pas une certaine importance dans la gestion des expressions...
    Ils ont un effet significatif, celui de d'éviter qu'un paramètre disparaisse quand il est vide, ils sont donc, malheureusement, encore souvent nécessaires.

    Mais si un paramètre ne peut pas être vide, les guillemets doubles ne sont pas nécessaires; ni, par exemple, pour une simple affectation :
    ce qui est quand même plus confortable.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par corrector Voir le message
    Non, je parlais de séquences de filtres. Typiquement, des trucs du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep ... | sed ... | awk ... | grep ... | tr ... | while read x y z ...
    Je préfère pouvoir lire les séquences de filtres de gauche à droite, avec le fichier source complètement à gauche, et pas perdu à la fin d'une commande non-triviale.
    Je comprends ton point de vue... mais si tu examines bien ta façon d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat fichier |grep ... | sed ... | awk ... | grep ... | tr ... | while read x y z ...
    et la mienne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep ... fichier | sed ... | awk ... | grep ... | tr ... | while read x y z ...
    Tu verras que, avec un minimum d'effort à la relecture, les deux expressions sont tout aussi compréhensible l'une que l'autre... mais l'une des deux utilise un processus de moins..

    Citation Envoyé par corrector Voir le message
    Ensuite, ce n'est pas pour pinailler, mais grep recherche un motif. Pour une simple chaine, on utilise fgrep. Parfois les motifs peuvent être complexes, sans compter que grep peut aussi avoir des options.
    Exact. C'est effectivement un réflexe qui me manque => penser à utiliser fgrep si c'est possible...


    Citation Envoyé par corrector Voir le message
    Mais si un paramètre ne peut pas être vide, les guillemets doubles ne sont pas nécessaires; ni, par exemple, pour une simple affectation :
    ce qui est quand même plus confortable.
    Exact mais c'est ma façon de voir => je préfère mettre des guillemets double chaque fois que je traite une variable ce qui m'évite de me demander "est-ce que ça ne va pas planter si la variable contient un espace"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/03/2013, 13h00
  2. [MySQL] Ma requête ne semble pas vouloir fonctionner?
    Par Serghez dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/02/2013, 23h54
  3. Le manifest du war ne semble pas être pris en compte
    Par jpclavery dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 14/06/2008, 22h22
  4. Réponses: 2
    Dernier message: 31/08/2007, 16h52
  5. [SQL] La valeur d'une variable ne semble pas être prise en compte
    Par oroumgolok dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/09/2006, 23h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo