Modifier un fichier avec AWK, SED etc...

Résolu/Fermé
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 6 oct. 2011 à 14:34
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 10 oct. 2011 à 12:23
Bonjour,

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

A voir également:

8 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 oct. 2011 à 09:32
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/
}
}
'
1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 oct. 2011 à 12:23
\|<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.
1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
6 oct. 2011 à 14:51
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>
$

;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 6/10/2011 à 17:04
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
6 oct. 2011 à 17:09
Donne moi un exemple concret AVANT => APRÈS avec un nom de domaine comme "Servername www.pcsystemd.fr", s'il te plaît, merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 7/10/2011 à 07:38
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
7 oct. 2011 à 14:14
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>
$
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 10/10/2011 à 09:16
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.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
10 oct. 2011 à 11:56
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.
0