Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/09/2011, 13h37   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
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 :
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 :
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.
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 13h51   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Code :
sed '\#^shells = .*/usr/bin/false.*#! {s#^shells = .*#&,/usr/bin/false#}'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 14h08   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
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.
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 14h25   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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 :
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.


Citation:
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 ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 14h57   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
Citation:
Envoyé par zipe31 Voir le message
Code :
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 :
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 :
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 :
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
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 15h11   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Essaie comme ça :

Code :
sed '/shells =.*\/usr\/bin\/false.*/!{s/shells.*/&,\/usr\/bin\/false/}'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 15h21   #7
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
Citation:
Envoyé par zipe31 Voir le message
Essaie comme ça :

Code :
sed '/shells =.*\/usr\/bin\/false.*/!{s/shells.*/&,\/usr\/bin\/false/}'
Ok pour le linux
Code :
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 :
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
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 15h39   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Ok, essayons une autre approche...

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

Code :
1
2
3
/shells =.*\/usr\/bin\/false.*/ !{     
s/shells =.*/&,\/usr\/bin\/false/            
}
Puis appelle-le comme suit :

Code :
sed -f fich.sed login.cfg
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 15h53   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
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 :
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" ?
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 16h10   #10
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Sans grande conviction essaie avec le fichier fich.sed comme suit :

Code :
1
2
3
4
5
/shells =/{
/\/usr\/bin\/false/!{     
    s/shells =.*/&,\/usr\/bin\/false/            
}
}
Citation:
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 16h39   #11
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
Citation:
Envoyé par zipe31 Voir le message
Sans grande conviction essaie avec le fichier fich.sed comme suit :

Code :
1
2
3
4
5
/shells =/{
/\/usr\/bin\/false/!{     
    s/shells =.*/&,\/usr\/bin\/false/            
}
}
A mon grand regret, ça ne fonctionne toujours pas
Code :
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?
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 18h41   #12
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
En dernier recours essaye ça :

Code :
sed '/shells =/{/false/!{s/$/,\/usr\/bin\/false/};}'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 20h22   #13
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Avec Awk :

Code :
1
2
 
awk '{ if ($0 ~ /^shells =/  &&  $0 !~ /\/bin\/false/ ) { $0=$0",/bin/false" } print $0}' fichier.txt
becket est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/09/2011, 09h13   #14
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 09h22   #15
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
Citation:
Envoyé par zipe31 Voir le message
En dernier recours essaye ça :

Code :
sed '/shells =/{/false/!{s/$/,\/usr\/bin\/false/};}'
Désolé de te dire que je me retrouve avec toujours la même erreur:
Code :
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 :
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 :
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 :
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.
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 09h24   #16
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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 :
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à
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 09h29   #17
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 24
Points : 14
Points : 14
Citation:
Envoyé par zipe31 Voir le message
Voir là
Oui, c'est ce que j'ai vu juste après avoir posté...

Thks.
snacksou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h55.


 
 
 
 
Partenaires

Hébergement Web