0

所以我的问题是我需要制作一个脚本来找到生存时间和用户代理按该顺序发生的模式,然后我增加一个计数(或获取我想要的数据等;它可能会从那里演变。)

例如:

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++ 后面。如果我们得到相同的计数,但使用不同的用户代理但操作系统相同,则计数不会改变。如果我们得到相同的计数但使用不同的用户代理和操作系统,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(以及大多数基于 Unix 的 reg-ex 实用程序,包括 grep)读取每一行输入并决定它是否将打印(或做其他事情)与当前数据行。

awk如果你给它类似的东西,通常会打印每一行输入

awk '{print $1}' file 

在此示例中,仅打印每行数据的第一个字段。

在上面的解决方案中,我们使用正则表达式过滤数据并应用 anaction因为我们匹配了一些数据,即

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

所以我们还有另外两个“正则表达式”,我们正在扫描每一行,每次匹配该正则表达式时,我们都会增加相关变量。

最后,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 回答