¿Cómo puedo eliminar las respuestas de la salida de LiveHTTPHeaders usando awk, perl o sed?
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ó?
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