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

  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/}'

  7. #7
    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
    Essaie comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/shells =.*\/usr\/bin\/false.*/!{s/shells.*/&,\/usr\/bin\/false/}'
    Ok pour le linux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [tempo]# sed '/shells =.*\/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,/usr/bin/false
            maxlogins = 128
            logintimeout = 60
    pour l'aix, je sens qu'on y est presque.... enfin du moins le message est différent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # sed '/shells =.*\/usr\/bin\/false.*/!{s/shells.*/&,\/usr\/bin\/false/}' login.cfg
    sed: 0602-404 Function /shells =.*\/usr\/bin\/false.*/!{s/shells.*/&,\/usr\/bin\/false/} cannot be parsed.
    Y'a pas à dire, les parsers, c'est vraiment un monde à part

  8. #8
    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
    Ok, essayons une autre approche...

    Crée un fichier (fich.sed) avec le contenu suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /shells =.*\/usr\/bin\/false.*/ !{     
    s/shells =.*/&,\/usr\/bin\/false/            
    }
    Puis appelle-le comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -f fich.sed login.cfg

  9. #9
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 24
    Par défaut
    Malheureusement, je me retrouve avec la même erreur que tout à l'heure, à la différence près que l'erreur à l'air de se situer sur la 1ère moitié de la 1ère ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # sed -f fich.sed login.cfg
    sed: 0602-404 Function s/shells =.*/&,\/usr\/bin\/false/  cannot be parsed.
    [root@dfbnee02 - /tmp/foo]
    # cat fich.sed
    /shells =.*\/usr\/bin\/false.*/ !{
    s/shells =.*/&,\/usr\/bin\/false/
    }
    Comment se fait-il que les deux versions de sed soient si différentes? Ce n'est pas censé être du "standard" ?

  10. #10
    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
    Sans grande conviction essaie avec le fichier fich.sed comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /shells =/{
    /\/usr\/bin\/false/!{     
        s/shells =.*/&,\/usr\/bin\/false/            
    }
    }
    Comment se fait-il que les deux versions de sed soient si différentes? Ce n'est pas censé être du "standard" ?
    Sur GNU/Linux c'est une version GNU-sed, sur les Unix c'est bien souvent des versions différentes et bien moins souples

  11. #11
    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
    Sans grande conviction essaie avec le fichier fich.sed comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /shells =/{
    /\/usr\/bin\/false/!{     
        s/shells =.*/&,\/usr\/bin\/false/            
    }
    }
    A mon grand regret, ça ne fonctionne toujours pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # sed -f fich.sed login.cfg
    sed: 0602-404 Function     s/shells =.*/&,\/usr\/bin\/false/             cannot be parsed.
    Citation Envoyé par zipe31 Voir le message
    Sur GNU/Linux c'est une version GNU-sed, sur les Unix c'est bien souvent des versions différentes et bien moins souples
    c'est vraiment rageant. En tant qu'admin unix je vois les différences de commandes au niveau système mais je pensais que les outils "basiques" fonctionnaient de la même manière qu'importe l'OS.... Dommage.

    Te restes-t-il encore une solution dans ton chapeau ou...? Le cas échéant, vers quoi je devrais me pencher à ton avis?

  12. #12
    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
    En dernier recours essaye ça :

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

  13. #13
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Avec Awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '{ if ($0 ~ /^shells =/  &&  $0 !~ /\/bin\/false/ ) { $0=$0",/bin/false" } print $0}' fichier.txt

  14. #14
    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,

    $0 ~ /^shells =/ à transformer en $0 ~ /shells =/ ou $0 ~ /\tshells =/ dans la mesure où comme mentionné plus haut, l'expression ne se trouve pas en début de ligne

  15. #15
    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
    En dernier recours essaye ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/shells =/{/false/!{s/$/,\/usr\/bin\/false/};}'
    Désolé de te dire que je me retrouve avec toujours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # sed '/shells =/{/false/!{s/$/,\/usr\/bin\/false/};}' login.cfg
    sed: 0602-404 Function /shells =/{/false/!{s/$/,\/usr\/bin\/false/};} cannot be parsed.
    Tu me diras, le plus désolé, c'est moi vu que ça ne fonctionne pas mais bon... En tout cas, merci beaucoup pour toutes les solutions que tu m'as proposé


    Citation Envoyé par becket
    Avec Awk;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{ if ($0 ~ /^shells =/  &&  $0 !~ /\/bin\/false/ ) { $0=$0",/bin/false" } print $0}' fichier.txt
    Bonjour becket,

    je t'avouerais qu'à un moment, j'y ai cru. Malheureusement, l'ajout ne se fait pas en fin de ligne (sous linux ou aix:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [tempo]# awk '{ if ($0 ~ /^shells =/  &&  $0 !~ /\/bin\/false/ ) { $0=$0",/bin/false" } print $0}' 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
    Peut-être une petite erreur dans la syntaxe ?


    EDIT: ah bah oui en fait, c'était tout simplement la première condition. Il fallait que ça commence par et non l'inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [tempo]# cat 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]# awk '{ if ($0 ~ /shells =/  &&  $0 !~ /\usr\/bin\/false/ ) { $0=$0",/usr//bin/false" } print $0}' 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,/usr//bin/false
            maxlogins = 128
            logintimeout = 60
    C'est résolu messieurs!!!

    Merci beaucoup pour votre aide.

    Cordialement.

  16. #16
    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
    Bonjour becket,

    je t'avouerais qu'à un moment, j'y ai cru. Malheureusement, l'ajout ne se fait pas en fin de ligne (sous linux ou aix:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [tempo]# awk '{ if ($0 ~ /^shells =/  &&  $0 !~ /\/bin\/false/ ) { $0=$0",/bin/false" } print $0}' 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
    Peut-être une petite erreur dans la syntaxe ?
    Voir là

  17. #17
    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
    Voir là
    Oui, c'est ce que j'ai vu juste après avoir posté...

    Thks.

+ 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, 23h03
  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, 14h06
  3. [sed] Nettoyage d'un filler en fin de ligne
    Par muad dans le forum Linux
    Réponses: 4
    Dernier message: 01/11/2007, 14h17
  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, 16h54

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