0

だから私の問題は、Time to live と User-Agent がその順序で発生するパターンを見つけるスクリプトを作成する必要があることです。

例えば:

Time to live: 64
Some other data: ________
...
User-Agent: Mozilla/Chrome/IE:Windows/Unix/Mac

したがって、基本的にデータは TTL、次にユーザー エージェントの順序で表示されます。その情報から、必要なデータを取得できますが、これを識別するためにパターンをどうすればよいかわかりません。それが役立つ場合は、テキスト ファイルとして保存された Wireshark キャプチャからこのデータを取得しています。

Shellter のおかげで、次のようになりました。

egrep '    User-Agent:|    Time to live:' ../*.txt

両方 (TTL と UA) がファイルに含まれているかどうかを調べます。

助けていただければ幸いです。

    Fragment offset: 0
    Time to live: 128
    Protocol: TCP (6)
    Header checksum: 0x7e4d [correct]
        [Good: True]
        [Bad: False]
    Source: 1.1.1.3 (1.1.1.3)
    Destination: 1.1.1.4 (1.1.1.4)

//packet 2      
    Fragment offset: 0
    Time to live: 128
    Protocol: TCP (6)
Hypertext Transfer Protocol
    GET / HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n]
            [Message: GET / HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: GET
        Request URI: /
        Request Version: HTTP/1.1
    Host: mail.yahoo.com\r\n
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0\r\n
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n

返信が遅くなり申し訳ありません、編集をしなければなりませんでした。

したがって、基本的には、TTL のみが発生したとき、TTL が発生し、ユーザー エージェント データが存在するときを特定するだけで済みます。基本的にこれを使用して、ゲートウェイの背後にあるクライアントを識別します。

したがって、TTL が 126 (windows) で 125 と表示された場合、それはゲートウェイの背後にあり、count++ であると想定します。同じカウントを取得しても、ユーザー エージェントが異なり、OS が同じである場合、カウントは変わりません。同じカウントを取得しても、ユーザー エージェントと OS が異なる場合は、count++.

したがって、出力は次のように単純になります。

1 (ttl)
1 (ttl+os)
2 (ttl+os+ua)

上記の例(データではありません)から。

4

1 に答える 1

1

何を報告しようとしているのかはまだ少し不明ですが、これが役立つかもしれません。

そのツールは、この性質の問題を解決するために設計されているため、使用awkします(他の多くの問題の中でも)。

私の出力はあなたの出力と正確には一致しませんが、コードは十分に自己文書化されているので、これで作業して、最終的なニーズに近づけることができると思います. 新しいコード、新しい出力、できれば達成したい出力の正確な例で質問を更新してください。

awk '
        /Time to live/{ttl++}
        /User-Agent/{agent++}
        /Windows|Linux|Solaris/{os++}
        END{print "ttl="ttl; print "os="os; print"agent="agent}
'  ttlTest.txt

出力

ttl=2
os=1
agent=1

理解しておくべき重要なことは、awk (および grep を含むほとんどの Unix ベースの正規表現ユーティリティ) が入力の各行を読み取り、現在のデータ行を出力する (または何か他のことを行う) かどうかを決定することです。

awk通常、次のようなものを指定すると、入力のすべての行が出力されます

awk '{print $1}' file 

この例では、データの各行から最初のフィールドだけを印刷します。

上記のソリューションでは、正規表現を使用してデータをフィルタリングし、action一部のデータが一致したため、 を適用しています。

    /Time to live/{  ttl++ }
    |             |  |     |
    |             |  |     > block end
    |             |  > action (in this case, increment value of ttl var
    |             > block begin
    >/ regex to match / #

したがって、各行をスキャンしている他の 2 つの「正規表現」があり、その正規表現に一致するたびに、関連する変数をインクリメントします。

最後に、すべてのデータがファイルから読み取られた後に実行さawkれるブロックを許可します。ENDこれが、概要レポートの作成方法です。データが読み取られる前に実行されるブロックawkもあります。BEGIN

より複雑なパターンの一致を可能にする awk スキャンの別のイディオムは、次のようになります。

awk '{
      if (   /Time to live/ && User-Agent/ ) {
         ttl_agent++
      }
     }' ttlTest.txt

最初と最後の{ }ブロック定義文字は、データから読み取られる各行にこのロジックが適用されることを示します。このブロックは非常に複雑になる可能性があり、他の変数値を使用してifテスト内で評価することができますif ( var=5 ) { print "found var=5"}

IHTH

于 2013-07-14T18:22:31.913 に答える