Como posso remover respostas de saída LiveHTTPHeaders usando awk, Perl ou sed?
Pergunta
Vamos dizer que eu tenho algo como isto (este é apenas um exemplo, pedido real será diferente: eu carreguei StackOverflow com LiveHTTPHeaders permitiu ter algumas amostras para trabalhar em):
http://stackoverflow.com/ GET / HTTP/1.1 Host: stackoverflow.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive HTTP/1.x 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Expires: Sat, 28 Nov 2009 16:04:24 GMT Vary: Accept-Encoding Server: Microsoft-IIS/7.0 Date: Sat, 28 Nov 2009 16:04:23 GMT Content-Length: 19015 ---------------------------------------------------------- ...
log completa de pedidos e respostas está disponível em pastebin
E eu quero remover todas as respostas (HTTP / 1.x 200 OK e tudo o que a resposta, por exemplo) e todos os forros mostrando endereço da página. Gostaria só para ter todos os solicitações deixada no arquivo de texto com saída LiveHTTPHeaders salvos.
Assim, a saída seria:
GET / HTTP/1.1 Host: stackoverflow.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive GET /so/all.css?v=5290 HTTP/1.1 Host: sstatic.net User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Accept: text/css,*/*;q=0.1 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://stackoverflow.com/ ...
Mais uma vez, o texto completo sobre o que eu quero manter é acessível em pastebin .
Se eu salvar LiveHTTPHeaders capturado sessão para arquivo de texto e gostaria de obter resultado como da segunda 'código' nesta questão, como posso fazer isso? Talvez com awk
, sed
ou perl
? Ou alguma outra coisa? Eu estou em Linux.
Editar: Estou tentando executar script de Sinan. Script é esta:
#!/usr/bin/perl
local $/ = "\n\n";
while (<>) {
print if /^GET|POST/; # Add more request types as needed
}
Eu tentei executá-lo desta maneira:
./cleanup-headers.pl livehttp.txt > filtered.txt
E desta maneira:
perl cleanup-headers.pl < livehttp.txt > filtered.txt
... filtered.txt arquivo foi criado mas está totalmente vazio.
Qualquer um tentou fazê-lo em cabeçalhos completos i colados em pastebin? Será que funcionou?
Solução
Parece que você está tendo arrastando problemas de espaço em branco.
$ sed -e 's/^\s*$//' livehttp.txt | \
perl -e '$/ = ""; while (<>) { print if /^(GET|POST)/ }'
Isso funciona, colocando operador readline do Perl em modo de parágrafo (via $/ = ""
), que agarra registros de um pedaço de cada vez, separados por dois ou mais consecutivos novas linhas.
É bom quando funciona, mas é um pouco frágil. Em branco, mas não linhas vazias vai goma-se as obras, mas sed
pode limpar os up.
Equivalente e mais comando conciso:
$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'
Outras dicas
Em Perl:
local $/ = "\n\n";
while (<>) {
print if /^(?:GET|POST)/; # Add more request types as needed
}
Notas: Olhando para a saída gerada pelo LiveHTTPHeaders, as entradas são muito claramente separados por duas novas linhas, então eu acho que a criação $/ = "\n\n"
é mais apropriado do que a criação $/ = ''
. Eu acredito que os seus problemas foram devido ao fato de que as linhas em seu arquivo de entrada foram realmente recuado.
Eu tinha originalmente baixar o arquivo de pastebin e usar o arquivo completo para testar o meu script. Eu não acredito que o arquivo que você estava usando para teste em seu computador era idêntico ao que você colocar em pastebin .
Se você quer lidar com firmeza com linhas possivelmente recuados, permanecendo consistente com o formato da saída de LiveHTTPHeaders, você deve usar algo como o seguinte:
#!/usr/bin/perl
use strict; use warnings;
local $/ = "\n\n";
while (<>) {
next unless /^\s*(?:GET|POST)/;
s!^\s+!!gm;
print;
}
I considere o uso sed
e perl
no mesmo gasoduto para ser um pouco de uma abominação.
apenas um comando gawk
awk -vRS= '/^(GET|POST)/' ORS="\n\n" file
Você pode usar o shell bash
while read -r line
do
case "$line" in
GET*|POST*) flag=1;;
"") flag=0;;
esac
[ "$flag" -eq 1 ] && echo "$line"
done < "file"
código de Run Sinan como:
perl test.pl < infile.txt > outfile.txt