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 :

AWK - Sed: ajout d'une chaîne en fin de ligne


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 24
    Par défaut AWK - Sed: ajout d'une chaîne en fin de ligne
    Bonjour,,

    voilà quelques jours que j'essaye d'ajouter une chaîne de caractères en fin de ligne, si et seulement si celle-ci ne la contient pas. C'est à appliquer plus précisément sur le fichier /etc/security/login.cfg.
    Voilà la fin de fichiers original:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    shells = /bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/usr/bin/sh,/usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh
    ...
    et voici à quoi elle doit ressembler après traitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    shells = /bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/usr/bin/sh,/usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh,/usr/bin/false
    ...
    Bien évidemment, c'est à ajouter seulement si "/usr/bin/false" n'est pas déjà présent.

    Est-ce que quelqu'un aurait une petite idée? Peu importe que ce soit avec awk, sed ou même pearl...

    Si une âme généreuse avait la solution miracle, je l'en remercie d'avance

    Cordialement.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '\#^shells = .*/usr/bin/false.*#! {s#^shells = .*#&,/usr/bin/false#}'

  3. #3
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 24
    Par défaut
    Salut,

    merci pour ta réponse rapide. J'ai cependant deux petits problèmes:

    - le premier c'est que la ligne en question commence par une tabulation (\t). A quel endroit faut-il modifier ta commande sed ?

    - deuxièmement, je viens de me rendre compte que je ne suis pas sur un linux, mais sur un aix, et visiblement la syntaxe n'est pas reconnue alors que sur un linux oui. Il me retourne un "sed: 0602........ is not a recognized function".

    Y'a-t-il un moyen de contourner le problème ?

    Cordialement.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par snacksou Voir le message
    - le premier c'est que la ligne en question commence par une tabulation (\t). A quel endroit faut-il modifier ta commande sed ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '\#\tshells = .*/usr/bin/false.*#!{....}'
    Après si la ligne "shells =" est la seule dans le fichier, tu peux te passer de matcher le fait que ça commence par une tabulation.


    Il me retourne un "sed: 0602........ is not a recognized function".
    Le message d'erreur n'est-il pas plus explicite que ça ? Notamment concernant la fonction non reconnue ?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 24
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '\#\tshells = .*/usr/bin/false.*#!{....}'
    Après si la ligne "shells =" est la seule dans le fichier, tu peux te passer de matcher le fait que ça commence par une tabulation.
    C'est effectivement la seule ligne commençant par "shells =" mais même avec la modification, l'ajout de se fait pas (fait sur le linux):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [tempo]# sed '\#\tshells = .*/usr/bin/false.*#! {s#^shells = .*#&,/usr/bin/false#}' login.cfg
    usw:
            shells = /bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/usr/bin/sh,/usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh
            maxlogins = 128
            logintimeout = 60
     
    [tempo]# cat login.cfg | sed '\#\tshells = .*/usr/bin/false.*#! {s#^shells = .*#&,/usr/bin/false#}'
    usw:
            shells = /bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/usr/bin/sh,/usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh
            maxlogins = 128
            logintimeout = 60


    Citation Envoyé par zipe31 Voir le message
    Le message d'erreur n'est-il pas plus explicite que ça ? Notamment concernant la fonction non reconnue ?
    Le message exact retourné en ksh est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # sed '\#\tshells = .*/usr/bin/false.*#! {s#^shells = .*#&,/usr/bin/false#}' login.cfg
    sed: 0602-403 \#\tshells = .*/usr/bin/false.*#! {s#^shells = .*#&,/usr/bin/false#} is not a recognized function.
    et le message d'erreur retourné en nsh:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    % sed '\#\tshells = .*/usr/bin/false.*#! {s#^shells = .*#&,/usr/bin/false#}' login.cfg
    sed: 1: "\#\tshells = .*/usr/bin ...: bad flag in substitute command: '}'
    merci

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Essaie comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/shells =.*\/usr\/bin\/false.*/!{s/shells.*/&,\/usr\/bin\/false/}'

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

Discussions similaires

  1. [awk] Ajout d'une chaine à la fin de chaque ligne
    Par virus321 dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 23/03/2014, 22h03
  2. rajouter une virgule à chaque fin de ligne d'un .txt
    Par mozzlo dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 02/12/2009, 13h06
  3. [sed] Nettoyage d'un filler en fin de ligne
    Par muad dans le forum Linux
    Réponses: 4
    Dernier message: 01/11/2007, 13h17
  4. Procédure SQL : Ajout d'une chaîne à une autre
    Par Yakaldir dans le forum DB2
    Réponses: 5
    Dernier message: 10/03/2007, 15h54

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