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?

Vollständige Header

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top