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

ここsed2つの特定の文字列の間に含まれるすべての項目を取得する呼び出し。

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

特定のドメインを検索するには、そのドメインを追加してください。

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

答え2

使用する必要がありますかgrep?次の作業に適していsedます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

IGNORECASEGNU拡張であり、でのみ利用可能です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]

[]内のすべての内容を正しい値に置き換えてください。

関連情報