Wie kann ich Antworten von Livehttpheaders Ausgabe mit awk, Perl oder sed entfernen?
Frage
Lassen Sie uns sagen, dass ich so etwas wie dieses haben (dies ist nur ein Beispiel, wird die tatsächliche Anforderung unterschiedlich sein: Ich lud Stackoverflow mit Livehttpheaders aktiviert einige Proben haben, zu arbeiten):
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 ---------------------------------------------------------- ...
Vollprotokoll von Anfragen und Antworten finden Sie auf Pastebin
Und ich will alle Antworten entfernen (HTTP / 1.x 200 OK und alles in dieser Antwort, zum Beispiel) und alles Einzeiler Seite Adresse zeigt. Ich würde nur gerne haben alle Anfragen in Textdatei links mit gespeicherten Livehttpheaders Ausgabe.
So würde der Ausgang sein:
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/ ...
Auch der vollständige Text von dem, was ich behalten möchte, ist auf dem Pastebin .
Wenn ich Livehttpheaders gefangen Sitzung speichern Datei in Text, und ich möchte aus dem zweiten ‚Code‘ zur Folge haben wie bekommen in dieser Frage, wie mache ich das? Vielleicht mit awk
, sed
oder perl
? Oder etwas anderes? Ich bin auf Linux.
Bearbeiten: Ich versuche, Sinans Skript auszuführen. Script ist dies:
#!/usr/bin/perl
local $/ = "\n\n";
while (<>) {
print if /^GET|POST/; # Add more request types as needed
}
Ich habe versucht, es auf diese Weise ausgeführt wird:
./cleanup-headers.pl livehttp.txt > filtered.txt
Und auf diese Weise:
perl cleanup-headers.pl < livehttp.txt > filtered.txt
... Datei filtered.txt erstellt wurde, aber es ist völlig leer.
Wer versucht, es auf FULL-Header i in Pastebin eingefügt? Hat es funktioniert?
Lösung
Sieht aus wie Sie mit Leerzeichen Probleme nachlauf.
$ sed -e 's/^\s*$//' livehttp.txt | \
perl -e '$/ = ""; while (<>) { print if /^(GET|POST)/ }'
Dies funktioniert durch die Perl-Readline- Operator in Absatz Modus (über $/ = ""
) setzen, die zu einem Zeitpunkt zeichnet ein Stück packen, getrennt durch zwei oder mehr aufeinanderfolgende Zeilenumbrüche.
Es ist schön, wenn es funktioniert, aber es ist ein bisschen spröde. Blank, aber nicht leere Zeilen werden gum die Werke, aber sed
können diejenigen aufzuräumen.
Equivalent und prägnanter Befehl:
$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'
Andere Tipps
In Perl:
local $/ = "\n\n";
while (<>) {
print if /^(?:GET|POST)/; # Add more request types as needed
}
Weitere Informationen: am Ausgang von Livehttpheaders erzeugt der Suche, werden die Einträge ganz klar von zwei Zeilenumbrüche getrennt, so dass ich denke Einstellung $/ = "\n\n"
besser geeignet ist als $/ = ''
Einstellung. Ich glaube, Ihre Probleme auf die Tatsache zurückzuführen waren, dass die Zeilen in Ihrer Eingabedatei tatsächlich eingerückt.
Ich habe Download ursprünglich die Datei von Pastebin und verwenden Sie die vollständige Datei mein Skript zu testen. Ich glaube nicht, dass die Datei, die Sie auf Ihrem Computer zu testen, wurden unter Verwendung war identisch mit dem Sie setzten auf Pastebin .
Wenn Sie mit möglicherweise eingekerbten Linien kräftig zu bewältigen und dabei mit dem Format der Ausgabe von Livehttpheaders Einklang stehen, sollten Sie so etwas wie die folgenden verwenden:
#!/usr/bin/perl
use strict; use warnings;
local $/ = "\n\n";
while (<>) {
next unless /^\s*(?:GET|POST)/;
s!^\s+!!gm;
print;
}
Ich halte mit sed
und perl
in der gleichen Pipeline ein wenig ein Greuel sein.
nur ein gaffen Befehl
awk -vRS= '/^(GET|POST)/' ORS="\n\n" file
Sie können die Bash-Shell
while read -r line
do
case "$line" in
GET*|POST*) flag=1;;
"") flag=0;;
esac
[ "$flag" -eq 1 ] && echo "$line"
done < "file"
Ausführen Sinans Code wie:
perl test.pl < infile.txt > outfile.txt