Come posso rimuovere le risposte dall'output di LiveHTTPHeaders usando awk, perl o sed?

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

  •  06-07-2019
  •  | 
  •  

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?

Header completi

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top