创建一个找到两个交替模式的脚本

时间:2013-07-14 15:51:00

标签: shell grep wireshark

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

例如:

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(窗口)并且我看到125,我们假设它在网关后面并计算++。 如果我们得到相同的计数,但使用不同的用户代理但操作系统相同,则计数不会改变。 如果我们获得相同的计数但使用不同的用户代理和操作系统,则计算++。

所以输出可以简单如下:

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

来自上面的例子(不是数据)。

1 个答案:

答案 0 :(得分: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 

在这个例子中,只打印每行数据的第一个字段。

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

    /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