[Résolu] [SHELL] suppression 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

<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

Bref, je voudrais qu’il supprime tout le bloc (de à ), quand le pseudo correspond.
Note: le nombre de lignes dans le bloque du vhost est fixe.

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

Si tu n'indique pas de fichier il prend l'entrée standard et tu peut faire une redirection de flux. :laughing:

Si tu n’indique pas de fichier il prend l’entrée standard et tu peut faire une redirection de flux. :laughing:

voici ce que j’avais fait:

#!/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
mais le bloque n’est pas supprimé
J’ai testé ta commande en indiquant le nom du fichier et
il m’affiche le fichier complet dans la console (sdout)

Bonjour,

Ceci devrait répondre à ta demande. Ce n’est certainement pas optimisé.

Une petite sauvegarde du fichier Vhost est peut etre preferable.

[code]#!/bin/bash

Chemin vers le fichier

FICHIER="/chemin/vers/fichier/VHOST"

VHOST_ASUPP=$1.domaine.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[/code]

@+

Salut micky,
voici ce que ça donne:

./delvhost.sh: line 9: 2 3 8 9-1: syntax error in expression (error token is "3 8 9-1") sed: -e expression n°1, caractère 1: commande inconnue: `,'

Voici le fichier de vhosts (/root/vhosts.conf):

[code]<VirtualHost *:80>
ServerName toto.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/vhosts/toto/

<VirtualHost *:80>
ServerName tata.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/vhosts/tata/
[/code]

Je voudrais supprimer le vhost toto.domain.com

J’ai modifier le script comme ceci:

[code]#!/bin/bash

echo "Quel vhosts voulez-vous supprimer ? : "
read USER

Chemin vers le fichier

FICHIER="/root/vhosts.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 $USER}'-1))

Suppression des lignes de DEB_LIGNE jusqu’au premier VirtualHost trouvé

sed -i ‘/$DEB_LIGNE/</VirtualHost>/d’ $FICHIER[/code]

et je rencontre ces erreurs:

./delvhost.sh: line 12: 2: ServerName toto.domain.com-1: syntax error in expression (error token is ": ServerName toto.domain.com-1") sed: -e expression n°1, caractère 13: commande inconnue: `<'

Quelqu’un voit ce qu’il se passe ?

Pour la technique avec grep il faut faire quelque chose du genre.

grep -v -A $NbLigne "$USER" nomfic > nomfic.tmp mv nomfic.tmp nomfic.tmp

Bonjour,

Voici la correction :

[code]#!/bin/bash

echo "Quel vhosts voulez-vous supprimer ? : "
read USER

Chemin vers le fichier

FICHIER="/root/vhosts.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[/code]

Tu avais remplace le $1 du awk par $USER, le $1 du awk n’a rien avoir avec l’argument passé au script. Il dit de n’afficher que la premiere valeur avant le “:”.

Dans le sed, tu avais mis des cote simple au lieu des cote double. Si tu met des cote simple le $DEB_LIGNE ne renvoie pas ca valeur et tu avais oublie la virgule entre les deux valeurs qui signifie de $DEB_LIGNE à sinon ca signifie de remplacer $DEB_LIGNE par .

J’espere avoir ete clair dans les explications.

@+

[quote=“micky979”]Bonjour,

Voici la correction :

[code]#!/bin/bash

echo -n "Quel vhosts voulez-vous supprimer ? : "
read USER

Chemin vers le fichier

FICHIER="/root/vhosts.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
exit 0[/code]

Tu avais remplace le $1 du awk par $USER, le $1 du awk n’a rien avoir avec l’argument passé au script. Il dit de n’afficher que la premiere valeur avant le “:”.

Dans le sed, tu avais mis des cote simple au lieu des cote double. Si tu met des cote simple le $DEB_LIGNE ne renvoie pas ca valeur et tu avais oublie la virgule entre les deux valeurs qui signifie de $DEB_LIGNE à sinon ca signifie de remplacer $DEB_LIGNE par .

J’espere avoir ete clair dans les explications.

@+[/quote]

Mercii ça marche :slightly_smiling: