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?

cabeçalhos completos

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top