Comment puis-je supprimer les réponses de la sortie LiveHTTPHeaders à l'aide de awk, perl ou sed?

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

  •  06-07-2019
  •  | 
  •  

Question

Disons que j'ai quelque chose comme ceci (ceci n'est qu'un exemple, la requête réelle sera différente: j'ai chargé StackOverflow avec LiveHTTPHeaders activé pour avoir des échantillons sur lesquels travailler):

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
----------------------------------------------------------
...

Le journal complet des demandes et des réponses est disponible sur pastebin

Et je souhaite supprimer toutes les réponses (HTTP / 1.x 200, ainsi que tout le contenu de cette réponse, par exemple), ainsi que tous les doublures indiquant l'adresse de la page. Je souhaite uniquement conserver toutes les demandes dans un fichier texte avec une sortie LiveHTTPHeaders enregistrée.

Ainsi, le résultat serait:

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/

...

Encore une fois, le texte intégral de ce que je veux conserver est disponible sur pastebin .

Si je sauvegarde la session capturée LiveHTTPHeaders dans un fichier texte et souhaite obtenir un résultat similaire à celui du deuxième "code" de cette question, comment procéder? Peut-être avec awk , sed ou perl ? Ou autre chose? Je suis sous Linux.


Modifier: J'essaye de lancer le script de Sinan. Le script est le suivant:

#!/usr/bin/perl
local $/ = "\n\n";
while (<>) {
    print if /^GET|POST/; # Add more request types as needed
}

J'ai essayé de l'exécuter de cette façon:

./cleanup-headers.pl livehttp.txt > filtered.txt

Et de cette façon:

perl cleanup-headers.pl < livehttp.txt > filtered.txt

... le fichier filtré.txt a été créé mais totalement vide.

Quelqu'un l'a essayé sur les en-têtes PLEINS que j'ai collés dans pastebin? Cela a-t-il fonctionné?

en-têtes complets

Était-ce utile?

La solution

On dirait que vous rencontrez des problèmes de fin d’espace.

$ sed -e 's/^\s*$//' livehttp.txt | \
  perl -e '$/ = ""; while (<>) { print if /^(GET|POST)/ }'

Ceci fonctionne en plaçant l'opérateur readline de Perl en mode paragraphe (via $ / = "" ), qui saisit enregistre un bloc à la fois, séparés par au moins deux nouvelles lignes consécutives.

C'est bien quand ça marche, mais c'est un peu cassant. Les lignes vides, mais pas les lignes vides vont gommer le travail, mais sed peut les nettoyer.

Commande équivalente et plus concise:

$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'

Autres conseils

En Perl:

local $/ = "\n\n";
while (<>) {
    print if /^(?:GET|POST)/; # Add more request types as needed
}

Remarques: Si vous regardez le résultat généré par LiveHTTPHeaders, les entrées sont clairement séparées par deux nouvelles lignes. Je pense donc que la définition de $ / = "\ n \ n" est plus approprié que de définir $ / = '' . Je pense que vos problèmes sont dus au fait que les lignes de votre fichier d’entrée ont été en retrait.

J'ai initialement téléchargé le fichier à partir de pastebin et utilisé le fichier complet pour tester mon script. Je ne crois pas que le fichier que vous utilisiez pour tester sur votre ordinateur soit identique à celui que vous avez mis sur pastebin .

Si vous souhaitez gérer de manière robuste les lignes éventuellement indentées tout en restant cohérent avec le format de la sortie de LiveHTTPHeaders, vous devez utiliser les éléments suivants:

#!/usr/bin/perl

use strict; use warnings;

local $/ = "\n\n";
while (<>) {
    next unless /^\s*(?:GET|POST)/;
    s!^\s+!!gm;
    print;
}

Pour moi, utiliser sed et perl dans le même pipeline est un peu une abomination.

juste une commande gawk

awk -vRS= '/^(GET|POST)/' ORS="\n\n" file

vous pouvez utiliser le shell bash

while read -r line
do    
    case "$line" in
        GET*|POST*) flag=1;;        
        "") flag=0;;
    esac
    [ "$flag" -eq 1 ] && echo "$line"
done < "file" 

Exécuter le code de Sinan en tant que:

perl test.pl < infile.txt > outfile.txt
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top