skip to Main Content

I’m trying to cut certain virtual host from file which has a lot of them using bash.

Eg. in my script I would like to get virtual host which uses the_one_known2.example.com, but another time the_one_known3.example.com, namely I would like to get some part form apache config file with beforehand known URL (present in ServerName or ServerAlias) which is set in bash script as a parameter.

<VirtualHost *:80 *:${SERVER_PORT}>
    ServerName      test1.example.com
    ServerAlias     test2.example.com
    ServerAlias     the_one_known1.example.com
    ServerAlias     test3.example.com
</VirtualHost>
<VirtualHost *:80 *:${SERVER_PORT}>
    ServerName      test4.example.com
    ServerAlias     the_one_known2.example.com
    ServerAlias     test5.example.com
    ServerAlias     test6.example.com
</VirtualHost>
<VirtualHost *:80 *:${SERVER_PORT}>
    ServerName      the_one_known3.example.com
    ServerAlias     test7.example.com
    ServerAlias     test8.example.com
    ServerAlias     test9.example.com
</VirtualHost>

So I my URL variable would change to eg. the_one_known2.example.com I would get:

<VirtualHost *:80 *:${SERVER_PORT}>
    ServerName      test4.example.com
    ServerAlias     the_one_known2.example.com
    ServerAlias     test5.example.com
    ServerAlias     test6.example.com
</VirtualHost>
[EDIT] So far I tried to find first line of a selected virtual host:

url_line=$(grep -n -m 1 "${URL}" ./apache.conf" | sed  's/([0-9]*).*/1/')
vitual_host_start_line="$((app_line-1))" // this is an assumption that Virtual Host starts just one line before the first occurance of URL
echo $vitual_host_line // the place it starts

But I have a problem to find a last line of this virtual host because it is first occurence of </VirtualHost> after vitual_host_start_line

2

Answers


  1. With awk:

    awk -v name="the_one_known2.example.com" 'BEGIN{RS=ORS="</VirtualHost>n"} $0~name{print; exit}' file
    

    I assume the_one_known2.example.com is no substring of another domain in your file.

    See: 8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

    Login or Signup to reply.
  2. With your shown samples, please try following awk code. Written and tested in GNU awk.

    awk -v RS='<VirtualHost[^/]*/' -v ORS="VirtualHost>n" 'RT~/[[:space:]]+the_one_known2.example.comn/{print RT}' Input_file
    

    Explanation: Simple explanation would be, making RS(record separator) from <VirtualHost till next / occurrence(non-greedy match). Then checking if it has [[:space:]]+the_one_known2.example.comn if yes then print matched value, this will print VirtualHost> at ending of passage since its set as ORS value in program.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search