Bonjour tout le monde,
Je m'adresse à vous car j'ai un petit problème. je chercher à automatiqer la configuration du fichier httpd.conf d'Apache à travers un script shell.
le but est en effet de pouvoir chercher une ligne particulière dans ce fichier, la modifier et enregistrer les modifications dans le même fichier.
la ligne à rechercher doit être lue à partir d'un fichier texte temp.
je pense aux commandes : awk, grep, sed mais je suis débutante et je vous cache pas je bloque là.
quelqu'un peu m'aider SVP. Merci d'avance et bon courage à tous.
# quelques pistes ...
Posté par totof2000 . Évalué à 2.
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 2.
D'abord, avant toute modification, il te faut sauvegarder le fichier d'origine:
cp ancien_fichier ancien_fichier.sav
Ensuite:
awk ' {
(if $0 ~ "expression_recherchee") {
$0=ligne_modifiee
}
print $0
} ' ancien_fichier >nouveau_fichier.tmp
et enfin:
cp nouveau_fichier.tmp ancien_fichier
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 2.
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
$0= "ligne modifiee"
?
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
mais j'ai une question encore, en effet la chaine à rechercher est à lire à partir d'un fichier. je peux la récupérer par :
head -1 mon_fichier
ma question c'est comment je peux passer le résultat de head a la fonction awk ?
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
awk -v var="ma_chaine" ' { if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
maintenant comment affecter à var la valeur retournée d'une autre commande (head ) au lieu de faire passe la chaine elle même ?
best regards.
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
awk -v var="ma_chaine" ' (NR==1) {if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
Ceci n'executera la substitution que sur la premiere ligne
Sinon il y a head -1 | awk -v ....
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 2.
awk -v var="$(head -1 fichier)" ' (NR==1) {if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
Ca marchera peut-etre.
Sinon (pas teste)
awk ' BEGIN {getline var <fichier} {if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
maitenant il faut que je fait de même pour la chaine de remplacement, elle aussi à lire à partir du fichier temp (2ème ligne), j'ai essayé ceci :
awk -v var="$(head -1 temp)" var2="$(tail -1 temp)" ' { if ($0 ~ var) { $0=var2 } print $0 } ' httpd.conf > httpd.conf.tmp
var2 prend la valeur de la deuxième ligne de mon fichier temp (SSLRequire %{ SSL_CLIENT_M_SERIAL} in {00,11,22} )mais j'ai comme même une erreur :
awk: cmd. line:1: var2=SSLRequire %{ SSL_CLIENT_M_SERIAL} in {00,11,22}
awk: cmd. line:1: ^ parse error
awk: cmd. line:1: var2=SSLRequire %{ SSL_CLIENT_M_SERIAL} in {00,11,22}
awk: cmd. line:1: ^ parse error
est ce que c'est une erreur de syntaxe ?
merci 1000...000 fois pour tous.
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
mettre -v a chaque variable que tu ajoutes.
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
là j'ai écrit:
head -1 temp | awk -v var ' { if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
mais ça ne marche pas, c'est normale car comment je peux indiquer que la valeur de retour de head représente var ??
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
là j'ai écrit:
head -1 temp | awk -v var ' { if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
mais ça ne marche pas, c'est normale car comment je peux indiquer que la valeur de retour de head représente var ??
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
awk -v var="$(head -1 fichier)" ' (NR==1) {if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
marche très bien, je te remercie et je remercie tous les collègues qui m'ont soutenu. Je suis très impressionnée par votre réactivité. Bon courage à tous le monde.
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
awk -v var="$(head -1 temp)" ' { if ($0 ~ var) { $0="toto" } print $0 } ' httpd.conf > httpd.conf.tmp
[^] # Re: quelques pistes ...
Posté par gaaaaaAab . Évalué à 2.
C'est juste dommage que la syntaxe de ton bloc awk soit horrible, mais j'ai déjà écrit ce que j'avais à dire là dessus dans mes commentaires précédents.
Il faut juste que tu te rendes bien compte que ta syntaxe actuelle montre que tu n'as pas bien compris le fonctionnement de awk (ce qui n'est pas une critique en soi).
Si c'est du one shot et que tu ne comptes plus jamais toucher une ligne de commande de ta vie, c'est pas bien grave. Par contre, si tu vas être amener à utiliser régulièrement ce genre d'outil, je t'invite à t'arracher un peu pour comprendre exactement ce que fait ce bout de script. Ca te fera gagner du temps à l'avenir ...
[^] # Re: quelques pistes ...
Posté par gaaaaaAab . Évalué à 2.
head -1 fichier | awk ...
ou head -1 fichier | sed ...
essaie quand même de jeter un oeil au premier tutoriel shell venu (suffit de demander à google), par exemple là : http://marcg.developpez.com/ksh/
Parce que là, c'est une question super basique.
sinon, ton $0= 'toto' est inutile, tu peux directement faire un print 'toto'
en remarque bonus, utilise plus une des solutions proposées en sed. awk s'utilise plutôt quand on veut faire des trucs un peu plus compliquées qu'un simple remplacement.
sed -e 's/<motif>/<remplacement>/' fichier > fichier.tmp
bon allez, mode sympa on. En sed, je ferais un :
head -1 fichier | sed -e 's/ma_chaine/toto/' > fichier.tmp
en awk :
head -1 fichier | awk '$0 ~ "ma_chaine" { print "toto"}' > fichier.tmp
et dans les deux cas, pour finir :
mv fichier.tmp fichier
[^] # Re: quelques pistes ...
Posté par gaaaaaAab . Évalué à 2.
motif=`head temp`
yapuka (c) utiliser la variable motif en lieu et place de ma_chaine dans la ligne de sed (je laisse totof2000 gérer le awk ;) par exemple :
sed -e 's/$motif/toto/' fichier > fichier.tmp
si on veut que ça soit un peu illisible, on peut même tout faire en un coup :-)
sed -e 's/'`head temp`'/toto/' fichier > fichier.tmp
encore une fois, je recomamnde fortement la lecture d'un tutoriel pour t'approprier un peu mieux les possibilités offertes par le shell.
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
voilà mon premier essaie :
sed -e 's/"$(head -1 temp)"/toto/' httpd.conf > httpd.conf.tmp
mais ceci n'a l'air de ne rien faire. alors peux tu m'aider please.
[^] # Re: quelques pistes ...
Posté par rangzen (site web personnel) . Évalué à 1.
sed -i.bak_gt -e '/GraphicalTheme=/s/Human/happygnome-list/' /etc/gdm/gdm.conf
sed -i.bak_uid -e '/MinimalUID=/s/1000/1001/' /etc/gdm/gdm.conf
sed -i.bak_wcm -e '/Welcome=/s/true/false/' /etc/gdm/gdm.conf
[^] # Re: quelques pistes ...
Posté par loukili . Évalué à 1.
[^] # Re: quelques pistes ...
Posté par totof2000 . Évalué à 1.
# sed
Posté par Putifuto . Évalué à 1.
le -i permet de travailler sur le même fichier.
[^] # Re: sed
Posté par totof2000 . Évalué à 1.
[^] # Re: sed
Posté par loukili . Évalué à 1.
sed: invalid option -- i
j'ai essayé avec la syntaxe :
sed -i 's/plop/mega_totoz/' httpd.conf
mais j'ai la même erreur.
merci bcp à tout le monde
[^] # Re: sed
Posté par totof2000 . Évalué à 1.
[^] # Re: sed
Posté par loukili . Évalué à 1.
[^] # Re: sed
Posté par totof2000 . Évalué à 1.
[^] # Re: sed
Posté par totof2000 . Évalué à 1.
AWK="/usr/bin/awk"
[ "$(uname -s)" == "SunOS" ] && AWK="/usr/bin/nawk" puis invocation de la commande par
${awk} -v var="ma variable" .....
[^] # Re: sed
Posté par Putifuto . Évalué à 2.
Je ne suis pas devin, et tu es sur un site GNU/linux, donc sans précision de ta part, par défaut, on utilise les outils gnu.
sinon, pour ton problème, il faut utiliser un fichier temporaire, comme l'a très bien expliqué totof2000
Cordialement,
[^] # Re: sed
Posté par totof2000 . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.