Modifier un fichier avec AWK, SED etc...
Résolu
pcsystemd
Messages postés
734
Statut
Membre
-
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un fichier qui contient tous les virtualhost de mon serveur apache2 comme ci-dessous :
j'ai besoin d'ajouter pour chaque virtualhost les lignes suivantes :
Pour que chacun de mes virtualhost ressemble a ceci :
Serait il possible de faire cela en masse en utilisant AWK,SEd ou autre et si oui comment procéder?
Merci d'avance
--
L'accès au savoir est la première liberté que chaque homme devrait avoir.
J'ai un fichier qui contient tous les virtualhost de mon serveur apache2 comme ci-dessous :
<VirtualHost 0.0.0.0:80>
ServerName www.mondomaine.com
DocumentRoot /home
Alias /images /img
Alias /robots.txt /robots.txt
Alias /favicon.ico /favicon.ico
RedirectMatch ^/st /cgi-bin/awstats.pl?config=mondomaine
ScriptAlias /cgi-bin/ /cgi-bin/
<Directory "/cgi-bin">
AllowOverride None
AuthType Basic
AuthUserFile .access
AuthName "Acc<E8>s restreint"
require user titi 7575 78
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
</Directory>
Alias /awstats-icon /icon
#ErrorLog error.log
CustomLog access.log combined
ProxyPass / http://domaine/toto
ProxyPassReverse / http://domaine/toto
</VirtualHost>
<VirtualHost 0.0.0.0:80>
ServerName www.mondomaine2.com
DocumentRoot /home
Alias /images /img
Alias /robots.txt /robots.txt
Alias /favicon.ico /favicon.ico
RedirectMatch ^/st /cgi-bin/awstats.pl?config=mondomaine2
ScriptAlias /cgi-bin/ /cgi-bin/
<Directory "/cgi-bin">
AllowOverride None
AuthType Basic
AuthUserFile .access
AuthName "Acc<E8>s restreint"
require user tutu 7565 71
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
</Directory>
Alias /awstats-icon /icon
#ErrorLog error.log
CustomLog access.log combined
ProxyPass / http://domaine/tata
ProxyPassReverse / http://domaine/tata
</VirtualHost>
j'ai besoin d'ajouter pour chaque virtualhost les lignes suivantes :
ServerAlias mondomaine.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^mondomaine\.com
RewriteRule ^(.*)$ http://www.mondomaine.com$1 [R=permanent,L]
Pour que chacun de mes virtualhost ressemble a ceci :
<VirtualHost 0.0.0.0:80>
ServerName www.mondomaine2.com
ServerAlias mondomaine.com
DocumentRoot /home
Alias /images /img
Alias /robots.txt /robots.txt
Alias /favicon.ico /favicon.ico
RedirectMatch ^/st /cgi-bin/awstats.pl?config=mondomaine2
ScriptAlias /cgi-bin/ /cgi-bin/
<Directory "/cgi-bin">
AllowOverride None
AuthType Basic
AuthUserFile .access
AuthName "Acc<E8>s restreint"
require user tutu 7565 71
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
</Directory>
Alias /awstats-icon /icon
RewriteEngine On
RewriteCond %{HTTP_HOST} ^mondomaine\.com
RewriteRule ^(.*)$ http://www.mondomaine.com$1 [R=permanent,L
#ErrorLog error.log
CustomLog access.log combined
ProxyPass / http://domaine/tata
ProxyPassReverse / http://domaine/tata
</VirtualHost>
Serait il possible de faire cela en masse en utilisant AWK,SEd ou autre et si oui comment procéder?
Merci d'avance
--
L'accès au savoir est la première liberté que chaque homme devrait avoir.
8 réponses
-
Effectivement il y avait quelques caractères non-imprimables (une tab en plus et un espace en moins) dans ton fichier.
Ceci devrait aller mieux :
sed '\|<VirtualHost|,\|</VirtualHost>|{ /ServerName/{ h s/.* www\.// x G s/\n/&\tServerAlias / } /^\t$/{ s//&\n\tRewriteEngine On\n\tRewriteCond %{HTTP_HOST} ^/ G s/\^\n/^/ s/$/\n\tRewriteRule ^(.*)$ http:\/\/www./ G s/\.\n/./ s/\.\(.\{2,3\}\) *$/\\.\1\$1 [R=permanent,L\n/ } } ' -
\|<VirtualHost|,\|</VirtualHost>|{
On définit une plage d'adresses sur laquelle seront appliquée les commandes qui sont entre les accolades
/ServerName/{
Si la ligne contient le motif on applique les commandes entre accolades
h
On copie le contenu de la mémoire principale dans la mémoire annexe en écrasant son contenu. La mémoire principale contient toujours le motif
s/.* www\.//
On supprime de la mémoire principale le début du motif afin de ne garder que le nom de domaine
x
On échange le contenu des 2 mémoires, de ce fait la mémoire annexe contient désormais le nom de domaine
G
On ajoute au contenu de la mémoire principale le contenu de la mémoire annexe.
Le contenu ressemble à "\tServerName www.pcsystemd.com\npcsystemd.com"
s/\n/&\tServerAlias /
Donc on substitue le saut de ligne (\n) par lui même (&) suivi d'une tabulation (\t) et de "ServerAlias "
}
Fin des commandes concernant le motif "/ServerName/"
/^\t$/{
Si une ligne correspond au motif
s//&\n\tRewriteEngine On\n\tRewriteCond %{HTTP_HOST} ^/
On la substitue par elle même (&) en rajoutant ce qu'il faut derrière.
Ici on ne reprends pas le motif dans la commande de substitution vu qu'il correspond au motif recherché. On se contente de mettre '//' qui indique qu'on veut utiliser le même motif que précédemment.
G
On ajoute à nouveau le contenu de la mémoire annexe qui contient toujours le nom de domaine
s/\^\n/^/
On supprime le saut de ligne généré par l'ajout.
s/$/\n\tRewriteRule ^(.*)$ http:\/\/www./
On rajoute en fin de ligne ($) ce qu'on veut inscrire
G
On ajoute à nouveau le contenu de la mémoire annexe
s/\.\n/./
On supprime à nouveau le retour à la ligne tout en conservant le point de "www."
s/\.\(.\{2,3\}\) *$/\\.\1\$1 [R=permanent,L\n/
Ici on substitue le "." de ton domaine suivi de 2 ou 3 caractères (comme .com ou .fr) par lui même mais protégé (\\.) et on y ajoute le texte désiré.
}
Fin des commandes concernant le motif "/^\t$/
}
Fin des commandes concernant l'adressage. -
Salut,
$ sed '\|<VirtualHost|,\|</VirtualHost>|{ /ServerName/{a\ \tServerAlias mondomaine.com } /^$/{a\ \tRewriteEngine On\ \tRewriteCond %{HTTP_HOST} ^mondomaine.com\ \tRewriteRule ^(.*)$ http://www.mondomaine\\.com$1 [R=permanent,L\ } } ' plop <VirtualHost 0.0.0.0:80> ServerName www.mondomaine.com ServerAlias mondomaine.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=mondomaine ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user titi 7575 78 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon RewriteEngine On RewriteCond %{HTTP_HOST} ^mondomaine.com RewriteRule ^(.*)$ http://www.mondomaine\.com$1 [R=permanent,L #ErrorLog error.log CustomLog access.log combined ProxyPass / http://domaine/toto ProxyPassReverse / http://domaine/toto </VirtualHost> <VirtualHost 0.0.0.0:80> ServerName www.mondomaine2.com ServerAlias mondomaine.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=mondomaine2 ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user tutu 7565 71 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon RewriteEngine On RewriteCond %{HTTP_HOST} ^mondomaine.com RewriteRule ^(.*)$ http://www.mondomaine\.com$1 [R=permanent,L #ErrorLog error.log CustomLog access.log combined ProxyPass / http://domaine/tata ProxyPassReverse / http://domaine/tata </VirtualHost> $
;-))
-
Merci zipe mais ce n'est pas bon puisque chaque virtualhost a un nom de domaine différent donc un ServerName diffèrent la est la difficulté si non bien sur ce serait simple. Dans mon exemple j'ai mondomaine.com et mondomaine2.com et ainsi de suite.. La difficulté c'est de pouvoir récupérer chaque valeur présente dans ServerName sans les www.
L'accès au savoir est la première liberté que chaque homme devrait avoir. -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Premier exemple :
Avant :<VirtualHost 0.0.0.0:80> ServerName www.pcsystemd.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=mondomaine ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user titi 7575 78 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon #ErrorLog error.log CustomLog access.log combined ProxyPass / http://pcsystemd/toto ProxyPassReverse / http://pcsystemd/toto </VirtualHost>
Après :<VirtualHost 0.0.0.0:80> ServerName www.pcsystemd.com ServerAlias pcsystemd.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=pcsystemd ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user tutu 7565 71 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon RewriteEngine On RewriteCond %{HTTP_HOST} ^pcsystemd.com RewriteRule ^(.*)$ http://www.pcsystemd\.com$1 [R=permanent,L #ErrorLog error.log CustomLog access.log combined ProxyPass / http://pcsystemd/tata ProxyPassReverse / http://pcsystemd/tata </VirtualHost>
Second exemple :
Avant :<VirtualHost 0.0.0.0:80> ServerName www.avenger.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=avenger ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user tiuy 4575 78 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon #ErrorLog error.log CustomLog access.log combined ProxyPass / http://avenger/totio ProxyPassReverse / http://avenger/totio </VirtualHost>
Après:<VirtualHost 0.0.0.0:80> ServerName www.avenger.com ServerAlias avenger.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=avenger ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user tiuy 4575 78 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon RewriteEngine On RewriteCond %{HTTP_HOST} ^avenger.com RewriteRule ^(.*)$ http://www.avenger\.com$1 [R=permanent,L #ErrorLog error.log CustomLog access.log combined ProxyPass / http://avenger/totio ProxyPassReverse / http://avenger/totio </VirtualHost>
Etc...
Merci
L'accès au savoir est la première liberté que chaque homme devrait avoir. -
En partant sur un fichier contenant tes 2 exemples ;-))
$ sed '\|<VirtualHost|,\|</VirtualHost>|{ /ServerName/{ h s/.* www\.// x G s/\n/&\tServerAlias / } /^$/{ s//&\n\tRewriteEngine On\n\tRewriteCond %{HTTP_HOST} ^/ G s/\^\n/^/ s/$/\n\tRewriteRule ^(.*)$ http:\/\/www./ G s/\.\n/./ s/\.\(.\{2,3\}\) *$/\\.\1\$1 [R=permanent,L\n/ } } ' plop <VirtualHost 0.0.0.0:80> ServerName www.pcsystemd.com ServerAlias pcsystemd.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=mondomaine ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user titi 7575 78 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon RewriteEngine On RewriteCond %{HTTP_HOST} ^pcsystemd.com RewriteRule ^(.*)$ http://www.pcsystemd\.com$1 [R=permanent,L #ErrorLog error.log CustomLog access.log combined ProxyPass / http://pcsystemd/toto ProxyPassReverse / http://pcsystemd/toto </VirtualHost> <VirtualHost 0.0.0.0:80> ServerName www.avenger.com ServerAlias avenger.com DocumentRoot /home Alias /images /img Alias /robots.txt /robots.txt Alias /favicon.ico /favicon.ico RedirectMatch ^/st /cgi-bin/awstats.pl?config=avenger ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Acc<E8>s restreint" require user tiuy 4575 78 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch </Directory> Alias /awstats-icon /icon RewriteEngine On RewriteCond %{HTTP_HOST} ^avenger.com RewriteRule ^(.*)$ http://www.avenger\.com$1 [R=permanent,L #ErrorLog error.log CustomLog access.log combined ProxyPass / http://avenger/totio ProxyPassReverse / http://avenger/totio </VirtualHost> $ -
Bonjour zipe31 et merci. Je suis désolé mais cela ne fonctionne pas mais je penses que c'est m'on entiére faute car tu as adapté je penses ton script sed au nombre de lignes qui sont présentes dans mes virtualhosts hors mes virtualhosts ont plus de lignes par défaut donc je te donne deux exemples qui sont complets cette fois.
Pourrais tu adapter ton script SED au deux virtualhosts suivants?
Merci encore
<VirtualHost 0.0.0.0:80> ServerName www.pcsystemd.com DocumentRoot /home Alias /images /img Alias /robots.txt /robot.txt Alias /favicon.ico /favicon1.ico Alias /googlebac4cfb1.html /html/googlebac4c692fb1.html RedirectMatch ^/stats /awstats.pl?config=pcsystemd ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/lib/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Accès restreint" require user 785 6985 jk546 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch ##Order allow,deny ##Allow from 0.0.0.0 </Directory> Alias /awstats-icon /icon #ErrorLog error.log CustomLog access.log combined ProxyPass / http://domaine/ ProxyPassReverse / http://domaine/ </VirtualHost> <VirtualHost 0.0.0.0:80> ServerName www.avenger.com DocumentRoot /home Alias /images /img Alias /robots.txt /robot.txt Alias /favicon.ico /favicon1.ico Alias /googlebac4c6ffb1.html /html/googlebac92fb1.html RedirectMatch ^/stats awstats.pl?config=avenger ScriptAlias /cgi-bin/ /cgi-bin/ <Directory "/cgi-bin"> AllowOverride None AuthType Basic AuthUserFile .access AuthName "Accès restreint" require user 6589 854 lm96 Options ExecCGI -MultiViews +SymLinksIfOwnerMatch #Order allow,deny #Allow from 0.0.0.0 </Directory> Alias /awstats-icon /icon #ErrorLog error.log CustomLog access.log combined ProxyPass / http://d0maine/ ProxyPassReverse / http://domaine/ </VirtualHost>
L'accès au savoir est la première liberté que chaque homme devrait avoir. -
Merci énormément zipe31 cela fonctionne.
Il ne me reste plus qu'a aller pour au moins la 150émé fois relire le tuto de jipicy sur SED afin de comprendre ce script car certains paramètres et options m'échappent et j'ai du mal a sasisir tous le script.