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   -
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


--
L'accès au savoir est la première liberté que chaque homme devrait avoir.

8 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    \|<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
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  4. pcsystemd Messages postés 734 Statut Membre 23
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pcsystemd Messages postés 734 Statut Membre 23
     
    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
  7. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  8. pcsystemd Messages postés 734 Statut Membre 23
     
    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
  9. pcsystemd Messages postés 734 Statut Membre 23
     
    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