por que este comando sed não consegue obter a saída desejada

3

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

resultado desejado:

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

que eu irei aderir usando as referências anteriores de sed para torná-lo http://my.website.com/_ajax_htmlview?action=28&__and_so_on

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

mas eu entendo isso:

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

EDITAR : se eu adicionar /^GET/{ } como abaixo, então parece funcionar, mas como isso funciona e o anterior não

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

2 respostas

0

Bem, apenas por diversão, solução awk obrigatória ....

Eu trabalhei este bash oneliner que funciona também

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

Isso cria uma função bash no seu shell que você pode chamar assim

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

Existe uma ressalva - isso só funcionará se houver apenas uma única instância de "Host" e "GET" no arquivo.

    
por 04.11.2016 / 13:12
0

Mais fácil com awk :

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

O código awk procura por qualquer linha de solicitação GET que também contenha a string ajax , em seguida, envia o segundo para o último campo dessa linha e lê a próxima linha. Da próxima linha, sai o segundo campo.

    
por 23.09.2017 / 16:23

Tags