Afficher les lignes entre le text avec grep

Je sais que je peux utiliser la command -A et -B pour grep pour get beaucoup de ce que je cherche mais ce n'est pas tout à fait ce que je veux.

Je cherche à parsingr le file httpd.conf pour searchr un domaine . Ensuite, affichez tout entre les balises VirtualHost pour ce domaine . Un exemple de virtualhost est comme suit.

Pour searchr un domaine, j'exécute la command suivante:

less /usr/local/apache2/conf/httpd.conf |grep domain.tld 

Mais cela ne me donne pas le virtualhost complet seulement les lignes qui contiennent le domaine.

 <VirtualHost 192.168.1.10:80> SSLEngine on SSLCACertificateFile /usr/share/ssl/certs/ca-bundle.crt SuexecUserGroup anzenketh wheel ServerName anzenketh.net ServerAlias www.anzenketh.net ServerAdmin [email protected] DocumentRoot /home/anzenketh/www/anzenketh.net ScriptAlias /cgi-bin/ "/home/anzenketh/www/cgi-bin/" <Directory /home/anzenketh/www/cgi-bin> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> CustomLog /var/log/httpd/anzenketh/anzenketh.net-access_log combined ErrorLog /var/log/httpd/anzenketh/anzenketh.net-error_log </VirtualHost> 

Voici un appel sed pour get tout entre (et y compris) deux strings spécifiques:

 sed -n '/<VirtualHost*/,/<\/VirtualHost>/p' httpd.conf 

Si vous souhaitez searchr un domaine spécifique, ajoutez-le simplement:

 sed -n '/<VirtualHost 192.168.1.10:80>*/,/<\/VirtualHost>/p' httpd.conf 

Doit utiliser grep ? sed et awk sont plus adaptés à de telles tâches:

 sed -n '/<VirtualHost /,/<\/VirtualHost>/p' inputfile awk '/<VirtualHost /,/<\/VirtualHost>/' inputfile 

Comme les directives httpd.conf sont insensibles à la casse, vous pouvez préférer utiliser la correspondance insensible à la casse:

 sed -n '/<VirtualHost /I,/<\/VirtualHost>/Ip' inputfile gawk -vIGNORECASE=1 '/<VirtualHost /,/<\/VirtualHost>/' inputfile 

( IGNORECASE est une extension GNU, disponible uniquement dans gawk .)

Mise à jour en fonction de la question modifiée:

 sed -n '/<VirtualHost\s\+192\.168\.1\.10\b/I,/<\/VirtualHost>/Ip' inputfile gawk -vIGNORECASE=1 '/<VirtualHost\s+192\.168\.1\.10\>/,/<\/VirtualHost>/' inputfile 
 awk '/Iowa/,/Montana/' file 

Remplacez la string A et B par la vôtre.

 grep -Pzio '(?s)<VirtualHost ([yourserverip]|\*)(:(80|443))?>(?:.(?!</VirtualHost))*?ServerName +[yourservername](?:(?!</VirtualHost).)*?</VirtualHost>' [yourfilename] 

Remplacer tout le contenu dans [] par des valeurs correctes