¿Cómo puedo eliminar las respuestas de la salida de LiveHTTPHeaders usando awk, perl o sed?

StackOverflow https://stackoverflow.com/questions/1812940

  •  06-07-2019
  •  | 
  •  

Pregunta

Digamos que tengo algo como esto (esto es solo un ejemplo, la solicitud real será diferente: cargué StackOverflow con LiveHTTPHeaders habilitado para tener algunas muestras para trabajar):

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

El registro completo de solicitudes y respuestas está disponible en pastebin

Y quiero eliminar todas las respuestas (HTTP / 1.x 200 OK y todo en esa respuesta, por ejemplo) y todos los liners que muestran la dirección de la página. Me gustaría tener solo todas las solicitudes en el archivo de texto con salida de LiveHTTPHeaders guardada.

Entonces, el resultado sería:

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/

...

Nuevamente, el texto completo de lo que quiero conservar está disponible en pastebin .

Si guardo la sesión capturada de LiveHTTPHeaders en un archivo de texto y me gustaría obtener el resultado del segundo 'código' en esta pregunta, ¿cómo hago esto? ¿Tal vez con awk , sed o perl ? ¿O algo mas? Estoy en Linux


Editar: Estoy tratando de ejecutar el script de Sinan. La secuencia de comandos es esta:

#!/usr/bin/perl
local $/ = "\n\n";
while (<>) {
    print if /^GET|POST/; # Add more request types as needed
}

Intenté ejecutarlo de esta manera:

./cleanup-headers.pl livehttp.txt > filtered.txt

Y de esta manera:

perl cleanup-headers.pl < livehttp.txt > filtered.txt

... se creó el archivo filter.txt pero está totalmente vacío.

¿Alguien lo intentó en encabezados COMPLETOS que pegué en pastebin? ¿Funcionó?

Encabezados completos

¿Fue útil?

Solución

Parece que tienes problemas de espacio en blanco al final.

$ sed -e 's/^\s*$//' livehttp.txt | \
  perl -e '$/ = ""; while (<>) { print if /^(GET|POST)/ }'

Esto funciona poniendo el operador de línea de lectura de Perl en modo de párrafo (a través de $ / = " " ), que toma registros de un fragmento a la vez, separados por dos o más líneas nuevas consecutivas.

Es agradable cuando funciona, pero es un poco frágil. Las líneas en blanco pero no vacías engrosarán las obras, pero sed puede limpiarlas.

Comando equivalente y más conciso:

$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'

Otros consejos

En Perl:

local $/ = "\n\n";
while (<>) {
    print if /^(?:GET|POST)/; # Add more request types as needed
}

Notas: Al observar el resultado generado por LiveHTTPHeaders, las entradas están claramente separadas por dos líneas nuevas, por lo que creo que configurar $ / = " \ n \ n " es más apropiado que configurar $ / = '' . Creo que sus problemas se debieron al hecho de que las líneas en su archivo de entrada estaban realmente sangradas.

Originalmente descargué el archivo de pastebin y utilicé el archivo completo para probar mi script. No creo que el archivo que estaba utilizando para probar en su computadora fuera idéntico al que colocó en pastebin .

Si desea tratar de manera sólida las líneas posiblemente sangradas sin dejar de ser consistente con el formato de salida de LiveHTTPHeaders, debe usar algo como lo siguiente:

#!/usr/bin/perl

use strict; use warnings;

local $/ = "\n\n";
while (<>) {
    next unless /^\s*(?:GET|POST)/;
    s!^\s+!!gm;
    print;
}

Considero que usar sed y perl en la misma canalización es un poco abominable.

solo un comando gawk

awk -vRS= '/^(GET|POST)/' ORS="\n\n" file

puedes usar el shell bash

while read -r line
do    
    case "$line" in
        GET*|POST*) flag=1;;        
        "") flag=0;;
    esac
    [ "$flag" -eq 1 ] && echo "$line"
done < "file" 

Ejecuta el código de Sinan como:

perl test.pl < infile.txt > outfile.txt
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top