IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[SHELL] suppression de bloc de lignes dans un fichier


Sujet :

Linux

  1. #1
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut [SHELL] suppression de bloc de lignes dans un fichier
    Salut,
    je cherche le moyen de supprimer des lignes dans un fichier, en fait je voudrais supprimer un virtualhost apache avec un simple script shell mais apparemment je n'y arrive pas.

    Le fichier des virtualhost apache rassemble plusieurs virtualhost en commençant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <VirtualHost *:80>
    ServerName   toto.domaine.com
    ServerAdmin  webmaster@domain.com
    DocumentRoot /var/www/vhosts/pseudo
    [...]
    CustomLog /var/log/apache2/toto-access.log combined
    LogLevel warn
    ErrorLog /var/log/apache2/toto-error.log
    [...]
    </VirtualHost>
    Je voudrais simplement lancer un script qui efface le virtualhost qui correspond au pseudo que j'ai indiqué en variable $USER
    donc si j'indique dans le script le pseudo toto et bien il me supprime le virtualhost qui correspond à toto.domain.com

    Est-ce que c'est possible ? et si oui quelles sont les commandes à utiliser.
    merci de votre aide.

  2. #2
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Oui, c'est possible. Avec sed, par exemple.

    Tu veux qu'il supprime tout le bloc (de <VirtualHost> à </VirtualHost>), quand le pseudo correspond ; c'est bien ça ?

    Autre question avant que j'essaie de t'aider : possèdes-tu GNU sed ?

    Ah, et puis aussi : est-ce que le nombre de lignes entre les 2 balises est fixe ? (dans ce cas, utilise grep)

  3. #3
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    Tu veux qu'il supprime tout le bloc (de <VirtualHost> à </VirtualHost>), quand le pseudo correspond ; c'est bien ça ?
    tout à fait

    possèdes-tu GNU sed ?
    oui je suis sous GNU/linux et je possède sed

    est-ce que le nombre de lignes entre les 2 balises est fixe ?
    oui

    Avec grep comment ferais-tu ça ?

    J'ai peut-être une idée pour commencer ça serait de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo "Quel virtualhost voulez-vous supprimer (donnez le pseudo) :"
    read USER
     
    DEL=`cat /usr/local/apache/conf/virtualhost.conf | grep $USER`
    if [ "$USER" = $USER ]
    [...]
    Voici une partie du script que j'exécute pour l'ajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    cat >> /usr/local/apache/conf/virtualhost.conf <<EOF
    <VirtualHost *:80>
        ServerName toto.domain.com
        ServerAdmin webmaster@domain.com
     
        SuexecUserGroup toto toto
     
    #<IfModule mod_cband.c>
    #    CBandRemoteSpeed 20kb/s 3 3
    #    CBandExceededURL http://www.domain.com/traffic_exceeded.html
    #</IfModule>
        
        DocumentRoot /var/www/clients/toto/
    		<Directory /var/www/clients/toto>
    			DirectoryIndex index.php index.html index.htm
    			Options -Indexes Includes FollowSymLinks MultiViews
    			AllowOverride None
    			Action php-fastcgi /toto/php-fcgi
    			Addhandler php-fastcgi .php .php3 .php4
    			AddType application/x-httpd-php .php .phtml
    			AddType application/x-httpd-php-source .phps
    		</Directory>
     
    		<Directory /var/www/clients/toto/musique>
    			<FilesMatch "\.(rar|zip|7z|tar|001|xtm|gz|bz2|avi|wmv|wma|mpg|mpeg|php|html|htm|sh|phtml|php3|php4)$">
    				Order allow,deny
    				Deny from all
    			</FilesMatch>
    		</Directory>
     
        ErrorLog logs/toto.domain.com-error_log
    #    CustomLog logs/toto.domain.com-access_log combined
        CustomLog "|/usr/sbin/cronolog /usr/local/apache/logs/%Y/%m/toto.domain.com-access.%d.log" combined
     
        ScriptAlias /toto/ /var/www/wrapper/toto/
    		<Directory /var/www/wrapper/toto>
    			Options -Indexes +ExecCGI +FollowSymLinks
    			SetHandler cgi-script
    			AllowOverride None
    			Order allow,deny
    			Allow from all
    		</Directory>
    </VirtualHost>
    EOF

  4. #4
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Je pensais faire ça (s'il y a un nombre de lignes fixes, ici 10) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -B1 -A8 toto.domaine.com file
    Mais ça renvoie l'inverse : ça n'affiche que les blocs où il y a toto. Et l'option -v (pour inverser) n'est pas efficace pour ce problème.

    Tant pis. Solution avec sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/<VirtualHost/{:a; N; /<\/VirtualHost/\!ba; /'$USER'\.domaine.com/d }' myfile
    Si tu as besoins d'explications, je peux détailler.

  5. #5
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    merci

    ben en fait je voudrais l'explication de la commande que tu fais avec sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/<VirtualHost/{:a; N; /<\/VirtualHost/\!ba; /'$USER'\.domaine.com/d }' myfile
    J'ai regarder le man de sed et le -i correspond à "edit files in place (makes backup if extension supplied)" ??

  6. #6
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Oui.

    sed sans option affiche le résultat sur stdout.
    sed -i modifie le fichier.
    sed -i.bak modifie le fichier et crée un backup (ce backup aura pour extension .bak).

    Lorsque le script trouve la ligne avec <VirtualHost, il charge en mémoire toutes lignes suivantes jusqu'à </VirtualHost. Si dans le buffer il trouve le motif $USER.domaine.com, alors le buffer est supprimé (commande d). Sinon, c'est affiché (comportement par défaut).

  7. #7
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    je test ta commande et je te tient au courant.

    J'ai créer un fichier de conf de test avec 2 vhost: toto.domaine.com et tata.domain.com
    j'ai lancé ce script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
    echo "Quel VirtualHost voulez-vous supprimer ? : "
    read USER
    sed -i '/<VirtualHost/{:a; N; /<\/VirtualHost/\!ba; /'$USER'\.domaine.com/d }' /root/test.conf
    exit 0
    voici ce que j'ai en lançant la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 39: commande inconnue: `\'

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 738
    Points : 31 067
    Points
    31 067
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loopback Voir le message
    oui je suis sous GNU/linux et je possède sed
    Oui, c'est un outil standard

    Citation Envoyé par loopback Voir le message
    Moi ce genre de code ça me fait toujours halluciner. Généralement le programmeur qui le tape se met à parler ensuite de "boucle if()"

  9. #9
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Vire le \ devant le !.

    Désolé, erreur de ma part (c'est juste sous tcsh qu'il est nécessaire, pas sous les autres shells).

  10. #10
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par LLB Voir le message
    Vire le \ devant le !.

    Désolé, erreur de ma part (c'est juste sous tcsh qu'il est nécessaire, pas sous les autres shells).
    il ne me met plus d'erreurs mais le bloque n'est pas supprimé.

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Comment distingue tu qu'un virtualhost est associé à un user donné ? Avec l'option SuexecUserGroup ? Ou le nom de domaine suffit ?

    --
    Jedaï

  12. #12
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Comment distingue tu qu'un virtualhost est associé à un user donné ? Avec l'option SuexecUserGroup ? Ou le nom de domaine suffit ?

    --
    Jedaï
    le nom en domaine suffit

  13. #13
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par loopback Voir le message
    le nom en domaine suffit
    La solution bête et méchante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -0 -i.bak -pe 's/<VirtualHost.*?ServerName\s+toto\.domain\.com.*?</VirtualHost>//' apache.conf
    --
    Jedaï

  14. #14
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Si tu ne donnes pas de détails sur la sortie...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    $ cat in
    <VirtualHost *:80>
    ServerName   foo.domaine.com
    LogLevel warn
    ErrorLog /var/log/apache2/toto-error.log
    [...]
    </VirtualHost>
    <VirtualHost *:80>
    ServerName   toto.domaine.com
    ServerAdmin  webmaster@domain.com
    DocumentRoot /var/www/vhosts/pseudo
    [...]
    CustomLog /var/log/apache2/toto-access.log combined
    LogLevel warn
    ErrorLog /var/log/apache2/toto-error.log
    [...]
    </VirtualHost>
    <VirtualHost *:80>
    ServerName   bar.domaine.com
    ServerAdmin  webmaster@domain.com
    DocumentRoot /var/www/vhosts/pseudo
    [...]
    CustomLog /var/log/apache2/toto-access.log combined
    LogLevel warn
    ErrorLog /var/log/apache2/toto-error.log
    [...]
    </VirtualHost>
    $ USER=toto
    $ sed '/<VirtualHost/{:a; N; /<\/VirtualHost/!ba; /'$USER'\.domaine.com/d }' in
    <VirtualHost *:80>
    ServerName   foo.domaine.com
    LogLevel warn
    ErrorLog /var/log/apache2/toto-error.log
    [...]
    </VirtualHost>
    <VirtualHost *:80>
    ServerName   bar.domaine.com
    ServerAdmin  webmaster@domain.com
    DocumentRoot /var/www/vhosts/pseudo
    [...]
    CustomLog /var/log/apache2/toto-access.log combined
    LogLevel warn
    ErrorLog /var/log/apache2/toto-error.log
    [...]
    </VirtualHost>

  15. #15
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Jedai Voir le message
    La solution bête et méchante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -0 -i.bak -pe 's/<VirtualHost.*?ServerName\s+toto\.domain\.com.*?</VirtualHost>//' apache.conf
    --
    Jedaï
    J'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    syntax error at -e line 1, at EOF
    Execution of -e aborted due to compilation errors.

  16. #16
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    Si tu ne donnes pas de détails sur la sortie...
    Je ne te sui plus là.

  17. #17
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    Voici le script en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
    echo "Quel VirtualHost voulez-vous supprimer ? : "
    read USER
    sed -i '/<VirtualHost/{:a; N; /<\/VirtualHost/!ba; /'$USER'\.domaine.com/d }' /root/test.conf
    exit 0
    Qu'est-ce qu'il manque ? et que veut dire le :a; le N; et le !ba; ??

  18. #18
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Pitite correction (trop de /) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -0 -i.bak -pe 's{<VirtualHost.*?ServerName\s+toto\.domain\.com.*?</VirtualHost>}{}ms' apache.conf
    --
    Jedaï

  19. #19
    Membre régulier Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Points : 113
    Points
    113
    Par défaut
    on avance..on avance, il ne me met plus d'erreurs mais il ne m'efface rien

  20. #20
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Peux-tu tester la commande (celle de Jedai ou la mienne, peu importe, elles sont identiques) sur l'entrée que j'ai donnée en exemple ?

    Obtiens-tu le même résultat que moi ?

    J'ai testé le fichier .sh que tu donnes, et chez moi, ça marche... Je ne vois pas comment je peux t'aider plus. Il faudrait que tu donnes plus de détails sur le fichier d'entrée et sur le USER utilisé.
    Par exemple, en faisant un copier-coller des opérations faites (comme j'avais fait).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Supprimer un bloc de lignes dans un fichier ldif
    Par g56589 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/09/2008, 22h36
  2. [VB6]Suppression d'une ligne dans un fichier
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/02/2006, 12h20
  3. Suppression de lignes dans un fichier texte
    Par Isa31 dans le forum Langage
    Réponses: 16
    Dernier message: 26/01/2006, 21h07
  4. Suppression de lignes dans un fichier sous dos
    Par ducho dans le forum Windows
    Réponses: 2
    Dernier message: 16/05/2005, 11h20
  5. Suppression de lignes dans un fichier
    Par bubu dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo