Come posso rimuovere le risposte dall'output di LiveHTTPHeaders usando awk, perl o sed?
Domanda
Diciamo che ho qualcosa del genere (questo è solo un esempio, la richiesta effettiva sarà diversa: ho caricato StackOverflow con LiveHTTPHeaders abilitati ad avere alcuni esempi su cui lavorare):
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 ---------------------------------------------------------- ...
Il registro completo di richieste e risposte è disponibile su pastebin
E voglio rimuovere tutte le risposte (HTTP / 1.x 200 OK e tutto in quella risposta, per esempio) e tutte le righe che mostrano l'indirizzo della pagina. Vorrei che tutte le richieste fossero rimaste nel file di testo con l'output di LiveHTTPHeaders salvato.
Quindi, l'output sarebbe:
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/ ...
Ancora una volta, il testo completo di ciò che voglio conservare è disponibile su pastebin .
Se si salva la sessione acquisita LiveHTTPHeaders in un file di testo e si desidera ottenere risultati come dal secondo 'codice' in questa domanda, come si fa? Forse con awk
, sed
o perl
? O qualcos'altro? Sono su Linux.
Modificare: Sto cercando di eseguire la sceneggiatura di Sinan. Lo script è questo:
#!/usr/bin/perl
local $/ = "\n\n";
while (<>) {
print if /^GET|POST/; # Add more request types as needed
}
Ho provato a eseguirlo in questo modo:
./cleanup-headers.pl livehttp.txt > filtered.txt
E in questo modo:
perl cleanup-headers.pl < livehttp.txt > filtered.txt
... il file filtered.txt è stato creato ma è completamente vuoto.
Qualcuno l'ha provato su intestazioni COMPLETE che ho incollato in pastebin? Ha funzionato?
Soluzione
Sembra che tu abbia problemi di spazio bianco finali.
$ sed -e 's/^\s*$//' livehttp.txt | \
perl -e '$/ = ""; while (<>) { print if /^(GET|POST)/ }'
Funziona mettendo l'operatore readline di Perl in modalità paragrafo (tramite $ / = " "
), che afferra i record di un pezzo alla volta, separati da due o più newline consecutive.
È bello quando funziona, ma è un po 'fragile. Le righe vuote ma non vuote elimineranno le opere, ma sed
può pulirle.
Comando equivalente e più conciso:
$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'
Altri suggerimenti
In Perl:
local $/ = "\n\n";
while (<>) {
print if /^(?:GET|POST)/; # Add more request types as needed
}
Note: Guardando l'output generato da LiveHTTPHeaders, le voci sono abbastanza chiaramente separate da due nuove righe, quindi penso che l'impostazione $ / = " \ n \ n "
è più appropriato che impostare $ / = ''
. Credo che i tuoi problemi fossero dovuti al fatto che le righe nel tuo file di input erano effettivamente rientrate.
Inizialmente ho scaricato il file da pastebin e ho usato il file completo per testare il mio script. Non credo che il file che stavi usando per testare sul tuo computer fosse identico a quello che hai messo su pastebin .
Se si desidera gestire in modo affidabile linee eventualmente rientrate pur rimanendo coerenti con il formato dell'output di LiveHTTPHeaders, è necessario utilizzare qualcosa di simile al seguente:
#!/usr/bin/perl
use strict; use warnings;
local $/ = "\n\n";
while (<>) {
next unless /^\s*(?:GET|POST)/;
s!^\s+!!gm;
print;
}
Considero l'utilizzo di sed
e perl
nella stessa pipeline come un po 'un abominio.
solo un comando gawk
awk -vRS= '/^(GET|POST)/' ORS="\n\n" file
puoi usare la shell bash
while read -r line
do
case "$line" in
GET*|POST*) flag=1;;
"") flag=0;;
esac
[ "$flag" -eq 1 ] && echo "$line"
done < "file"
Esegui il codice di Sinan come:
perl test.pl < infile.txt > outfile.txt