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

Shell et commandes GNU Discussion :

Shell: besoin d'un aiguillage sur un raisonnement


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Autre
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Shell: besoin d'un aiguillage sur un raisonnement
    Bonjour,

    Voilà le problème: Je possède avec un fichier avec un nombre X de lignes. Sur chaque ligne, je dois extraire une chaîne de caractères à un emplacement spécifique. Par exemple du (n)ème caractère au (n +4)ème.
    Le résultat de cette chaine de caractère doit être comparé avec une chaîne préalablement définie et fixe. Par exemple init=0000.
    Ainsi que d'autres chose à prendre en compte, mais bref... Je vais procéder étape par étape, d'autant plus que le reste devrait couler de source.
    Donc je pensais tout simplement: pendant la lecture par ligne, je "cut" et je "put" le résultat de découpage dans une variable, via un if je compare.
    Mais ce que je ne comprends pas vraiment avec le shell, c'est comment mettre ce résultat dans une variable.
    Alors j'ai bien lu la doc type var=`cmd`, ou var=$(cmd) mais quelque chose doit m'échapper.
    Donc d'abord, en essayant de comprendre comment ça marche, j'ai simplement cherché à afficher tous les résultats, en utilisant cat |while read et un cut. Done, cela m'a affichait le résultat voulu
    Il me semblait alors pas mal de parcourir le document ligne à ligne en insérant chaque donnée dans un tableau. Et comparer.
    Mais malgré avoir lu la documentation sur les boucles, fais des essais bidons, je tourne en rond, et je me pose alors la question, si c'est vraiment une méthode.
    Je ne demande pas à ce qu'on me ponde le code, mais juste qu'on m'aide un peu sur le raisonnement. Et qu'on m'éclaire un poil sur l'affectation des variables quand c'est une commande, ainsi que sur les tableaux... Car pensant tout bêtement à un for, je me suis aperçu que la structure ne me semble pas aussi trivial qu'en c.
    Par avance merci, et navrée de mon incompétence en la matière!

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    si tu parles de tableau, c'est que tu es sur du bash ou du ksh, et donc, cut pourra être éviter, car l'un et l'autre possèdent la possibilité (via le Remplacement de paramètres, cf. man bash, par exemple) de ne retenir qu'une partie d'une variable du caractère n (en fait n+1, car le shell, en tout bash, compte à partir de zéro) à m (soit (n+1)+m).

    Alors j'ai bien lu la doc type var=`cmd`, ou var=$(cmd) mais quelque chose doit m'échapper.
    peut-être, qu'est-ce qui t'amène à penser cela ?

    cat et ls sont très rarement utiles dans un script (le premier moins que le dernier).

    voici de la doc sur le parcours de fichiers.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Bonjour et bienvenue,

    En shell, $(commande) et `commande` sont équivalent et execute dans un sous shell, la ou les commandes que l'on a précisé.
    Pour définir une variable, la syntaxe est le nom de la variable suivi du signe égale (sans espace entre le nom de la variable et le signe) puis suivi de la valeur que l'on veut lui affecter.
    Si cette valeur est le résultat d'une commande, alors il faut mettre la commande dans un sous-shell, et dans ce cas la variable prendra comme valeur ce que la commande t'aurait affiché si tu l'avais lancé directement.

    Le souci avec les variables, c'est que les processus fils héritent des variables de leur père mais pas l'inverse.
    Or, le pipe en bash par défaut lance un processus fils, et donc toutes les variables que tu définiras à droite du pipe ne seront accessible que de ce coté du pipe.
    Exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ foo=bar
    $ echo $foo
    bar
    $ foo=$(echo titi)
    $ echo $foo
    titi
    $ echo toto | read foo ; echo $foo
    titi
    $ echo toto | { read foo ; echo $foo ;}
    toto
    $ echo $foo
    titi
    Pour le cas de la ligne 7, cela affiche titi car le pipe fini au ";" , si on veut passer plusieurs commandes, alors il faut préciser que c'est un bloc de commande comme dans la ligne 9.
    D'ailleurs, sur cette ligne 9, on voit bien le changement de valeur pour la variable foo mais qu'ensuite, une fois le bloc de commande fini, comme on est revenu dans le processus père, la variable accessible est celle du père et donc sa valeur est toujours la même qu'avant la commande avec le pipe.
    Cordialement.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    une façon de concevoir le truc pourrait être la suivante :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cat fichier                       # on obtient l'affichage du fichier
    cat | cut                         # on a plus que la section du fichier qui nous intéresse
    cat | cut | while read            # sur cette section on lit ligne à ligne (dans une variable, pratique à manipuler)
    cat | cut | while read; do if []  # tandis qu'on lit ligne à ligne on peut effectuer un traitement conditionnel

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    il serait regrettable de recréer en bash les outils grep, sed, awk. Peut-on avoir un échantillon du fichier de départ et la conclusion souhaitée ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Autre
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Re bonjour,

    Merci pour toutes ces réponses. J'ai commencé à éplucher la documentation fournie par N_BaH entre midi et deux. En effet je suppose qu'il y avait quelques notions essentielles qui sont passées au travers du filet, et je pense m'être compliquée la tâche pour des broutilles. Je remercie également les autres pour leurs diverses explications. N'ayant pas eu le temps de me pencher sur la question cet après midi, je terminerai ça demain matin. Donc je verrai si j'ai d'autres questions ou pas, en espérant que ce sera en mode alles klar.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Autre
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Alors, ce matin, les idées étaient plus claires.
    Donc pour répondre à Flodelarab, pour diverses raisons (et notamment pro), je ne diffuserai pas un échantillon du fichier. D'autre part, la finalité était: - Selon diverses conditions de concordances d'informations dans le fichier, certains paramètres devaient être changés, le tout en recréant un nouveau fichier.
    Pour BufferBob, en effet, j'étais parti de cette commande... mais, hier je ne sais pas, je ne devais pas être dans mon assiette, mon problème, c'était simplement des erreurs de syntaxe bidon, type simple/double quote, espace... etc... Et forcément plus je m'énervais, moins j'y arrivais.
    Je remercie cependant tout le monde, cela m'a permis d'éclaircir certain points.

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Selon diverses conditions de concordances d'informations dans le fichier, certains paramètres devaient être changés, le tout en recréant un nouveau fichier.
    Ben oui. Tu décris sed ou awk.

    Exemple:
    Fichier de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat /tmp/awkex.txt
    toto 1 vert
    tata 2 violet
    titi 7 bleu
    tutu 123 kawabunga
    Lignes dont le deuxième champ est supérieur à 5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk '($2>5)' /tmp/awkex.txt
    titi 7 bleu
    tutu 123 kawabunga
    Produits dont le champ de couleur commence par un v
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk '($3 ~ /^v/){print $1;}' /tmp/awkex.txt
    toto
    tata
    Tu peux aller loin dans la personnalisation.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin de vos avis sur un algo
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2006, 16h40
  2. j ai besoin de mysql 3 sur windows
    Par dietrich dans le forum Administration
    Réponses: 3
    Dernier message: 09/01/2006, 17h37
  3. besoin d'aide -> requete sur 2 tables avec count()
    Par parksto dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2005, 19h06
  4. Réponses: 6
    Dernier message: 28/02/2005, 14h32
  5. Réponses: 5
    Dernier message: 20/11/2003, 16h36

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