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