почему эта команда sed не может получить желаемый результат

TestFile:

872iirji -- RANDOM STUFF -- skjkfj45j GET /_ajax_htmlview?action=28&__and_so_on HTTP/1.1. Host: my.website.com. connection: blah blah blah skjfkjfj 

желаемый выход:

 _ajax_htmlview?action=28&__and_so_on my.website.com 

который я буду использовать с помощью sed backreferences, чтобы сделать его http://my.website.com/_ajax_htmlview?action=28&__and_so_on

 sed -n 's=GET \/\(_ajax_htmlview[^ ]*\).*=\1= h /^Host/{ s=.*:[ \t]*\(.*\).=\1= H x p }' 

но я понимаю:

 Host: my.website.com my.website.com 

EDIT : если я добавлю /^GET/{ } как показано ниже, это похоже на работу, но как это работает, а предыдущий

 sed -n '/^GET/{ s=GET \/\(_ajax_htmlview[^ ]*\).*=\1= h } /^Host/{ s=.*:[ \t]*\(.*\).=\1= H x p }' testfile 

Ну просто для удовольствия, обязательное awk-решение ….

Я разработал этот bash oneliner, который тоже работает

 buildit(){ Req=$(grep -oP '(?<=GET \/).*(?=HTTP)' $1); url=$(awk -F":" '/Host/{gsub(/ /, "",$2); print $2}' $1); echo "http://"$url"/"$Req; } 

Это создает функцию bash в вашей оболочке, которую вы можете вызвать так:

 $ buildit testfile http://my.website.com/_ajax_htmlview?action=28&__and_so_on 

Однако есть предостережение – это будет работать только в том случае, если в файле есть только один экземпляр «Host» и «GET».

Легче с awk :

 $ awk '/GET.*ajax/ { print $(NF-1); getline; print $NF }' testfile /_ajax_htmlview?action=28&__and_so_on my.website.com. 

Код awk ищет любые строки запроса GET, которые также содержат строку ajax , затем выводит второе в последнее поле этой строки и считывает следующую строку. Из этой следующей строки выводится второе поле.