awk、perl、またはsedを使用してLiveHTTPHeaders出力から応答を削除するにはどうすればよいですか?
質問
次のようなものがあるとしましょう(これは単なる例であり、実際のリクエストは異なります。LiveHTTPHeadersを有効にしてStackOverflowをロードし、いくつかのサンプルで作業できるようにします):
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 ---------------------------------------------------------- ...
リクエストとレスポンスの完全なログは、 pastebin
で入手できます。そして、すべての応答(たとえば、HTTP / 1.x 200 OKおよびその応答のすべて)と、ページアドレスを表示するすべての1つのライナーを削除します。すべてのリクエストをテキストファイルに残して、LiveHTTPHeadersの出力を保存したいだけです。
したがって、出力は次のようになります。
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/ ...
繰り返しますが、保持したいものの全文は pastebin で入手できます。
LiveHTTPHeadersでキャプチャされたセッションをテキストファイルに保存し、この質問の2番目の「コード」のような結果を取得したい場合、どうすればよいですか?おそらく awk
、 sed
、または perl
ですか?または、他の何か? Linuxを使用しています。
編集: 私はSinanのスクリプトを実行しようとしています。スクリプトは次のとおりです:
#!/usr/bin/perl
local $/ = "\n\n";
while (<>) {
print if /^GET|POST/; # Add more request types as needed
}
この方法で実行してみました:
./cleanup-headers.pl livehttp.txt > filtered.txt
そしてこの方法:
perl cleanup-headers.pl < livehttp.txt > filtered.txt
...ファイルfiltered.txtは作成されましたが、完全に空です。
誰もがペーストビンに貼り付けたフルヘッダーで試しましたか?うまくいきましたか?
解決
末尾に空白の問題があるように見えます。
$ sed -e 's/^\s*$//' livehttp.txt | \
perl -e '$/ = ""; while (<>) { print if /^(GET|POST)/ }'
これは、Perlのreadline演算子を( $ / =&quot;&quot;
を介して)段落モードにすることで機能します。 p>
動作するのは良いことですが、少し壊れやすいです。空の行ではなく空の行で作品が盛り上がりますが、 sed
はそれらをきれいにできます。
同等で簡潔なコマンド:
$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'
他のヒント
Perlの場合:
local $/ = "\n\n";
while (<>) {
print if /^(?:GET|POST)/; # Add more request types as needed
}
注: LiveHTTPHeadersによって生成された出力を見ると、エントリは2つの改行で明確に区切られているため、 $ / =&quot; \ n \ n&quot;
を設定すると思います $ / = ''
を設定するよりも適切です。あなたの問題は、入力ファイルの行が実際にインデントされているためだと思います。
もともと pastebin からファイルをダウンロードし、完全なファイルを使用してスクリプトをテストしました。コンピュータでテストするために使用していたファイルが、 pastebin に置いたファイルと同一であるとは思わない。
LiveHTTPHeadersの出力形式との整合性を保ちながら、インデントされている可能性のある行を堅牢に処理する場合は、次のようなものを使用する必要があります。
#!/usr/bin/perl
use strict; use warnings;
local $/ = "\n\n";
while (<>) {
next unless /^\s*(?:GET|POST)/;
s!^\s+!!gm;
print;
}
同じパイプラインで sed
と perl
を使用すると、少し憎むべきことになると思います。
ただ1つのgawkコマンド
awk -vRS= '/^(GET|POST)/' ORS="\n\n" file
bashシェルを使用できます
while read -r line
do
case "$line" in
GET*|POST*) flag=1;;
"") flag=0;;
esac
[ "$flag" -eq 1 ] && echo "$line"
done < "file"
Sinanのコードを次のように実行します。
perl test.pl < infile.txt > outfile.txt