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 :

Scripts : Extraire une ligne


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Scripts : Extraire une ligne
    Salut !!

    Je suis en train de faire un script pour mon firewall. Je voudrai extraire une ligne d'un fichier. Existe-t-il une commande pour faire ceci ?

    Pour l'instant je fai un : # head -$i /etc/hosts | tail -1 ou 'i' est le numero de ma ligne. C'est pas tres propre et en plus je suis obligé de connaitre la longueur du fichier pour utiliser cette methode.

    L'ideal serai d'avoir une commade du type : commande numero_ligne. Et lorsque la ligne demandée est superieure, cette commande retourne est chaine nulle.

    Un peu d'aide svp, je debute dans l'art of script

  2. #2
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    Il y a de nombreuses facons. Mais la plus utilisé est la suivante (elle ne fonctionne pas sous csh, tcsh) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #! /bin/sh
     
    IFS="
    "
    for ligne in `cat fichier` ; do
       echo $ligne "###"
    done
    Attention, il faudra jongler en changeant les valeurs de IFS. Car l'operateur backquote ne fonctionnera plus de la meme facon.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut scripts
    Salut Nyal,

    Je n'ai juste pas compris a quoi sert la variable :
    IFS="
    "

    Ca a l'air d'etre un delimiteur pour le for ?

    Voila Merci

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Scripts
    J'ai encore une petite question.
    Comment faire simplement une boucle pour i de 0 à 3 par exemple ?
    Autrement que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0; while [ $i -lt 4 ]; do
       echo $i;
       let $[i=$i+1];
    done
    Cette methode etant assez lourde.
    Merci encore pour vos reponse.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut
    Le IFS definit le caractere qui sera reconnu comme separateur de champ.
    Par exemple le caractere "espace", ou ":" ou "/" etc.

    Pour faire une boucle de 0 a 3 tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for i in 0 1 2 3 
    do
    ...
    ...
    ...
    done
    L'inconvenient c'est que tu ne peux pas faire ça pour de grands nombres...

    Ensuite pour ta premiere question, tu veux extraire une ligne selon quel critère ? sa position, son contenu, ... ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Scripts
    C'est un peu compliqué à expliquer. Je vous laisse le morceau de code que j'ai pondu. Le resultat final est un tableau Hosts[i]=Nom|IP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    Nhosts=0
    for ligne in `cat /etc/hosts\
                | sed '/^[0-9][0-9]\?[0-9]\?\.[0-9][0-9]\?[0-9]\?\.[0-9][0-9]\?[0-9]\?\.[0-9][0-9]\?[0-9]\?       .*      .*$/!d'\
                | sed '/127.0.0.1/d'` ; do
        Hosts[$Nhosts]=`echo $ligne | cut -f3`\|`echo $ligne | cut -f1`
        let $[Nhosts=Nhosts+1]
    done
    Vous pouvez me laisser des conseils sur des ameliorations à apporter sur ce code si vous le voulez. Merci @ tous.

  7. #7
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Je regarde le script et je le trouve un peu compliqué.
    Ca serait plus simple comme cela (en utilisant IFS) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/bin/bash
     
    IFS="
    "
    Nhosts=0
    for ligne in `cat /etc/hosts` ; do
        Hosts[$Nhosts]=`echo $ligne | awk '$1 ~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ { print $1 "|" $2}'`
        echo ${Hosts[$Nhosts]}
        let $[Nhosts=Nhosts+1]
    done

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut scriptographie ;)
    Salut !

    En effet c'est plus clair, je vais me mettre à "awk".
    Merci pour vos reponses.
    @++

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

Discussions similaires

  1. [MySQL] Extraire une ligne de la bdd
    Par bassiste dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 26/06/2008, 16h43
  2. extraire une ligne positionnée dans X fichiers
    Par AlexFred dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2008, 18h42
  3. [GD] Erreur 500 avec script d'une ligne
    Par keul dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 24/09/2007, 11h50
  4. Extraire Une Ligne Du Fichier
    Par chakcc dans le forum C
    Réponses: 2
    Dernier message: 16/10/2006, 12h45
  5. [RegEx] [Script]Extraire une url
    Par Hell dans le forum Langage
    Réponses: 9
    Dernier message: 17/10/2004, 16h11

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