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 :

Sed:extraction d'une ligne spécifque


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur mécanique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Sed:extraction d'une ligne spécifque
    Bonjour,
    je suis en train de créer un script en bash et j'utilise sed afin de récupérer des informations dans des fichiers et d'insérer ces informations dans d'autres fichiers.

    Mon problème est que je voudrais récupérer la dernière, l'avant-dernière ligne, la troisième ligne en partant de la fin et la quatrième.

    Je sais comment récupérer la dernière ligne, ou les deux dernières lignes mais je ne sais pas comment faire pour récupérer chaque ligne indépendamment sans avoir à connaître le nombre de ligne de mon fichier.

    En somme, je voudrais avoir quelque chose qui me fait ça :
    sed -n '(dernière_ligne-1)p' rcforc #recupère l'avant dernière ligne
    sed -n '(dernière_ligne-2)p' rcforc #recupère la 3e ligne en partant de la fin
    sed -n '(dernière_ligne-3)p' rcforc #recupère la 4e ligne en partant de la fin

    si je peux me permettre d'écrire ceci :s

    exemple:
    mon_fichier:
    1ere ligne
    2e ligne
    3e ligne
    4e ligne
    5e ligne
    6e ligne

    Je voudrais récupérer les lignes 4,5 et 6 dans trois variables différentes sans avoir à connaître le nombre total de lignes dans mon fichier

    Merci beaucoup pour vos réponses

    Badour

  2. #2
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Pour récupérer les dernières lignes d'un fichier tu peux aussi utiliser tail.

    Sinon, tu peux stocker le résultat d'un wc -l dans une variable puis l'utiliser dans ta commande sed.
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur mécanique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    oui j'ai déjà vu que l'on pouvait utiliser tail mais je ne sais pas l'utiliser pour obtenir la quatrième ligne en partant de la fin par exemple.

    J'ai trouvé ça :
    sed -e :a -e '$q;N;6,$D;ba'
    sed '$!N;$!D'
    qui donne respectivement les cinq dernières lignes et les deux dernières lignes sauf que j'aimerais avoir "la" cinquième ligne en partant de la fin par exemple.
    D'ailleurs je ne comprends pas la syntaxe pour les cinq dernières lignes :s

    A mon avis, ce que je cherche ne doit pas être compliqué mais comme je n'y connais rien, c'est pas facile de tout assimiler

  4. #4
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par Badour_ Voir le message
    oui j'ai déjà vu que l'on pouvait utiliser tail mais je ne sais pas l'utiliser pour obtenir la quatrième ligne en partant de la fin par exemple.
    La commande tail donne les lignes en partant de la fin d'un fichier (ou plus généralement d'un flux de texte), et t'as aussi la commande head qui donne les lignes en partant du début.

    Ce que tu veux, c'est la première ligne des 4 dernières lignes du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tail -n 4 fichier | head -n 1

    Une autre commande sympa est cat.
    affiche le fichier en entier.

    Et là, tu dois te dire : "mais qu'est-ce qu'il raconte, ça a rien à voir avec ce que je veux faire !!".

    En fait cat a une soeur, tac. Alors que cat affiche un fichier du début vers la fin, tac affiche le fichier dans l'ordre inverse de cat, donc dans l'ordre inverse du début vers la fin, donc de la fin vers le début

    Soit fichier.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Je suis
    un fichier
    qui va
    se faire
    manger par cat
    puis par tac
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vagabond@ubuntu-box ~ $ cat fichier.txt 
    Je suis
    un fichier
    qui va
    se faire
    manger par cat
    puis par tac
    vagabond@ubuntu-box ~ $ tac fichier.txt 
    puis par tac
    manger par cat
    se faire
    qui va
    un fichier
    Je suis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tac rforc > rforc_inv
    sed -n '(dernière_ligne-1)p' rcforc_inv #recupère l'avant dernière ligne
    sed -n '(dernière_ligne-2)p' rcforc_inv #recupère la 3e ligne en partant de la fin
    sed -n '(dernière_ligne-3)p' rcforc_inv #recupère la 4e ligne en partant de la fin
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Badour_ Voir le message
    oui j'ai déjà vu que l'on pouvait utiliser tail mais je ne sais pas l'utiliser pour obtenir la quatrième ligne en partant de la fin par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tail -n4 fichier |head -n1
    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]

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur mécanique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    J'ai essayé avec tail | head ca marche nickel. De plus, j'ai bien aimé l'astuce avec tac

    Avant je récupérais les quatre dernières lignes dans une seule variable et je récupérais mes valeurs en identifiant les colonnes :s, ça faisait pas très propre.

    Merci beaucoup de vos réponses en tout cas !

    Petite question de dernière minute, dsl ^^
    est-ce que cela fonctionne ?
    a1= tail -n 4 rcforc | head -n 1 | ${valeur:73:7}
    pour obtenir directement ma valeur ?
    pour piper le résultat de head dans le fait de rechercher la chaîne de caractères de longueur 7 après la colonne 73 ?
    Merci encore
    Badour

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Badour_ Voir le message
    Petite question de dernière minute, dsl ^^
    est-ce que cela fonctionne ?
    a1= tail -n 4 rcforc | head -n 1 | ${valeur:73:7}
    pour obtenir directement ma valeur ?
    pour piper le résultat de head dans le fait de rechercher la chaîne de caractères de longueur 7 après la colonne 73 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a1=$(tail -n 4 rcforc | head -n 1 | cut -c73-80)
    Ou bien, en Bourne Shell de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a1=`tail -n 4 rcforc | head -n 1 | cut -c73-80`
    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]

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur mécanique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Exactement ce que je voulais, parfait
    Merci énormément à vous deux !
    bon weekend !
    Badour

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/09/2009, 20h08
  2. Requête d'extraction d'une ligne dans une sélection
    Par FlyByck dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/08/2009, 10h03
  3. [Bash] Extraction d'une ligne
    Par Anorgasmophobie dans le forum Linux
    Réponses: 1
    Dernier message: 03/03/2009, 17h41
  4. Usage de SED: remplacement d'une ligne par une autre
    Par Shub-Niggurath dans le forum Administration système
    Réponses: 1
    Dernier message: 18/09/2008, 20h07
  5. extraction d'une ligne d'un fichier txt
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 19/01/2006, 15h28

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