Exibe linhas no texto entre grep

3

Eu sei que posso usar o comando -A e -B para o grep obter muito do que estou procurando, mas não é bem o que eu quero.

Eu estou olhando para analisar o arquivo httpd.conf para procurar um domínio . Em seguida, exibe tudo entre as tags do VirtualHost para esse domínio . Um exemplo do virtualhost é o seguinte.

Para procurar um domínio, eu corro o seguinte comando:

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

Mas isso não me dá o virtualhost completo apenas as linhas que contêm o domínio.

<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>
    
por anzenketh 31.08.2012 / 15:24

4 respostas

3

Aqui é uma chamada de sed para obter tudo entre (e incluindo) duas cadeias específicas :

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

Se você quiser procurar um domínio específico, basta adicioná-lo:

sed -n '/<VirtualHost 192.168.1.10:80>*/,/<\/VirtualHost>/p' httpd.conf
    
por 31.08.2012 / 15:29
3

Deve usar grep ? sed e awk são mais adequados para essas tarefas:

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

Como as diretivas httpd.conf não diferenciam maiúsculas de minúsculas, você pode preferir usar a correspondência sem distinção entre maiúsculas e minúsculas:

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

( IGNORECASE é extensão GNU, disponível apenas em gawk .)

Atualizar de acordo com a pergunta alterada:

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

Substitua a string A e B pela sua.

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

Substitua todo o conteúdo dentro de [] por valores corretos

    
por 29.12.2014 / 15:17