使用 grep 显示文本之间的行

使用 grep 显示文本之间的行

我知道我可以使用 grep 的 -A 和 -B 命令来获取我正在寻找的很多内容,但这并不是我想要的。

我正在寻找解析 httpd.conf 文件搜索域名。然后显示该域的 VirtualHost 标记之间的所有内容。虚拟主机的示例如下。

要搜索域,我运行以下命令:

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

但这并没有给我完整的虚拟主机,只有包含域的行。

<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>

答案1

这里sed获取两个特定字符串之间(并包括)之间的所有内容的调用:

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

如果您想搜索特定域,只需添加它:

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

答案2

必须使用grepsed并且awk更适合这样的任务:

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

由于 httpd.conf 指令不区分大小写,因此您可能更喜欢使用不区分大小写的匹配:

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

IGNORECASE是 GNU 扩展,仅在 中可用gawk。)

更新根据改变后的问题:

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

答案3

awk '/Iowa/,/Montana/' file

将字符串 A 和 B 替换为您自己的字符串。

答案4

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

将[]内的所有内容替换为正确的值

相关内容