awk、perl、またはsedを使用してLiveHTTPHeaders出力から応答を削除するにはどうすればよいですか?

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

  •  06-07-2019
  •  | 
  •  

質問

次のようなものがあるとしましょう(これは単なる例であり、実際のリクエストは異なります。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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top