私はHTTPヘッダー要求と応答データをタブ区切り形式で各GET/POSTと異なる行に返信しています。このデータは、1つのTCPフローに対して複数のGET、POST、およびREPLYが存在するようなデータです。これらのケースのうち、最初の有効なGET - REPLYペアのみを選択する必要があります。例(簡略化)は:Perlが異なるケース間で有効な行のペアを見つける
ID Source Dest Bytes Type Content-Length host lines....
1 A B 10 GET NA yahoo.com 2
1 A B 10 REPLY 10 NA 2
2 C D 40 GET NA google.com 4
2 C D 40 REPLY 20 NA 4
2 C D 40 GET NA google.com 4
2 C D 40 REPLY 30 NA 4
3 A B 250 POST NA mail.yahoo.com 5
3 A B 250 REPLY NA NA 5
3 A B 250 REPLY 15 NA 5
3 A B 250 GET NA yimg.com 5
3 A B 250 REPLY 35 NA 5
4 G H 415 REPLY 10 NA 6
4 G H 415 POST NA facebook.com 6
4 G H 415 REPLY NA NA 6
4 G H 415 REPLY NA NA 6
4 G H 415 GET NA photos.facebook.com 6
4 G H 415 REPLY 50 NA 6
....
したがって、基本的には、各IDに対して1つのリクエスト - 応答ペアを取得し、それらを新しいファイルに書き込む必要があります。
'1'は単なるペアなので簡単です。 しかし、両方の行がGET、POSTまたはREPLYである偽の場合もあります。したがって、そのような場合は無視されます。
「2」の場合は、最初のGET-REPLYペアを選択します。
'3'の場合、最初のGETを選択しますが、2番目のREPLYはContent-Lengthとして存在しません(サブシーケンスREPLYをより良い候補にします)。
「4」の場合、最初のヘッダーは返信できないため、最初のPOST(またはGET)を選択します。 POST後に内容の長さが欠落していても、2番目のGET後にREPLYを選択することはありません。だから私は最初のREPLYを選択するだけです。
したがって、最適なリクエストと返信のペアを選択した後、それらを1行にペアで設定する必要があります。たとえば、出力は次のようになります。
ID Source Dest Bytes Type Content-Length host ....
1 A B 10 GET 10 yahoo.com
2 C D 40 GET 20 google.com
3 A B 250 POST 15 mail.yahoo.com
4 G H 415 POST NA facebook.com
実際のデータには他に多くのヘッダーがありますが、この例では必要なものがほとんど表示されています。 Perlでこれをどうやって行いますか?私はかなり最初に立ち往生していますので、一度に1行ずつしかファイルを読むことができませんでした。
open F, "<", "file.txt" || die "Cannot open $f: $!";
while (<F>) {
chomp;
my @line = split /\t/;
# get the valid pairs for cases with multiple request - replies
# get the paired up data together
}
close (F);
* 編集:各IDにHTTPヘッダー行の数を追加する列を追加しました。これは、後続の行数を確認するのに役立ちます。また、最初のヘッダー行がREPLYになるようにID '4'を変更しました。 *
+1を生成します。ありがとうございました! –
IDは処理されるラインのグループを識別するのに十分ですか?もしそうなら、ID内で、ソースとデスティネーションが同じであると仮定できますか? –
@ JonathanLefflerはい、これは、同じ送信元と宛先、ポートなどを持つ1つのTCPフローを表しているので十分です。図に示すように、各IDに対して1つの要求 - 応答ペアを作成する必要があります。 – sfactor