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

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

тестовый файл:

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, чтобы сделать его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

РЕДАКТИРОВАТЬ: если я добавлю, /^GET/{ }как показано ниже, то это, кажется, работает, но как это работает, а предыдущее нет?

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

решение1

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

Я разработал этот однострочник bash, который тоже работает

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

решение2

Проще с awk:

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

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

Связанный контент