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 :

Extraire une ligne d'un fichier en bash


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2014
    Messages : 22
    Par défaut Extraire une ligne d'un fichier en bash
    Bonjour,
    je cherche à extraire une ligne d'un fichier et le stocker dans une variable
    voici ou j'en suis pour l'instant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    execution() {
    ligne=1
    chaine=`sed -n $ligne`p` liste.txt`
    echo "$chaine"
    }
    execution
    j'ai bin vérifier qui liste.txt existait bien,mais je recois ceci en retour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed: -e expression n°1, caractère 1: commande manquante
    job: line 16: liste.txt : commande introuvable
    p
    Avez-vous des idées pour résoudre ce problème?
    Merci d'avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    tu confonds ` et '.
    il d'ailleurs préféré d'utiliser $( ) pour les substitutions de commandes.

    mais, pourquoi utiliser sed pour obtenir la première ligne d'un fichier ? c'est un exemple ?
    parce que sinon :fait ça en commande interne.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2014
    Messages : 22
    Par défaut
    Merci pour la réponse rapide,

    en fait j'ai prit l'exemple de la première ligne mais l'objectif était de récupérer n'importe quelle ligne du fichier

    et la correction fonctionne très bien

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cycycysisisi Voir le message
    et la correction fonctionne très bien
    Bonjour

    Quelle correction ? T'as rien montré !!!

    Donc ma version
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    execution() {
        ligne=1
        chaine=`sed -n ${ligne}p liste.txt`
        echo "$chaine"
    }
    Le pb était effectivement d'isoler le nom de la variable du caractère "p" pour éviter que le shell cherche à récupérer la variable "$lignep" inexistante. Il y a d'autres façon pour l'isoler (comme les guillemets) mais les accolades sont là pour ça (et ont en plus d'autres propriétés).

    Et si tu veux utiliser la syntaxe proposée par N_Bah (préférable car plus lisible et offrant plus de souplesse pour en imbriquer plusieurs), alors c'est
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    execution() {
        ligne=1
        chaine=$(sed -n ${ligne}p liste.txt)
        echo "$chaine"
    }
    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]

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2014
    Messages : 22
    Par défaut
    Voici une version fonctionnelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ligne=2
    chaine=`sed -n $ligne'p' liste.txt`
    echo "$chaine"
    et effectivement la solution avec $() est bien plus flexible

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    allez, une solution 100% bash :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    n=1 #par exemple, la première ligne
    mapfile -O 1 -t tableau < fichier #voir `help mapfile'
    echo "${tableau[n]}"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cycycysisisi Voir le message
    Voici une version fonctionnelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ligne=2
    chaine=`sed -n $ligne'p' liste.txt`
    echo "$chaine"
    Fonctionnelle, certes, mais maladroite. Comme je l'ai dit, le rôle premier des accolades est de servir à isoler le nom de la variable du texte qu'on veut y rajouter => ${ligne}p ou ${prix}FF. C'est quand-même dommage, quand on a un outil dédié à un travail, d'utiliser autre chose. C'est comme pour un steak. Même s'il est possible de le manger avec deux fourchette (les dents de la seconde servant à déchiquetter la viande), on te conseillera plutôt d'utiliser un couteau.

    En plus, les accolades ont une autre possibilité: implémenter des actions selon le contenu de la variable
    Exemple: chaine=`sed -n ${ligne:-1}p liste.txt`.
    Si la variable "ligne" n'existe pas, ou si elle est vide, alors l'expression ${ligne:-1} renverra "1" (le texte situé après ":-"). Et donc cela t'affichera la première ligne de ton fichier.

    Autre exemple presque analogue: chaine=`sed -n ${ligne:=1}p liste.txt`.
    Même fonctionnement que dans l'exemple précédent, à cela près que le texte situé après ":=" est, en plus, affecté à la variable si celle-ci est vide ou inexistante. Pratique pour programmer des valeurs par défaut.

    Donc vraiment dommage, alors que tu as un outil tout adapté, de "déchiquetter" ainsi ton script avec ton bricolage de quottes simples...
    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]

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/11/2009, 19h08
  2. Réponses: 1
    Dernier message: 11/01/2009, 11h34
  3. extraire une ligne positionnée dans X fichiers
    Par AlexFred dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2008, 17h42
  4. Extraire Une Ligne Du Fichier
    Par chakcc dans le forum C
    Réponses: 2
    Dernier message: 16/10/2006, 11h45
  5. Extraire des lignes d'un fichier en commande bash
    Par newnew dans le forum Linux
    Réponses: 3
    Dernier message: 27/07/2004, 16h22

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