Comment puis-je supprimer les réponses de la sortie LiveHTTPHeaders à l'aide de awk, perl ou sed?
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é?
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