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 :

Fichiers ou variables (BASH) ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut Fichiers ou variables (BASH) ?
    Bonjour,

    Mon problème est très basique. J'ai un fichier texte structuré en lignes que je veux modifier: supprimer certaines lignes, en ajouter d'autres.

    Vaut-il mieux rester avec les fichiers et leurs commandes (cat, sed, awk, >, ...) pour les transformations intermédiaires ou utiliser une variable contenant le fichier? Dans ce cas comment faire: contenuFichier = $contenuFichier + $nouvelleLigne (équivalent de >>) ?

    Merci d'avances pour vos indices et commentaires.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tout dépand de ce que tu veux vraiment faire

    personnellement je serai partisant de faire une seule et unique commande sed pour traiter l'enssemble.


    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sed '1i\
    toto
    45i\
    tutu
    23,27 d
    80,85 %s/TUTU/TITI/g
    w fichiermodifier' fichier_origine
    par exemple ajoute la ligne toto au debut du fichier
    insert une ligne 45 avec tutu puis supprime les lignes 23 à 27
    et remplace TUTU par TITI entre les lignes 80 et 85
    et enregistre le fichier modifie sous le nom fichiermodifier

    ce qui permet de garder une copie de l'ancien fichier en cas de besoin.

  3. #3
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Effectivement, ça paraît concis. Mon travail est en fait de récupérer les users d'une base de données Oracle puis de retirer certains users interdits (s'ils existent) et d'en ajouter d'autres (et écraser s'ils existent déjà). Tout ça pour créer un fichier password.

    J'ai bien le fichier brut extrait d'Oracle, mais le traitement suivant est actuellement lent et peu maintenable. Sans doute devrais-je m'orienter vers sed...

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    sed est effectivement pratique pour traiter du texte donc si ton fichier plat est généré par une commande sql ou par une export c'est l'idéal pour les perfs.

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    J'ai écrit un petit script Bash pour tester sed. Il s'agit de modifier le fichier liste.txt en lui retirant les lignes commençant par les clés contenues dans retir.txt et en ajoutant (et éventuellement écrasant) les lignes contenues dans ajout.txt. Quelqu'un peut-il me dire ce qui ne va pas dans les deux sed et si l'écriture peut être améliorée? Voici les fichiers texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat liste.txt
    poule 1
    canard 2
    dindon 3
    $ cat retir.txt
    dindon
    autruche
    $ cat ajout.txt
    poule 11
    oie 12
    Et voici mon script (34 lignes):
    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
    28
    29
    30
    31
    32
    #!/bin/bash
    
    # initialise
    liste="liste.txt"
    retir="retir.txt"
    ajout="ajout.txt"
    avant=$(mktemp /tmp/avant.XXX)
    cat $liste > $avant
    apres=$(mktemp /tmp/apres.XXX)
    
    # retire $retir de $liste
    for ligneRetir in $(cat $retir)
    do
        sed -e '/^'$ligneRetir'/d' $avant > $apres
        mv $apres $avant
    done
    
    # ajoute $ajout à $liste
    while read ligneAjout
    do
        cle=${ligneAjout%% *}
        if grep $cle $avant > /dev/null
        then
            sed -e '/'$cle'/ c'\ $ligneAjout $avant > $apres
        else
            sed -e '1 i'\ $ligneAjout $avant > $apres
        fi
        mv $apres $avant
    done < $ajout
    
    # sauve et nettoie
    mv $avant $liste
    Merci d'avance pour vos commentaires.

  6. #6
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    J'ai trouvé le code correct pour les deux sed (il manquait des doubles guillemets).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sed -e '/'$cle'/ c\'"$ligneAjout" $avant > $apres
    sed -e '1 i\'"$ligneAjout" $avant > $apres
    Le fait d'avoir écrit ici m'a obligé à détailler le code et c'est ainsi que j'ai finalement trouvé une solution. Peut-on améliorer ce bout de code, et spécialement supprimer des boucles? Par exemple tout mettre dans un seul sed (et donc faire un seul passage). Auriez-vous fait autrement? Merci de vos commentaires.

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

Discussions similaires

  1. [bash] Mettre le contenu d'un fichier dans une variable
    Par tipié dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 25/04/2024, 21h27
  2. Variable fichier pour script bash
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 23/04/2008, 14h10
  3. Réponses: 2
    Dernier message: 16/12/2004, 15h33
  4. Extraire des lignes d'un fichier en commande bash
    Par newnew dans le forum Linux
    Réponses: 3
    Dernier message: 27/07/2004, 16h22
  5. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 15h21

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