Andesi - forum

Forum francophone pour Debian

Vous n'êtes pas identifié(e).

#1 25/10/2007 04:48:53

dexinou
Membre
Inscription : 25/10/2007
Messages : 2

[SHELL] Supprimer un bloc suivant une chaîne de caractère

Bonjour,

J'essai en vain de supprimer un bloc dans le virtualhost apache :

#!/bin/sh
echo "Quel VirtualHost voulez-vous supprimer ? : "
read USER
cat /root/vhost.conf | grep $USER
sed -i '/<VirtualHost/{:a; N; /<\/VirtualHost/!ba; /'$USER'\.domaine.com/d }' /root/vhost.conf
exit 0

voici le vhost.conf (mini)

<VirtualHost *:80>
    ServerName toto.domain.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/clients/toto/
</VirtualHost>
<VirtualHost *:80>
    ServerName tata.domain.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/clients/tata/
</VirtualHost>

Comment supprimer le vhost du servername toto.domain.com avec sed?
Merci pour l'aide car ça fait 1 semaine que je cherche en vain.

Hors ligne

#2 25/10/2007 06:54:49

braouazou
Membre
Inscription : 05/03/2005
Messages : 181

Re : [SHELL] Supprimer un bloc suivant une chaîne de caractère

Personnellement, je contournerais le problème en insérant un commentaire contenant le domain avant chaque VirtualHost, et prendrais soin que ceds blocs soient des paragraphes indépendants...

Est-ce que tu veux écrire dans ce fichier de façoin automatique également (à l'aide d'un script ou autre) ? Si non, ma solution, est plus de n'en être pas vraiment une, ne pourra pas fonctionner (risque d'erreur).

Julien

Hors ligne

#3 25/10/2007 10:52:08

ledub
Membre
Lieu : Creil (60)
Inscription : 22/04/2003
Messages : 4 545

Re : [SHELL] Supprimer un bloc suivant une chaîne de caractère

Il se peut qu'avec un grep et un sed cela soit possible.
À tester :

LIGNE_A_SUPPRIMER=$(grep -n -B1 -A3 "$USER" /root/vhost.conf | awk -F"-|:" '{print $1}')
cat /root/vhost.conf| sed $(echo $LIGNE_A_SUPPRIMER| awk '{print $1","$NF"d"}')

mais cela impose que le nombre de ligne avant (argument de -B du grep) et après (-A) ton critère de recherche soit fixe, ici une ligne avant et 3 après.

LeDub pas certain de la simplicité de sa réponse.


« Ne doutez pas qu'un petit nombre de personnes déterminées puisse changer le monde. En fait, ça a même toujours marché comme ça.»
Margaret Mead
---
VeoSearch est un moteur de recherche solidaire qui permet de financer des projets associatifs de développement durable par vos recherches Internet. Utilisez-le !!!

Hors ligne

#4 25/10/2007 12:23:49

ioguix
Administrator
Lieu : Paris
Inscription : 25/04/2003
Messages : 3 945

Re : [SHELL] Supprimer un bloc suivant une chaîne de caractère

Voilà une piste qui n'est pas des plus propre perlement parlant, mais un chouilla plus souple que la proposition de ledub :

cat vh.test| perl -e '$f.=$_ while(<>);  $f=~/(<VirtualHost \*:80>\s*?ServerName toto\.domain\.com.*?<\/VirtualHost>)/ms; print $1;'

Je refuse bien entendu d'accepter la paternité de ce code que j'ai pondu trop vite pour que j'en soit satisfait.
Ce bout de code impose que tes virtualhost commencent tous par "<VirtualHost *:80>" exclusivement et que le ServerName soit la première valeur du bloc. Bref, on peut certainement fait plus bô et élegant, mais j'avoue manquer de temps.

à noter qu'il faut encore piper la sortie pour dégager le bout de code matché hein...


[email protected]
"Contrairement aux chasseurs qui, eux, ne sont pas des lapins, les pollueurs, eux sont des ordures. - Philippe Geluck, Le chat"
gpg: 0828C222

Hors ligne

#5 25/10/2007 13:35:27

dexinou
Membre
Inscription : 25/10/2007
Messages : 2

Re : [SHELL] Supprimer un bloc suivant une chaîne de caractère

oui tous les vhosts commencent pas <VirtualHost *:80> et la première directive du vhosts est ServerName.

Bon après quelque temps de recherche voici ce que j'ai testé et ça marche enfin:

#!/bin/bash
echo "Quel virtualhost voulez-vous supprimer ? : "
read USER
# Chemin vers le fichier
FICHIER="/usr/local/apache/conf/virtualhosts.conf"
VHOST_ASUPP=$USER.domain.com
# Recherche de la ligne contenant le domaine et soustraction de 1
DEB_LIGNE=$((`grep -n $VHOST_ASUPP $FICHIER | awk -F":" '{print $1}'`-1))
# Suppression des lignes de DEB_LIGNE jusqu'au premier VirtualHost trouvé
sed -i "$DEB_LIGNE,/<\/VirtualHost>/"d $FICHIER

Merci pour votre aide. c'est résolu

Dernière modification par dexinou (25/10/2007 13:38:36)

Hors ligne

Pied de page des forums