
arquivo de teste:
872iirji -- RANDOM STUFF -- skjkfj45j
GET /_ajax_htmlview?action=28&__and_so_on HTTP/1.1.
Host: my.website.com.
connection: blah blah blah
skjfkjfj
saída desejada:
_ajax_htmlview?action=28&__and_so_on
my.website.com
ao qual irei ingressar usando sed backreferences para torná-lohttp://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
}'
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[^ ]*\).*=\1=
h
}
/^Host/{
s=.*:[ \t]*\(.*\).=\1=
H
x
p
}' testfile
Responder1
Bem, apenas por diversão, solução awk obrigatória ....
Eu desenvolvi esse 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 em seu shell que você pode chamar assim
$ buildit testfile
http://my.website.com/_ajax_htmlview?action=28&__and_so_on
Porém, há uma ressalva: isso só funcionará se houver apenas uma única instância de "Host" e "GET" no arquivo.
Responder2
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 awk
código procura por quaisquer linhas de solicitação GET que também contenham a string ajax
, ele então gera o penúltimo campo dessa linha e lê a próxima linha. A partir da próxima linha, ele gera o segundo campo.